Eq remove oversample and antialysing filter

This commit is contained in:
Dave French
2014-12-28 17:07:40 +00:00
parent a485e9127e
commit c203a5de3b
3 changed files with 21 additions and 78 deletions

View File

@@ -42,7 +42,7 @@ EqControls::EqControls( EqEffect *effect ) :
m_highShelfGainModel( 0.0 , -40, 40, 0.001, this, tr( "High Shelf gain" ) ),
m_hpResModel( 0.707,0.003, 10.0 , 0.001, this, tr( "HP res" ) ),
m_lowShelfResModel( 1.4,0.55, 10.0 , 0.001, this , tr( "Low Shelf res" ) ),
m_para1ResModel( 1.4 ,0.55, 10.0 , 0.001, this , tr( "Peak 1 res" ) ),
m_para1ResModel( 1.4, 0.55, 10.0, 0.001, this , tr( "Peak 1 res" ) ),
m_para2ResModel( 1.4, 0.55, 10.0 , 0.001, this , tr( "Peak 2 res" ) ),
m_para3ResModel( 1.4, 0.55, 10.0 , 0.001, this , tr( "Peak 3 res" ) ),
m_para4ResModel( 1.4, 0.55, 10.0 , 0.001, this , tr( "Peak 4 res" ) ),

View File

