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 << ".";
}