diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/DSP/AllPassFilter.cpp | 24 | ||||
| -rw-r--r-- | src/DSP/AllPassFilter.h | 16 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/DSP/AllPassFilter.cpp b/src/DSP/AllPassFilter.cpp new file mode 100644 index 0000000..e90bff7 --- /dev/null +++ b/src/DSP/AllPassFilter.cpp @@ -0,0 +1,24 @@ +#include "AllPassFilter.h" + +void AllPassFilter::prepare(double sampleRate, int samplesPerBlock) { + int maxDelayTimeMs = 100; + int maxDelaySamples = static_cast<int>(sampleRate * maxDelayTimeMs / 1000.0); + + delayBuffer.resize(maxDelaySamples, 0.0f); + delayInSamples = static_cast<int>(sampleRate * 0.02); + delayBufferWritePos = 0; +} + +void AllPassFilter::process(float* sample) { + int delayBufferLength = (int)delayBuffer.size(); + int delayReadPos = + (delayBufferWritePos - delayInSamples + delayBufferLength) % + delayBufferLength; + float xn = *sample; + float delayedSample = delayBuffer[delayReadPos]; + float yn = -gain * xn + delayedSample; + + delayBuffer[delayBufferWritePos] = xn + gain * yn; + *sample = yn; + delayBufferWritePos = (delayBufferWritePos + 1) % delayBufferLength; +} diff --git a/src/DSP/AllPassFilter.h b/src/DSP/AllPassFilter.h new file mode 100644 index 0000000..be35129 --- /dev/null +++ b/src/DSP/AllPassFilter.h @@ -0,0 +1,16 @@ +#pragma once + +#include <juce_audio_processors/juce_audio_processors.h> + +class AllPassFilter { +public: + void prepare(double sampleRate, int samplesPerBlock); + void reset(); + void process(float *sample); + +private: + std::vector<float> delayBuffer; + int delayBufferWritePos = 0; + int delayInSamples = 0; + float gain = 0.7f; +}; |