@@ -51,17 +51,9 @@ Plugin::Descriptor PLUGIN_EXPORT eq_plugin_descriptor =
EqEffect::EqEffect(Model *parent, const Plugin::Descriptor::SubPluginFeatures::Key *key) :
Effect( &eq_plugin_descriptor, parent, key ),
m_eqControls( this ),
m_upBufFrames( 0 )
m_eqControls( this )
{
m_dFilterCount = 2;
m_downsampleFilters = new EqLinkwitzRiley[m_dFilterCount];
for( int i = 0; i < m_dFilterCount; i++)
{
m_downsampleFilters[i].setFrequency(21000);
m_downsampleFilters[i].setSR(Engine::mixer()->processingSampleRate() * 2 );
}
m_upBuf = 0;
}
@@ -69,10 +61,6 @@ EqEffect::EqEffect(Model *parent, const Plugin::Descriptor::SubPluginFeatures::K
EqEffect::~EqEffect()
{
if(m_upBuf)
{
delete m_upBuf;
}
}
@@ -91,7 +79,7 @@ bool EqEffect::processAudioBuffer(sampleFrame *buf, const fpp_t frames)
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
}
const float outGain = m_eqControls.m_outGainModel.value();
const int sampleRate = Engine::mixer()->processingSampleRate() * 2;
const int sampleRate = Engine::mixer()->processingSampleRate();
sampleFrame m_inPeak = { 0, 0 };
if(m_eqControls.m_analyzeModel.value() )
@@ -102,97 +90,92 @@ bool EqEffect::processAudioBuffer(sampleFrame *buf, const fpp_t frames)
{
m_eqControls.m_inFftBands.clear();
}
upsample( buf, frames );
gain(m_upBuf , m_upBufFrames, m_eqControls.m_inGainModel.value(), &m_inPeak );
gain(buf , frames, m_eqControls.m_inGainModel.value(), &m_inPeak );
m_eqControls.m_inPeakL = m_eqControls.m_inPeakL < m_inPeak[0] ? m_inPeak[0] : m_eqControls.m_inPeakL;
m_eqControls.m_inPeakR = m_eqControls.m_inPeakR < m_inPeak[1] ? m_inPeak[1] : m_eqControls.m_inPeakR;
if(m_eqControls.m_hpActiveModel.value() ){
m_hp12.setParameters( sampleRate, m_eqControls.m_hpFeqModel.value(), m_eqControls.m_hpResModel.value(), 1 );
m_hp12.processBuffer( m_upBuf , m_upBufFrames );
m_hp12.processBuffer( buf, frames );
if( m_eqControls.m_hp24Model.value() || m_eqControls.m_hp48Model.value() )
{
m_hp24.setParameters( sampleRate, m_eqControls.m_hpFeqModel.value(), m_eqControls.m_hpResModel.value(), 1 );
m_hp24.processBuffer( m_upBuf , m_upBufFrames );
m_hp24.processBuffer( buf, frames );
}
if( m_eqControls.m_hp48Model.value() )
{
m_hp480.setParameters( sampleRate, m_eqControls.m_hpFeqModel.value(), m_eqControls.m_hpResModel.value(), 1 );
m_hp480.processBuffer( m_upBuf , m_upBufFrames );
m_hp480.processBuffer( buf, frames );
m_hp481.setParameters( sampleRate, m_eqControls.m_hpFeqModel.value(), m_eqControls.m_hpResModel.value(), 1 );
m_hp481.processBuffer( m_upBuf , m_upBufFrames );
m_hp481.processBuffer( buf, frames );
}
}
if( m_eqControls.m_lowShelfActiveModel.value() )
{
m_lowShelf.setParameters( sampleRate, m_eqControls.m_lowShelfFreqModel.value(), m_eqControls.m_lowShelfResModel .value(), m_eqControls.m_lowShelfGainModel.value() );
m_lowShelf.processBuffer( m_upBuf , m_upBufFrames );
m_lowShelf.processBuffer( buf, frames );
}
if( m_eqControls.m_para1ActiveModel.value() )
{
m_para1.setParameters( sampleRate, m_eqControls.m_para1FreqModel.value(), m_eqControls.m_para1ResModel.value(), m_eqControls.m_para1GainModel.value() );
m_para1.processBuffer( m_upBuf , m_upBufFrames );
m_para1.processBuffer( buf, frames );
}
if( m_eqControls.m_para2ActiveModel.value() )
{
m_para2.setParameters( sampleRate, m_eqControls.m_para2FreqModel.value(), m_eqControls.m_para2ResModel.value(), m_eqControls.m_para2GainModel.value() );
m_para2.processBuffer( m_upBuf , m_upBufFrames );
m_para2.processBuffer( buf, frames );
}
if( m_eqControls.m_para3ActiveModel.value() )
{
m_para3.setParameters( sampleRate, m_eqControls.m_para3FreqModel.value(), m_eqControls.m_para3ResModel.value(), m_eqControls.m_para3GainModel.value() );
m_para3.processBuffer( m_upBuf , m_upBufFrames );
m_para3.processBuffer( buf, frames );
}
if( m_eqControls.m_para4ActiveModel.value() )
{
m_para4.setParameters( sampleRate, m_eqControls.m_para4FreqModel.value(), m_eqControls.m_para4ResModel.value(), m_eqControls.m_para4GainModel.value() );
m_para4.processBuffer( m_upBuf , m_upBufFrames );
m_para4.processBuffer( buf, frames );
}
if( m_eqControls.m_highShelfActiveModel.value() )
{
m_highShelf.setParameters( sampleRate, m_eqControls.m_highShelfFreqModel.value(), m_eqControls.m_highShelfResModel.value(), m_eqControls.m_highShelfGainModel.value());
m_highShelf.processBuffer( m_upBuf , m_upBufFrames );
m_highShelf.processBuffer( buf, frames );
}
if(m_eqControls.m_lpActiveModel.value() ){
m_lp12.setParameters( sampleRate, m_eqControls.m_lpFreqModel.value(), m_eqControls.m_lpResModel.value(), 1 );
m_lp12.processBuffer( m_upBuf , m_upBufFrames );
m_lp12.processBuffer( buf, frames );
if( m_eqControls.m_lp24Model.value() || m_eqControls.m_lp48Model.value() )
{
m_lp24.setParameters( sampleRate, m_eqControls.m_lpFreqModel.value(), m_eqControls.m_lpResModel.value(), 1 );
m_lp24.processBuffer( m_upBuf , m_upBufFrames );
m_lp24.processBuffer( buf, frames );
}
if( m_eqControls.m_lp48Model.value() )
{
m_lp480.setParameters( sampleRate, m_eqControls.m_lpFreqModel.value(), m_eqControls.m_lpResModel.value(), 1 );
m_lp480.processBuffer( m_upBuf , m_upBufFrames );
m_lp480.processBuffer( buf, frames );
m_lp481.setParameters( sampleRate, m_eqControls.m_lpFreqModel.value(), m_eqControls.m_lpResModel.value(), 1 );
m_lp481.processBuffer( m_upBuf , m_upBufFrames );
m_lp481.processBuffer( buf, frames );
}
}
sampleFrame outPeak = { 0, 0 };
gain( m_upBuf , m_upBufFrames, outGain, &outPeak );
gain( buf, frames, outGain, &outPeak );
m_eqControls.m_outPeakL = m_eqControls.m_outPeakL < outPeak[0] ? outPeak[0] : m_eqControls.m_outPeakL;
m_eqControls.m_outPeakR = m_eqControls.m_outPeakR < outPeak[1] ? outPeak[1] : m_eqControls.m_outPeakR;
for( int i =0; i < m_dFilterCount; i++)
{
m_downsampleFilters[i].processBuffer(m_upBuf , m_upBufFrames );
}
downSample( buf, frames );
checkGate( outSum / frames );
if(m_eqControls.m_analyzeModel.value() )
{

View File

@@ -84,46 +84,6 @@ private:
EqLp12Filter m_lp24;
EqLp12Filter m_lp480;
EqLp12Filter m_lp481;
EqLinkwitzRiley* m_downsampleFilters;
int m_dFilterCount;
sampleFrame* m_upBuf;
fpp_t m_upBufFrames;
sampleFrame m_lastUpFrame;
inline void upsample( sampleFrame *buf, const fpp_t frames )
{
if( m_upBufFrames != frames * 2 )
{
if( m_upBuf )
{
delete m_upBuf;
}
m_upBuf = new sampleFrame[frames * 2];
m_upBufFrames = frames * 2;
}
for( int f = 0, f2 = 0; f < frames; ++f, f2 += 2 )
{
m_upBuf[f2][0] = linearInterpolate( m_lastUpFrame[0],buf[f][0], 0.5 );
m_upBuf[f2][1] = linearInterpolate( m_lastUpFrame[1],buf[f][1], 0.5 );
m_upBuf[f2+1][0] = buf[f][0];
m_upBuf[f2+1][1] = buf[f][1];
m_lastUpFrame[0] = buf[f][0];
m_lastUpFrame[1] = buf[f][1];
}
}
inline void downSample( sampleFrame *buf, const fpp_t frames )
{
for( int f = 0, f2 = 0; f < frames; ++f, f2 += 2 )
{
buf[f][0] = m_upBuf[f2+1][0];
buf[f][1] = m_upBuf[f2+1][1];
}
}