Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions build/depends.py
Original file line number Diff line number Diff line change
Expand Up @@ -606,8 +606,10 @@ def sources(self, build):
"engine/enginebufferscale.cpp",
"engine/enginebufferscaledummy.cpp",
"engine/enginebufferscalelinear.cpp",
"engine/enginefilterblock.cpp",
"engine/enginefilterblock.cpp",
"engine/enginefilterbessel4.cpp",
"engine/enginefilterbutterworth4.cpp",
"engine/enginefilterbutterworth8.cpp",
"engine/enginefilter.cpp",
"engine/engineobject.cpp",
"engine/enginepregain.cpp",
Expand All @@ -618,7 +620,6 @@ def sources(self, build):
"engine/enginevinylsoundemu.cpp",
"engine/enginesidechaincompressor.cpp",
"engine/sidechain/enginesidechain.cpp",
"engine/enginefilterbutterworth8.cpp",
"engine/enginexfader.cpp",
"engine/enginemicrophone.cpp",
"engine/enginedeck.cpp",
Expand Down
179 changes: 6 additions & 173 deletions src/engine/enginefilterbessel4.cpp
Original file line number Diff line number Diff line change
@@ -1,201 +1,34 @@

#include "engine/enginefilterbessel4.h"
#include "util/counter.h"
#include "util/math.h"
#define MIXXX
#include "fidlib.h"

EngineFilterBessel4::EngineFilterBessel4(int bufSize)
: m_sampleRate(44100),
m_bufSize(bufSize),
m_doRamping(false){
memset(m_coef, 0, MAX_COEFS * sizeof(double));
initBuffers();
}

void EngineFilterBessel4::initBuffers() {
// Copy the current buffers into the old buffers
memcpy(m_oldBuf1, m_buf1, m_bufSize * sizeof(double));
memcpy(m_oldBuf2, m_buf2, m_bufSize * sizeof(double));
// Set the current buffers to 0
memset(m_buf1, 0, m_bufSize * sizeof(double));
memset(m_buf2, 0, m_bufSize * sizeof(double));
}

EngineFilterBessel4::~EngineFilterBessel4() {
}

inline double _processLowpass(double* coef, double* buf, register double val) {
register double tmp, fir, iir;
tmp = buf[0]; buf[0] = buf[1]; buf[1] = buf[2]; buf[2] = buf[3];
iir = val * coef[0];
iir -= coef[1] * tmp; fir = tmp;
iir -= coef[2] * buf[0]; fir += buf[0] + buf[0];
fir += iir;
tmp = buf[1]; buf[1] = iir; val = fir;
iir = val;
iir -= coef[3] * tmp; fir = tmp;
iir -= coef[4] * buf[2]; fir += buf[2] + buf[2];
fir += iir;
buf[3] = iir; val = fir;
return val;
}

inline double _processBandpass(double* coef, double* buf, register double val) {
register double tmp, fir, iir;
tmp = buf[0]; buf[0] = buf[1]; buf[1] = buf[2]; buf[2] = buf[3];
buf[3] = buf[4]; buf[4] = buf[5]; buf[5] = buf[6]; buf[6] = buf[7];
iir = val * coef[0];
iir -= coef[1] * tmp; fir = tmp;
iir -= coef[2] * buf[0]; fir += -buf[0] - buf[0];
fir += iir;
tmp = buf[1]; buf[1] = iir; val= fir;
iir = val;
iir -= coef[3] * tmp; fir = tmp;
iir -= coef[4] * buf[2]; fir += -buf[2] - buf[2];
fir += iir;
tmp = buf[3]; buf[3] = iir; val= fir;
iir = val;
iir -= coef[5] * tmp; fir = tmp;
iir -= coef[6] * buf[4]; fir += buf[4] + buf[4];
fir += iir;
tmp = buf[5]; buf[5] = iir; val= fir;
iir = val;
iir -= coef[7] * tmp; fir = tmp;
iir -= coef[8] * buf[6]; fir += buf[6] + buf[6];
fir += iir;
buf[7] = iir; val = fir;
return val;
}

