From 3254981cbeb568adfca7991700e92984e0b92f12 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Thu, 25 Sep 2025 20:40:18 +0200 Subject: Implement basic CombFilter --- src/DSP/CombFilter.cpp | 20 ++++++++++++++++++++ src/DSP/CombFilter.h | 16 ++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/DSP/CombFilter.cpp create mode 100644 src/DSP/CombFilter.h (limited to 'src/DSP') diff --git a/src/DSP/CombFilter.cpp b/src/DSP/CombFilter.cpp new file mode 100644 index 0000000..f7eff21 --- /dev/null +++ b/src/DSP/CombFilter.cpp @@ -0,0 +1,20 @@ +#include "CombFilter.h" + +void CombFilter::prepare(double sampleRate, int samplesPerBlock) { + int maxDelayTimeMs = 100; + int maxDelaySamples = static_cast(sampleRate * maxDelayTimeMs / 1000.0); + + delayBuffer.resize(maxDelaySamples, 0.0f); + delayInSamples = static_cast(sampleRate * 0.02); + delayBufferWritePos = 0; +} + +void CombFilter::process(float* sample) { + int delayBufferLength = (int)delayBuffer.size(); + int delayReadPos = (delayBufferWritePos - delayInSamples + delayBufferLength) % delayBufferLength; + float delayedSample = delayBuffer[delayReadPos]; + float out = *sample + gain * delayedSample; + delayBuffer[delayBufferWritePos] = *sample; + *sample = out; + delayBufferWritePos = (delayBufferWritePos + 1) % delayBufferLength; +} diff --git a/src/DSP/CombFilter.h b/src/DSP/CombFilter.h new file mode 100644 index 0000000..355fbd9 --- /dev/null +++ b/src/DSP/CombFilter.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +class CombFilter { +public: + void prepare(double sampleRate, int samplesPerBlock); + void reset(); + void process(float* sample); + +private: + std::vector delayBuffer; + int delayBufferWritePos = 0; + int delayInSamples = 0; + float gain = 0.7f; +}; -- cgit v1.2.3