mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-13 12:12:36 +02:00
Add stand-alone DC blocking filter
This commit is contained in:
parent
c1cd26b473
commit
6f2a84a084
2 changed files with 62 additions and 0 deletions
|
@ -145,6 +145,7 @@ public:
|
|||
int32_t envelope(int32_t attn);
|
||||
|
||||
virtual void process(int16_t* input, int16_t* output, int numFrames) = 0;
|
||||
virtual void removeDC(int16_t* input, int16_t* output, int numFrames) = 0;
|
||||
};
|
||||
|
||||
GateImpl::GateImpl(int sampleRate) {
|
||||
|
@ -412,6 +413,7 @@ public:
|
|||
|
||||
// mono input/output (in-place is allowed)
|
||||
void process(int16_t* input, int16_t* output, int numFrames) override;
|
||||
void removeDC(int16_t* input, int16_t* output, int numFrames) override;
|
||||
};
|
||||
|
||||
template<int N>
|
||||
|
@ -467,6 +469,21 @@ void GateMono<N>::process(int16_t* input, int16_t* output, int numFrames) {
|
|||
processHistogram(numFrames);
|
||||
}
|
||||
|
||||
template<int N>
|
||||
void GateMono<N>::removeDC(int16_t* input, int16_t* output, int numFrames) {
|
||||
|
||||
for (int n = 0; n < numFrames; n++) {
|
||||
|
||||
int32_t x = input[n];
|
||||
|
||||
// remove DC
|
||||
_dc.process(x);
|
||||
|
||||
// store 16-bit output
|
||||
output[n] = (int16_t)saturateQ30(x);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Gate (stereo)
|
||||
//
|
||||
|
@ -482,6 +499,7 @@ public:
|
|||
|
||||
// interleaved stereo input/output (in-place is allowed)
|
||||
void process(int16_t* input, int16_t* output, int numFrames) override;
|
||||
void removeDC(int16_t* input, int16_t* output, int numFrames) override;
|
||||
};
|
||||
|
||||
template<int N>
|
||||
|
@ -540,6 +558,23 @@ void GateStereo<N>::process(int16_t* input, int16_t* output, int numFrames) {
|
|||
processHistogram(numFrames);
|
||||
}
|
||||
|
||||
template<int N>
|
||||
void GateStereo<N>::removeDC(int16_t* input, int16_t* output, int numFrames) {
|
||||
|
||||
for (int n = 0; n < numFrames; n++) {
|
||||
|
||||
int32_t x0 = input[2*n+0];
|
||||
int32_t x1 = input[2*n+1];
|
||||
|
||||
// remove DC
|
||||
_dc.process(x0, x1);
|
||||
|
||||
// store 16-bit output
|
||||
output[2*n+0] = (int16_t)saturateQ30(x0);
|
||||
output[2*n+1] = (int16_t)saturateQ30(x1);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Gate (quad)
|
||||
//
|
||||
|
@ -555,6 +590,7 @@ public:
|
|||
|
||||
// interleaved quad input/output (in-place is allowed)
|
||||
void process(int16_t* input, int16_t* output, int numFrames) override;
|
||||
void removeDC(int16_t* input, int16_t* output, int numFrames) override;
|
||||
};
|
||||
|
||||
template<int N>
|
||||
|
@ -619,6 +655,27 @@ void GateQuad<N>::process(int16_t* input, int16_t* output, int numFrames) {
|
|||
processHistogram(numFrames);
|
||||
}
|
||||
|
||||
template<int N>
|
||||
void GateQuad<N>::removeDC(int16_t* input, int16_t* output, int numFrames) {
|
||||
|
||||
for (int n = 0; n < numFrames; n++) {
|
||||
|
||||
int32_t x0 = input[4*n+0];
|
||||
int32_t x1 = input[4*n+1];
|
||||
int32_t x2 = input[4*n+2];
|
||||
int32_t x3 = input[4*n+3];
|
||||
|
||||
// remove DC
|
||||
_dc.process(x0, x1, x2, x3);
|
||||
|
||||
// store 16-bit output
|
||||
output[4*n+0] = (int16_t)saturateQ30(x0);
|
||||
output[4*n+1] = (int16_t)saturateQ30(x1);
|
||||
output[4*n+2] = (int16_t)saturateQ30(x2);
|
||||
output[4*n+3] = (int16_t)saturateQ30(x3);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Public API
|
||||
//
|
||||
|
@ -677,6 +734,10 @@ void AudioGate::render(int16_t* input, int16_t* output, int numFrames) {
|
|||
_impl->process(input, output, numFrames);
|
||||
}
|
||||
|
||||
void AudioGate::removeDC(int16_t* input, int16_t* output, int numFrames) {
|
||||
_impl->removeDC(input, output, numFrames);
|
||||
}
|
||||
|
||||
void AudioGate::setThreshold(float threshold) {
|
||||
_impl->setThreshold(threshold);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ public:
|
|||
|
||||
// interleaved int16_t input/output (in-place is allowed)
|
||||
void render(int16_t* input, int16_t* output, int numFrames);
|
||||
void removeDC(int16_t* input, int16_t* output, int numFrames);
|
||||
|
||||
void setThreshold(float threshold);
|
||||
void setRelease(float release);
|
||||
|
|
Loading…
Reference in a new issue