diff --git a/src/ITAFilterbankIIR.cpp b/src/ITAFilterbankIIR.cpp index 7aa163afe75e7c1b624b10ea2ae41138fc901a71..7214070802840d3b9ceef51736f4e1ce4fdfd548 100644 --- a/src/ITAFilterbankIIR.cpp +++ b/src/ITAFilterbankIIR.cpp @@ -5,7 +5,9 @@ #include <DspFilters/Dsp.h> -const int iOrder = 16; +const int iOrder = 4; + +typedef Dsp::Filter ITAIIRFilter; class CITAFilterbankIIRImpl : public CITAFilterbankIIR { @@ -14,7 +16,7 @@ public: ~CITAFilterbankIIRImpl(); void Process( const float* pfInputData, float* pfOutputData ); private: - Dsp::Butterworth::BandShelf< iOrder > m_oFilterInstance; + ITAIIRFilter* m_pFilterInstance; float* m_vpfIn[ 1 ]; int m_iBlockLength; }; @@ -25,22 +27,41 @@ CITAFilterbankIIR* CITAFilterbankIIR::Create( const int iBlockLength, const doub } CITAFilterbankIIRImpl::CITAFilterbankIIRImpl( const int iBlockLength, const double dSampleRate ) + : m_pFilterInstance( NULL ) { - float fCenterFrequency = 500.0f; - float fFrequencyWidth = 20.0f; - m_oFilterInstance.setup( iOrder, dSampleRate, fCenterFrequency, fFrequencyWidth, 3.0f ); + //m_pFilterInstance = new Dsp::SmoothedFilterDesign< Dsp::RBJ::Design::BandPass1, 1 >( 1024 ); + //m_pFilterInstance = new Dsp::SmoothedFilterDesign< Dsp::Butterworth::BandPass< iOrder >, 1, Dsp::DirectFormII >( 1024 ); + float fCenterFrequency = 4000.0f; + float fFrequencyWidth = 800.0f; + //m_oFilterInstance.setup( iOrder, dSampleRate, fCenterFrequency, fFrequencyWidth, 3.0f ); + /* + Dsp::Params params; + params[ 0 ] = dSampleRate; // sample rate + params[ 1 ] = iOrder; + params[ 2 ] = 1000.0; + params[ 3 ] = 120.0f; + //m_pFilterInstance->setParams( params ); + */ + + m_pFilterInstance = new Dsp::SmoothedFilterDesign< Dsp::Butterworth::Design::BandPass< iOrder >, 1, Dsp::DirectFormII >( 1024 ); + Dsp::Params params; + params[ 0 ] = 44100; // sample rate + params[ 1 ] = iOrder; // order + params[ 2 ] = fCenterFrequency; // center frequency + params[ 3 ] = fFrequencyWidth; // band width + m_pFilterInstance->setParams( params ); m_iBlockLength = iBlockLength; } CITAFilterbankIIRImpl::~CITAFilterbankIIRImpl() { + delete m_pFilterInstance; } void CITAFilterbankIIRImpl::Process( const float* pfInputData, float* pfOutputData ) { fm_copy( pfOutputData, pfInputData, m_iBlockLength ); m_vpfIn[ 0 ] = pfOutputData; - Dsp::Butterworth::BandShelf::StateType oState; - m_oFilterInstance.process( m_iBlockLength, m_vpfIn, oState ); + m_pFilterInstance->process( m_iBlockLength, m_vpfIn ); } diff --git a/tests/ITADSPFilterbankIIRTest.m b/tests/ITADSPFilterbankIIRTest.m index eca1c80b6d0f638367c3180534ac57a7f08be274..590beed1fb267f5728f58a8dabf27d4619d4d9d1 100644 --- a/tests/ITADSPFilterbankIIRTest.m +++ b/tests/ITADSPFilterbankIIRTest.m @@ -3,8 +3,8 @@ iir_io = ita_merge( ita_read( 'IIR_in.wav' ), ita_read( 'IIR_out.wav' ) ); %% prepare iir_io_io_snipped = ita_time_crop( iir_io, [ 1 512 ], 'samples' ); -iir_io_io_snipped.comment = 'IIR Bessel bandpass 8th order'; +iir_io_io_snipped.comment = 'IIR filterbank test'; iir_io_io_snipped.channelNames = { 'Dirac signal in', 'System response signal after IIR filtering' }; %% plot -iir_io_io_snipped.pf \ No newline at end of file +iir_io_io_snipped.pfp