diff --git a/include/ITAFilterbankIIR.h b/include/ITAFilterbankIIR.h index 7ad2326f7f8215ae3ad72f6cfb0ab073029818ef..8d13d7fbde25cb25b4ca503b7c71c4077a867d56 100644 --- a/include/ITAFilterbankIIR.h +++ b/include/ITAFilterbankIIR.h @@ -33,7 +33,11 @@ public: virtual inline ~CITAFilterbankIIR() {}; //! Factory method - static CITAFilterbankIIR* Create(); + /** + * @param[in] iBlockLength Processing block length + * @param[in] dSampleRate Processing sampling rate + */ + static CITAFilterbankIIR* Create( const int iBlockLength, const double dSampleRate ); //! Filter samples, simple variant without any gain (factor) /** @@ -44,7 +48,7 @@ public: * * @note Input and output samples must have same length */ - virtual void Process( const float* pfInputData, float* pfOutputData, const int iNumSamples ) = 0; + virtual void Process( const float* pfInputData, float* pfOutputData ) = 0; private: CITAFilterbankIIRImpl* m_pImpl; //!< DSP filter instance diff --git a/src/ITAFilterbankIIR.cpp b/src/ITAFilterbankIIR.cpp index c2c6aec5888809f185fb9d750790e3198c5d21a4..11caadfed9b3da87c0c520b3b582a559b21a4589 100644 --- a/src/ITAFilterbankIIR.cpp +++ b/src/ITAFilterbankIIR.cpp @@ -1,39 +1,45 @@ #include <ITAFilterbankIIR.h> #include <ITAException.h> +#include <ITASampleBuffer.h> +#include <ITAFastMath.h> #include <DspFilters/Dsp.h> class CITAFilterbankIIRImpl : public CITAFilterbankIIR { public: - CITAFilterbankIIRImpl(); + CITAFilterbankIIRImpl( const int iBlockLength, const double dSampleRate ); ~CITAFilterbankIIRImpl(); - void Process( const float* pfInputData, float* pfOutputData, const int iNumSamples ); + void Process( const float* pfInputData, float* pfOutputData ); private: - Dsp::SimpleFilter< Dsp::ChebyshevI::BandStop < 3 >, 2 > m_oFilterInstance; + Dsp::SimpleFilter< Dsp::ChebyshevI::BandStop< 8 >, 1 > m_oFilterInstance; + float* m_vpfIn[ 1 ]; + int m_iBlockLength; }; -CITAFilterbankIIR* CITAFilterbankIIR::Create() +CITAFilterbankIIR* CITAFilterbankIIR::Create( const int iBlockLength, const double dSampleRate ) { - return new CITAFilterbankIIRImpl(); + return new CITAFilterbankIIRImpl( iBlockLength, dSampleRate ); } -CITAFilterbankIIRImpl::CITAFilterbankIIRImpl() +CITAFilterbankIIRImpl::CITAFilterbankIIRImpl( const int iBlockLength, const double dSampleRate ) { - m_oFilterInstance.setup( 3, // order - 44100,// sample rate - 4000, // center frequency - 880, // band width - 1 ); // ripple dB + m_oFilterInstance.setup( 8, // order + dSampleRate,// sample rate + 900, // center frequency + 200, // band width + 3 ); // ripple dB + + m_iBlockLength = iBlockLength; } CITAFilterbankIIRImpl::~CITAFilterbankIIRImpl() { } -void CITAFilterbankIIRImpl::Process( const float* pfInputData, float* pfOutputData, const int iNumSamples ) +void CITAFilterbankIIRImpl::Process( const float* pfInputData, float* pfOutputData ) { - float* vpfIn[ 1 ]; - vpfIn[ 0 ] = ( float* ) pfInputData; - m_oFilterInstance.process( iNumSamples, vpfIn ); + fm_copy( pfOutputData, pfInputData, m_iBlockLength ); + m_vpfIn[ 0 ] = pfOutputData; + m_oFilterInstance.process( m_iBlockLength, m_vpfIn ); } diff --git a/tests/ITADSPFilterbankIIRTest.cpp b/tests/ITADSPFilterbankIIRTest.cpp index 478e2384bf7f79f9b1e5f78b161d811e9814d72f..325d95ff64a9b5b7d1e46deb759477ff5d7f29a6 100644 --- a/tests/ITADSPFilterbankIIRTest.cpp +++ b/tests/ITADSPFilterbankIIRTest.cpp @@ -34,8 +34,8 @@ using namespace std; const double g_dSampleRate = 44100; const int g_iBlockLength = 128; -const int uiNumberOfFrames = 100; -const std::string sInFilePath = ""; +const int uiNumberOfFrames = 10; +const std::string sInFilePath = "IIR_in.wav"; const std::string sOutFilePath = "IIR_out.wav"; void TestFilterbankIIR(); @@ -48,9 +48,9 @@ int main( int, char** ) void TestFilterbankIIR() { - ITAStreamFunctionGenerator sinesignal( 1, g_dSampleRate, g_iBlockLength, ITAStreamFunctionGenerator::SINE, 500.0f, 0.9f, true ); + ITAStreamFunctionGenerator input_signal( 1, g_dSampleRate, g_iBlockLength, ITAStreamFunctionGenerator::DIRAC, 0.0f, 1.0f , false ); - CITAFilterbankIIR* pFilterbank = CITAFilterbankIIR::Create(); + CITAFilterbankIIR* pFilterbank = CITAFilterbankIIR::Create( g_iBlockLength, g_dSampleRate ); ITAAudiofileProperties props_in; props_in.iChannels = 1; @@ -75,8 +75,8 @@ void TestFilterbankIIR() while( n < uiNumberOfFrames ) { // Add new samples - psbInput->write( sinesignal.GetBlockPointer( 0, &oState ), g_iBlockLength ); - pFilterbank->Process( psbInput->GetData(), (*psfOutput)[0].GetData(), g_iBlockLength ); + psbInput->write( input_signal.GetBlockPointer( 0, &oState ), g_iBlockLength ); + pFilterbank->Process( psbInput->GetData(), (*psfOutput)[0].GetData() ); std::vector< float* > pIn; pIn.push_back( psbInput->data() ); @@ -84,9 +84,10 @@ void TestFilterbankIIR() writer_out->write( psfOutput, g_iBlockLength ); n++; - sinesignal.IncrementBlockPointer(); + input_signal.IncrementBlockPointer(); - if( n % ( uiNumberOfFrames / 40 ) == 0 ) + int x = uiNumberOfFrames / 40; + if( x != 0 && n % ( x ) == 0 ) cout << "."; }