00001
00002
00021 #include <stdio.h>
00022 #include <cassert>
00023 #include "xfft.h"
00024 #include "uti.h"
00025 #include "xalloc.h"
00026 #include "cbuffer.h"
00027
00028
00029
00397 class vad
00398 {
00399
00400
00401 public:
00403
00404 struct vad_config
00405 {
00406 public:
00407
00410
00411 DOUBLE SNR0;
00412 DOUBLE SNR1;
00413 INT ActWindowLen;
00414 FLOAT Nalfa;
00415 FLOAT SNRalfa;
00416
00417
00420
00421 INT LTWindowLen;
00422 DOUBLE gamma0;
00423 DOUBLE gamma1;
00424 INT Handover;
00425 DOUBLE offset;
00426
00427
00428
00429 public:
00430
00432
00436 inline
00437 vad_config()
00438 {
00439 SNR0 = 10.0;
00440 SNR1 = 80.0;
00441 ActWindowLen = 6;
00442 Nalfa = 0.99;
00443 SNRalfa = 0.99;
00444 LTWindowLen = 13;
00445 gamma0 = 15.0;
00446 gamma1 = 40.0;
00447 Handover = 0;
00448 offset = 0.0;
00449 }
00450 };
00451
00452 public:
00454
00458 inline
00459 vad()
00460 : m_fftObject(NULL), m_NoiseFFT(NULL), m_NoiseFFTAct(NULL), m_LTSE(NULL)
00461
00462 { }
00464
00467 inline
00468 vad (const vad_config & cfg, DOUBLE snr, FLOAT FrameLen, XFFT_WIN WinType)
00469 : m_fftObject(NULL), m_NoiseFFT(NULL), m_NoiseFFTAct(NULL), m_LTSE(NULL)
00470
00471 { Reset(cfg, FrameLen, WinType); }
00472
00474
00478 inline
00479 vad (const vad_config & cfg, DOUBLE snr, FLOAT FrameLen)
00480 : m_fftObject(NULL), m_NoiseFFT(NULL), m_NoiseFFTAct(NULL), m_LTSE(NULL)
00481
00482 { Reset(cfg, snr, FrameLen); }
00483
00485 inline
00486 ~vad()
00487 { Destruct(); }
00488
00490 bool
00491 Reset (const vad_config & cfg, DOUBLE snr, FLOAT FrameLen, XFFT_WIN WinType = XFFT_WIN_HAMM);
00492
00494 void
00495 NoiseInit (pDOUBLE frame);
00496
00497
00499 bool
00500 doVAD (pDOUBLE frame);
00501
00502
00508
00509
00511 inline
00512 LONG
00513 getFrameLen () const
00514 { return m_FrameLen; }
00515
00517
00523 inline
00524 INT
00525 getNfft () const
00526 { return m_Nfft; }
00527
00528
00530 inline
00531 INT
00532 getLTWindowLen () const
00533 { return m_LTWindowLen; }
00534
00536
00540 inline
00541 bool
00542 IsBufferFull () const
00543 { return (m_bufferedFrames >= (m_LTWindowLen-1)/2); }
00544
00546 inline
00547 DOUBLE
00548 getNoisePow () const
00549 { return m_NoisePow; }
00550
00551 inline
00552 void
00553 setNoisePow (DOUBLE np)
00554 { m_NoisePow = np; }
00555
00557 inline
00558 DOUBLE
00559 getSignalPow () const
00560 { return m_SignalPow; }
00561
00562 inline
00563 void
00564 setSignalPow (DOUBLE sp)
00565 { m_SignalPow = sp; }
00566
00568 inline
00569 DOUBLE
00570 getSNR () const
00571 { return m_SNR; }
00572
00577 inline
00578 void
00579 setSNR (DOUBLE snr)
00580 { m_SNR = snr; }
00581
00583 inline
00584 DOUBLE
00585 getSNR0 () const
00586 { return m_SNR0; }
00587
00588 inline
00589 void
00590 setSNR0 (DOUBLE snr0)
00591 { m_SNR0 = snr0; }
00592
00594 inline
00595 DOUBLE
00596 getSNR1 () const
00597 { return m_SNR1; }
00598
00599 inline
00600 void
00601 setSNR1 (DOUBLE snr1)
00602 { m_SNR1 = snr1; }
00603
00605 inline
00606 DOUBLE
00607 getGamma0 () const
00608 { return m_gamma0; }
00609
00610 inline
00611 void
00612 setGamma0 (DOUBLE gamma0)
00613 { m_gamma0 = gamma0; }
00614
00616 inline
00617 DOUBLE
00618 getGamma1 () const
00619 { return m_gamma1; }
00620
00621 inline
00622 void
00623 setGamma1 (DOUBLE gamma1)
00624 { m_gamma1 = gamma1; }
00625
00627 inline
00628 INT
00629 getActWindowLen () const
00630 { return m_ActWindowLen; }
00631
00632 inline
00633 void
00634 setActWindowLen (INT ActWindowLen)
00635 { assert ((m_LTWindowLen-1/2) >= ActWindowLen);
00636 m_ActWindowLen = ActWindowLen; }
00637
00639 inline
00640 FLOAT
00641 getNalfa () const
00642 { return m_Nalfa; }
00643
00644 inline
00645 void
00646 setNalfa (FLOAT Nalfa)
00647 { m_Nalfa = Nalfa; }
00648
00650 inline
00651 FLOAT
00652 getSNRalfa () const
00653 { return m_SNRalfa; }
00654
00655 inline
00656 void
00657 setSNRalfa (FLOAT SNRalfa)
00658 { m_SNRalfa = SNRalfa; }
00659
00661 inline
00662 DOUBLE
00663 getOffset () const
00664 { return m_offset; }
00665
00666 inline
00667 void
00668 setOffset (DOUBLE offset)
00669 { m_offset = offset; }
00670
00672 inline
00673 INT
00674 getHandover () const
00675 { return m_Handover; }
00676
00677 inline
00678 void
00679 setHandover (INT Handover)
00680 { m_Handover = Handover; }
00681
00682
00683
00684
00685
00686
00687 protected:
00688
00690 void
00691 Destruct();
00692
00694 DOUBLE
00695 Gamma() const;
00696
00698 void
00699 ActualizeSignal();
00700
00702 void
00703 ActualizeNoise();
00704
00706 void
00707 AddToBuffer (pDOUBLE frame);
00708
00710 void
00711 LTSE ();
00712
00714 DOUBLE
00715 LTSD () const;
00716
00717
00718 protected:
00719
00722
00723 LONG m_FrameLen;
00724 XFFT_WIN m_WinType;
00725 pRFFT m_fftObject;
00726 INT m_Nfft;
00727 buffer2D m_memFFT;
00728
00729 INT m_bufferedFrames;
00730
00731
00734
00735 pDOUBLE m_NoiseFFT;
00736 INT m_NoiseInitFrames;
00737 DOUBLE m_NoisePow;
00738 DOUBLE m_SignalPow;
00739 DOUBLE m_SNR;
00740 DOUBLE m_SNR0;
00741 DOUBLE m_SNR1;
00742 INT m_ActWindowLen;
00743 FLOAT m_Nalfa;
00744 FLOAT m_SNRalfa;
00745 pDOUBLE m_NoiseFFTAct;
00746
00747
00748
00751
00752 INT m_LTWindowLen;
00753 DOUBLE m_gamma0;
00754 DOUBLE m_gamma1;
00755 INT m_Handover;
00756 LONG m_NumSil;
00757 LONG m_NumVoice;
00758 LONG m_HoSil;
00759 DOUBLE m_offset;
00760
00761 pDOUBLE m_LTSE;
00762
00763
00764
00765 };
00766