inline double _processHighpass(double* coef, double* buf, register double val) {
register double tmp, fir, iir;
tmp = buf[0]; buf[0] = buf[1]; buf[1] = buf[2]; buf[2] = buf[3];
iir= val * coef[0];
iir -= coef[1] * tmp; fir = tmp;
iir -= coef[2] * buf[0]; fir += -buf[0] - buf[0];
fir += iir;
tmp = buf[1]; buf[1] = iir; val = fir;
iir = val;
iir -= coef[3] * tmp; fir = tmp;
iir -= coef[4] * buf[2]; fir += -buf[2] - buf[2];
fir += iir;
buf[3] = iir; val = fir;
return val;
}

EngineFilterBessel4Low::EngineFilterBessel4Low(int sampleRate, double freqCorner1)
: EngineFilterBessel4(4) {
EngineFilterBessel4Low::EngineFilterBessel4Low(int sampleRate, double freqCorner1) {
setFrequencyCorners(sampleRate, freqCorner1);
}

void EngineFilterBessel4Low::setFrequencyCorners(int sampleRate,
double freqCorner1) {
m_sampleRate = sampleRate;
// Copy the old coefficients into m_oldCoef
memcpy(m_oldCoef, m_coef, MAX_COEFS * sizeof(double));
m_coef[0] = fid_design_coef(m_coef + 1, 4, "LpBe4", m_sampleRate,
freqCorner1, 0, 0);
initBuffers();
m_doRamping = true;
setCoefs("LpBe4", sampleRate, freqCorner1);
}

void EngineFilterBessel4Low::process(const CSAMPLE* pIn, CSAMPLE* pOutput,
const int iBufferSize) {
double tmp1, tmp2;
double cross_mix = 0.0;
double cross_inc = 2.0 / static_cast<double>(iBufferSize);
for (int i = 0; i < iBufferSize; i += 2) {
pOutput[i] = _processLowpass(m_coef, m_buf1, pIn[i]);
pOutput[i+1] = _processLowpass(m_coef, m_buf2, pIn[i + 1]);
// Do a linear cross fade between the old samples and the new samples
if (m_doRamping) {
tmp1 = _processLowpass(m_oldCoef, m_oldBuf1, pIn[i]);
tmp2 = _processLowpass(m_oldCoef, m_oldBuf2, pIn[i + 1]);
pOutput[i] = pOutput[i] * cross_mix +
tmp1 * (1.0 - cross_mix);
pOutput[i + 1] = pOutput[i + 1] * cross_mix +
tmp2 * (1.0 - cross_mix);
cross_mix += cross_inc;
}
}
m_doRamping = false;
}

EngineFilterBessel4Band::EngineFilterBessel4Band(int sampleRate, double freqCorner1,
double freqCorner2)
: EngineFilterBessel4(16) {
double freqCorner2) {
setFrequencyCorners(sampleRate, freqCorner1, freqCorner2);
}

void EngineFilterBessel4Band::setFrequencyCorners(int sampleRate,
double freqCorner1,
double freqCorner2) {
m_sampleRate = sampleRate;
// Copy the old coefficients into m_oldCoef
memcpy(m_oldCoef, m_coef, MAX_COEFS * sizeof(double));
m_coef[0] = fid_design_coef(m_coef + 1, 8, "BpBe4", m_sampleRate,
freqCorner1, freqCorner2, 0);
initBuffers();
m_doRamping = true;
setCoefs("BpBe4", sampleRate, freqCorner1, freqCorner2);
}

void EngineFilterBessel4Band::process(const CSAMPLE* pIn, CSAMPLE* pOutput,
const int iBufferSize) {
double tmp1, tmp2;
double cross_mix = 0.0;
double cross_inc = 2.0 / static_cast<double>(iBufferSize);
for (int i = 0; i < iBufferSize; i += 2) {
pOutput[i] = _processBandpass(m_coef, m_buf1, pIn[i]);
pOutput[i+1] = _processBandpass(m_coef, m_buf2, pIn[i+1]);
// Do a linear cross fade between the old samples and the new samples
if (m_doRamping) {
tmp1 = _processBandpass(m_oldCoef, m_oldBuf1, pIn[i]);
tmp2 = _processBandpass(m_oldCoef, m_oldBuf2, pIn[i+1]);
pOutput[i] = pOutput[i] * cross_mix +
tmp1 * (1.0 - cross_mix);
pOutput[i + 1] = pOutput[i + 1] * cross_mix +
tmp2 * (1.0 - cross_mix);
cross_mix += cross_inc;
}
}
m_doRamping = false;
}

EngineFilterBessel4High::EngineFilterBessel4High(int sampleRate, double freqCorner1)
: EngineFilterBessel4(4) {
EngineFilterBessel4High::EngineFilterBessel4High(int sampleRate, double freqCorner1) {
setFrequencyCorners(sampleRate, freqCorner1);
}

void EngineFilterBessel4High::setFrequencyCorners(int sampleRate,
double freqCorner1) {
m_sampleRate = sampleRate;
// Copy the old coefficients into m_oldCoef
memcpy(m_oldCoef, m_coef, MAX_COEFS * sizeof(double));
m_coef[0] = fid_design_coef(m_coef + 1, 4, "HpBe4", m_sampleRate,
freqCorner1, 0, 0);
initBuffers();
m_doRamping = true;
}

void EngineFilterBessel4High::process(const CSAMPLE* pIn, CSAMPLE* pOutput,
const int iBufferSize) {
double tmp1, tmp2;
double cross_mix = 0.0;
double cross_inc = 2.0 / static_cast<double>(iBufferSize);
for (int i = 0; i < iBufferSize; i += 2) {
pOutput[i] = _processHighpass(m_coef, m_buf1, pIn[i]);
pOutput[i+1] = _processHighpass(m_coef, m_buf2, pIn[i+1]);
// Do a linear cross fade between the old samples and the new samples
if (m_doRamping) {
tmp1 = _processHighpass(m_oldCoef, m_oldBuf1, pIn[i]);
tmp2 = _processHighpass(m_oldCoef, m_oldBuf2, pIn[i+1]);
pOutput[i] = pOutput[i] * cross_mix +
tmp1 * (1.0 - cross_mix);
pOutput[i + 1] = pOutput[i + 1] * cross_mix +
tmp2 * (1.0 - cross_mix);
cross_mix += cross_inc;
}
}
m_doRamping = false;
setCoefs("HpBe4", sampleRate, freqCorner1);
}
52 changes: 6 additions & 46 deletions src/engine/enginefilterbessel4.h
Original file line number Diff line number Diff line change
@@ -1,69 +1,29 @@

#ifndef ENGINEFILTERBESSEL4_H
#define ENGINEFILTERBESSEL4_H

#define MAX_COEFS 17
#define MAX_INTERNAL_BUF 16

#include "engine/engineobject.h"
#include "util/types.h"

class EngineFilterBessel4 : public EngineObjectConstIn {
Q_OBJECT
public:
EngineFilterBessel4(int bufSize);
virtual ~EngineFilterBessel4();

void initBuffers();
virtual void process(const CSAMPLE* pIn, CSAMPLE* pOut,
const int iBufferSize) = 0;

protected:
int m_sampleRate;

double m_coef[MAX_COEFS];
// Old coefficients needed for ramping
double m_oldCoef[MAX_COEFS];

int m_bufSize;
// Channel 1 state
double m_buf1[MAX_INTERNAL_BUF];
// Old channel 1 buffer needed for ramping
double m_oldBuf1[MAX_INTERNAL_BUF];

// Channel 2 state
double m_buf2[MAX_INTERNAL_BUF];
// Old channel 2 buffer needed for ramping
double m_oldBuf2[MAX_INTERNAL_BUF];

// Flag set to true if ramping needs to be done
bool m_doRamping;
};
#include "engine/enginefilteriir.h"

class EngineFilterBessel4Low : public EngineFilterBessel4 {
class EngineFilterBessel4Low : public EngineFilterIIR<4, IIR_LP> {
Q_OBJECT
public:
EngineFilterBessel4Low(int sampleRate, double freqCorner1);
void setFrequencyCorners(int sampleRate, double freqCorner1);
void process(const CSAMPLE* pIn, CSAMPLE* pOut, const int iBufferSize);
};

class EngineFilterBessel4Band : public EngineFilterBessel4 {
class EngineFilterBessel4Band : public EngineFilterIIR<8, IIR_BP> {
Q_OBJECT
public:
EngineFilterBessel4Band(int sampleRate, double freqCorner1,
double freqCorner2);
double freqCorner2);
void setFrequencyCorners(int sampleRate, double freqCorner1,
double freqCorner2);
void process(const CSAMPLE* pIn, CSAMPLE* pOut, const int iBufferSize);
double freqCorner2);
};

class EngineFilterBessel4High : public EngineFilterBessel4 {
class EngineFilterBessel4High : public EngineFilterIIR<4, IIR_HP> {
Q_OBJECT
public:
EngineFilterBessel4High(int sampleRate, double freqCorner1);
void setFrequencyCorners(int sampleRate, double freqCorner1);
void process(const CSAMPLE* pIn, CSAMPLE* pOut, const int iBufferSize);
};

#endif // ENGINEFILTERBESSEL4_H
34 changes: 34 additions & 0 deletions src/engine/enginefilterbutterworth4.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "engine/enginefilterbutterworth4.h"


EngineFilterButterworth4Low::EngineFilterButterworth4Low(int sampleRate, double freqCorner1) {
setFrequencyCorners(sampleRate, freqCorner1);
}

void EngineFilterButterworth4Low::setFrequencyCorners(int sampleRate,
double freqCorner1) {
// Copy the old coefficients into m_oldCoef
setCoefs("LpBu4", sampleRate, freqCorner1);
}


EngineFilterButterworth4Band::EngineFilterButterworth4Band(int sampleRate, double freqCorner1,
double freqCorner2) {
setFrequencyCorners(sampleRate, freqCorner1, freqCorner2);
}

void EngineFilterButterworth4Band::setFrequencyCorners(int sampleRate,
double freqCorner1,
double freqCorner2) {
setCoefs("BpBu4", sampleRate, freqCorner1, freqCorner2);
}


EngineFilterButterworth4High::EngineFilterButterworth4High(int sampleRate, double freqCorner1) {
setFrequencyCorners(sampleRate, freqCorner1);
}

void EngineFilterButterworth4High::setFrequencyCorners(int sampleRate,
double freqCorner1) {
setCoefs("HpBu4", sampleRate, freqCorner1);
}
29 changes: 29 additions & 0 deletions src/engine/enginefilterbutterworth4.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#ifndef ENGINEFILTERBUTTERWORTH4_H
#define ENGINEFILTERBUTTERWORTH4_H

#include "engine/enginefilteriir.h"

class EngineFilterButterworth4Low : public EngineFilterIIR<4, IIR_LP> {
Q_OBJECT
public:
EngineFilterButterworth4Low(int sampleRate, double freqCorner1);
void setFrequencyCorners(int sampleRate, double freqCorner1);
};

class EngineFilterButterworth4Band : public EngineFilterIIR<8, IIR_BP> {
Q_OBJECT
public:
EngineFilterButterworth4Band(int sampleRate, double freqCorner1,
double freqCorner2);
void setFrequencyCorners(int sampleRate, double freqCorner1,
double freqCorner2);
};

class EngineFilterButterworth4High : public EngineFilterIIR<4, IIR_HP> {
Q_OBJECT
public:
EngineFilterButterworth4High(int sampleRate, double freqCorner1);
void setFrequencyCorners(int sampleRate, double freqCorner1);
};

#endif // ENGINEFILTERBUTTERWORTH4_H
Loading