|  | #pragma once
#include "dsp/common.hpp"
namespace rack {
namespace dsp {
struct RCFilter {
	float c = 0.f;
	float xstate[1] = {};
	float ystate[1] = {};
	// `r` is the ratio between the cutoff frequency and sample rate, i.e. r = f_c / f_s
	void setCutoff(float r) {
		c = 2.f / r;
	}
	void process(float x) {
		float y = (x + xstate[0] - ystate[0] * (1 - c)) / (1 + c);
		xstate[0] = x;
		ystate[0] = y;
	}
	float lowpass() {
		return ystate[0];
	}
	float highpass() {
		return xstate[0] - ystate[0];
	}
};
struct PeakFilter {
	float state = 0.f;
	float c = 0.f;
	/** Rate is lambda / sampleRate */
	void setRate(float r) {
		c = 1.f - r;
	}
	void process(float x) {
		if (x > state)
			state = x;
		state *= c;
	}
	float peak() {
		return state;
	}
};
struct SlewLimiter {
	float rise = 1.f;
	float fall = 1.f;
	float out = 0.f;
	void setRiseFall(float rise, float fall) {
		this->rise = rise;
		this->fall = fall;
	}
	float process(float in) {
		out = math::clamp(in, out - fall, out + rise);
		return out;
	}
};
/** Applies exponential smoothing to a signal with the ODE
dy/dt = x * lambda
*/
struct ExponentialFilter {
	float out = 0.f;
	float lambda = 1.f;
	float process(float in) {
		float y = out + (in - out) * lambda;
		// If no change was detected, assume float granularity is too small and snap output to input
		if (out == y)
			out = in;
		else
			out = y;
		return out;
	}
};
} // namespace dsp
} // namespace rack
 |