RADLib
RADical C++ application framework
RADDsp.h
Go to the documentation of this file.
1 #ifndef RADDSP_H
2 #define RADDSP_H
3 
9 #pragma once
10 
11 #include <RADCore/RADLicenseGate.h>
12 
13 #include <array>
14 #include <cstddef>
15 #include <cstdint>
16 #include <initializer_list>
17 #include <vector>
18 
19 namespace RADDsp {
20 
22  struct ComplexSample {
24  float i = 0.0f;
26  float q = 0.0f;
27  };
28 
30  class FftPlan {
31  public:
33  FftPlan() = default;
35  explicit FftPlan(size_t size);
36 
38  bool reset(size_t size);
40  size_t size() const;
42  bool valid() const;
43 
45  bool transformInPlace(std::vector<ComplexSample>& samples, bool inverse = false) const;
47  bool transform(const std::vector<ComplexSample>& input, std::vector<ComplexSample>& output,
48  bool inverse = false) const;
50  std::vector<ComplexSample> transform(const std::vector<ComplexSample>& input,
51  bool inverse = false) const;
53  bool transformManyInPlace(std::vector<std::vector<ComplexSample>>& frames,
54  bool inverse = false) const;
56  bool transformMany(const std::vector<std::vector<ComplexSample>>& inputs,
57  std::vector<std::vector<ComplexSample>>& outputs, bool inverse = false) const;
59  std::vector<std::vector<ComplexSample>> transformMany(
60  const std::vector<std::vector<ComplexSample>>& inputs, bool inverse = false) const;
62  bool transformFramesInPlace(std::vector<ComplexSample>& frames, size_t frameCount,
63  bool inverse = false) const;
65  bool transformFrames(const std::vector<ComplexSample>& input, size_t frameCount,
66  std::vector<ComplexSample>& output, bool inverse = false) const;
68  std::vector<ComplexSample> transformFrames(const std::vector<ComplexSample>& input,
69  size_t frameCount, bool inverse = false) const;
70 
71  private:
72  size_t size_ = 0;
73  std::vector<size_t> bitReverse_;
74  std::vector<ComplexSample> twiddlesForward_;
75  std::vector<ComplexSample> twiddlesInverse_;
76  };
77 
79  class MatrixF {
80  public:
82  MatrixF() = default;
84  MatrixF(size_t rows, size_t columns, float value = 0.0f);
86  MatrixF(size_t rows, size_t columns, const std::vector<float>& rowMajor);
87 
89  size_t rows() const;
91  size_t columns() const;
93  bool empty() const;
95  const std::vector<float>& data() const;
97  std::vector<float>& data();
99  void resize(size_t rows, size_t columns, float value = 0.0f);
101  float& operator()(size_t row, size_t column);
103  float operator()(size_t row, size_t column) const;
105  float get(size_t row, size_t column) const;
107  bool set(size_t row, size_t column, float value);
108 
109  private:
110  size_t rows_ = 0;
111  size_t columns_ = 0;
112  std::vector<float> data_;
113  };
114 
118  float b0 = 1.0f;
120  float b1 = 0.0f;
122  float b2 = 0.0f;
124  float a1 = 0.0f;
126  float a2 = 0.0f;
127  };
128 
130  struct BiquadState {
132  float x1 = 0.0f;
134  float x2 = 0.0f;
136  float y1 = 0.0f;
138  float y2 = 0.0f;
139 
141  void reset();
143  float process(float input, const BiquadCoefficients& coeffs);
144  };
145 
147  struct EqualizerBand {
149  float frequencyHz = 1000.0f;
151  float gainDb = 0.0f;
153  float q = 1.0f;
154  };
155 
158  public:
160  void setSections(std::vector<BiquadCoefficients> sections);
164  void clear();
166  void reset();
168  const std::vector<BiquadCoefficients>& sections() const;
170  float processSample(float input);
172  std::vector<float> process(const std::vector<float>& samples);
173 
174  private:
175  std::vector<BiquadCoefficients> sections_;
176  std::vector<BiquadState> states_;
177  };
178 
181  public:
183  explicit Equalizer16Band(uint32_t sampleRate = 48000);
185  void setSampleRate(uint32_t sampleRate);
187  uint32_t sampleRate() const;
189  const std::array<EqualizerBand, 16>& bands() const;
191  bool setBand(size_t index, float frequencyHz, float gainDb, float q = 1.0f);
193  bool setBandGain(size_t index, float gainDb);
195  float bandGain(size_t index) const;
197  void reset();
199  std::vector<float> process(const std::vector<float>& samples);
200 
201  private:
202  void rebuild();
203 
204  uint32_t sampleRate_ = 48000;
205  std::array<EqualizerBand, 16> bands_{};
206  BiquadCascade cascade_;
207  };
208 
210  struct StereoFrame {
212  float left = 0.0f;
214  float right = 0.0f;
215  };
216 
218  struct DelaySettings {
220  uint32_t sampleRate = 48000;
222  float delayMs = 250.0f;
224  float feedback = 0.25f;
226  float wet = 0.35f;
228  float dry = 1.0f;
230  float crossFeedback = 0.0f;
232  float maxDelayMs = 2000.0f;
233  };
234 
236  class DigitalDelay {
237  public:
239  explicit DigitalDelay(uint32_t sampleRate = 48000, float maxDelayMs = 2000.0f);
243  const DelaySettings& settings() const;
245  void setSampleRate(uint32_t sampleRate);
247  void reset();
251  std::vector<float> processInterleavedStereo(const std::vector<float>& interleaved);
252 
253  private:
254  float readDelay(const std::vector<float>& buffer, float delaySamples) const;
255  void resizeBuffer();
256 
257  DelaySettings settings_{};
258  std::vector<float> bufferL_;
259  std::vector<float> bufferR_;
260  size_t writeIndex_ = 0;
261  };
262 
266  float modulationRateHz = 0.35f;
268  float modulationDepthMs = 3.0f;
270  float tone = 0.35f;
272  float drive = 0.15f;
274  float stereoPhase = 0.25f;
275  };
276 
279  public:
281  explicit AnalogModDelay(uint32_t sampleRate = 48000, float maxDelayMs = 2000.0f);
287  void setSampleRate(uint32_t sampleRate);
289  void reset();
293  std::vector<float> processInterleavedStereo(const std::vector<float>& interleaved);
294 
295  private:
296  float readDelay(const std::vector<float>& buffer, float delaySamples) const;
297  void resizeBuffer();
298 
299  AnalogDelaySettings settings_{};
300  std::vector<float> bufferL_;
301  std::vector<float> bufferR_;
302  size_t writeIndex_ = 0;
303  float toneStateL_ = 0.0f;
304  float toneStateR_ = 0.0f;
305  float lfoPhase_ = 0.0f;
306  };
307 
309  void applyGain(std::vector<float>& samples, float gain);
311  std::vector<float> mix(const std::vector<float>& a, const std::vector<float>& b);
313  float peak(const std::vector<float>& samples);
315  float rms(const std::vector<float>& samples);
317  void normalizePeak(std::vector<float>& samples, float targetPeak = 1.0f);
318 
320  std::vector<float> sine(float frequencyHz, float seconds, uint32_t sampleRate, float amplitude = 1.0f);
322  std::vector<float> whiteNoise(size_t count, float amplitude = 1.0f, uint32_t seed = 0x524144u);
323 
325  std::vector<float> linearResample(const std::vector<float>& interleaved, uint16_t channels,
326  uint32_t sourceRate, uint32_t targetRate);
328  std::vector<std::vector<float>> deinterleave(const std::vector<float>& interleaved, uint16_t channels);
330  std::vector<float> interleave(const std::vector<std::vector<float>>& channels);
332  std::vector<float> magnitude(const std::vector<ComplexSample>& samples);
334  std::vector<float> phase(const std::vector<ComplexSample>& samples);
336  void applyGain(std::vector<ComplexSample>& samples, float gain);
338  std::vector<ComplexSample> frequencyShift(const std::vector<ComplexSample>& samples,
339  float frequencyHz, uint32_t sampleRate);
340 
342  std::vector<float> hannWindow(size_t count);
344  std::vector<float> hammingWindow(size_t count);
346  std::vector<float> blackmanWindow(size_t count);
348  std::vector<float> rectangularWindow(size_t count);
350  void applyWindow(std::vector<float>& samples, const std::vector<float>& window);
352  std::vector<float> firFilter(const std::vector<float>& samples, const std::vector<float>& taps);
354  std::vector<float> convolve(const std::vector<float>& a, const std::vector<float>& b);
356  std::vector<float> crossCorrelate(const std::vector<float>& a, const std::vector<float>& b);
358  std::vector<float> normalizedCrossCorrelate(const std::vector<float>& a, const std::vector<float>& b);
360  std::vector<float> onePoleLowPass(const std::vector<float>& samples, float alpha);
362  FftPlan createFftPlan(size_t size);
364  std::vector<ComplexSample> fft(const std::vector<ComplexSample>& samples, bool inverse = false);
366  std::vector<std::vector<ComplexSample>> fftMany(
367  const std::vector<std::vector<ComplexSample>>& frames, bool inverse = false);
369  std::vector<ComplexSample> fftFrames(const std::vector<ComplexSample>& frames,
370  size_t frameSize, bool inverse = false);
372  std::vector<float> magnitudeSpectrum(const std::vector<ComplexSample>& spectrum);
374  std::vector<float> powerSpectrum(const std::vector<ComplexSample>& spectrum);
376  std::vector<float> designLowPassFIR(size_t taps, float cutoffHz, uint32_t sampleRate);
378  BiquadCoefficients designBiquadLowPass(float cutoffHz, uint32_t sampleRate, float q = 0.70710678f);
380  BiquadCoefficients designBiquadHighPass(float cutoffHz, uint32_t sampleRate, float q = 0.70710678f);
382  BiquadCoefficients designBiquadBandPass(float centerHz, uint32_t sampleRate, float q = 1.0f);
384  BiquadCoefficients designBiquadNotch(float centerHz, uint32_t sampleRate, float q = 1.0f);
386  BiquadCoefficients designBiquadPeakingEQ(float centerHz, uint32_t sampleRate, float gainDb, float q = 1.0f);
388  std::vector<float> decimate(const std::vector<float>& samples, size_t factor);
390  std::vector<float> interpolateZeros(const std::vector<float>& samples, size_t factor);
392  std::vector<float> mixCosine(const std::vector<float>& samples, float frequencyHz, uint32_t sampleRate);
394  void automaticGainControl(std::vector<float>& samples, float targetRms = 0.25f, float maxGain = 32.0f);
395 
397  MatrixF identityMatrix(size_t size);
399  MatrixF diagonalMatrix(const std::vector<float>& diagonal);
401  MatrixF transpose(const MatrixF& matrix);
403  MatrixF add(const MatrixF& a, const MatrixF& b);
405  MatrixF subtract(const MatrixF& a, const MatrixF& b);
407  MatrixF scale(const MatrixF& matrix, float scalar);
409  MatrixF hadamard(const MatrixF& a, const MatrixF& b);
411  MatrixF multiply(const MatrixF& a, const MatrixF& b);
413  std::vector<float> multiply(const MatrixF& matrix, const std::vector<float>& vector);
415  std::vector<float> multiply(const MatrixF& matrix, std::initializer_list<float> vector);
417  float dot(const std::vector<float>& a, const std::vector<float>& b);
419  float l2Norm(const std::vector<float>& vector);
421  std::vector<float> normalizeVector(const std::vector<float>& vector);
423  MatrixF outerProduct(const std::vector<float>& a, const std::vector<float>& b);
425  MatrixF covarianceMatrix(const MatrixF& observations);
427  bool invert(const MatrixF& matrix, MatrixF& inverse, float epsilon = 1.0e-6f);
429  bool solveLinearSystem(const MatrixF& matrix, const std::vector<float>& rhs,
430  std::vector<float>& solution, float epsilon = 1.0e-6f);
431 
432 } // namespace RADDsp
433 
434 #endif
Stereo modulated delay with low-pass feedback and soft saturation.
Definition: RADDsp.h:278
void reset()
Clears delay memory, feedback filters, and LFO phase.
void configure(const AnalogDelaySettings &settings)
Applies sanitized settings and resizes backing storage when needed.
std::vector< float > processInterleavedStereo(const std::vector< float > &interleaved)
Processes interleaved stereo samples. Odd trailing samples are ignored.
AnalogModDelay(uint32_t sampleRate=48000, float maxDelayMs=2000.0f)
Creates an analog-style delay with sampleRate and maxDelayMs backing storage.
void setSampleRate(uint32_t sampleRate)
Updates sample rate while preserving timing settings.
StereoFrame processSample(StereoFrame input)
Processes one stereo frame.
const AnalogDelaySettings & settings() const
Returns the active sanitized settings.
Stateful cascade of biquad sections.
Definition: RADDsp.h:157
float processSample(float input)
Processes one sample through all sections.
void reset()
Resets all section states.
std::vector< float > process(const std::vector< float > &samples)
Processes a block through all sections and updates states.
void addSection(BiquadCoefficients section)
Appends one section and creates matching state.
void clear()
Removes all sections and states.
const std::vector< BiquadCoefficients > & sections() const
Returns current section coefficients.
void setSections(std::vector< BiquadCoefficients > sections)
Replaces all sections and resets section states.
Clean stereo delay with fractional delay reads and optional cross-feedback.
Definition: RADDsp.h:236
void configure(const DelaySettings &settings)
Applies sanitized settings and resizes backing storage when needed.
void setSampleRate(uint32_t sampleRate)
Updates sample rate while preserving timing settings.
const DelaySettings & settings() const
Returns the active sanitized settings.
DigitalDelay(uint32_t sampleRate=48000, float maxDelayMs=2000.0f)
Creates a delay with sampleRate and maxDelayMs backing storage.
StereoFrame processSample(StereoFrame input)
Processes one stereo frame.
void reset()
Clears delay memory and feedback history.
std::vector< float > processInterleavedStereo(const std::vector< float > &interleaved)
Processes interleaved stereo samples. Odd trailing samples are ignored.
16-band peaking-EQ built from a biquad cascade.
Definition: RADDsp.h:180
float bandGain(size_t index) const
Returns one band gain or 0 for invalid index.
void reset()
Resets all filter states.
Equalizer16Band(uint32_t sampleRate=48000)
Creates an equalizer for sampleRate with default band centers.
bool setBand(size_t index, float frequencyHz, float gainDb, float q=1.0f)
Sets one band center, gain, and Q.
bool setBandGain(size_t index, float gainDb)
Sets one band gain while preserving center/Q.
void setSampleRate(uint32_t sampleRate)
Sets sample rate and rebuilds coefficients.
const std::array< EqualizerBand, 16 > & bands() const
Returns all band settings.
uint32_t sampleRate() const
Returns configured sample rate.
std::vector< float > process(const std::vector< float > &samples)
Processes a block through the equalizer.
Reusable power-of-two complex FFT plan with cached bit-reversal and twiddle factors.
Definition: RADDsp.h:30
std::vector< ComplexSample > transform(const std::vector< ComplexSample > &input, bool inverse=false) const
Transforms input and returns an empty vector if the plan or sample count is invalid.
std::vector< ComplexSample > transformFrames(const std::vector< ComplexSample > &input, size_t frameCount, bool inverse=false) const
Transforms frameCount contiguous frames, returning an empty vector on invalid input.
bool transformManyInPlace(std::vector< std::vector< ComplexSample >> &frames, bool inverse=false) const
Transforms many equal-sized frames in place. Returns false if any frame has the wrong size.
bool valid() const
Returns true when the plan has a non-zero power-of-two size.
FftPlan()=default
Creates an empty invalid plan.
bool transformInPlace(std::vector< ComplexSample > &samples, bool inverse=false) const
Transforms samples in place. Returns false if the plan or sample count is invalid.
bool transformFramesInPlace(std::vector< ComplexSample > &frames, size_t frameCount, bool inverse=false) const
Transforms frameCount contiguous frames of size() in place.
bool transform(const std::vector< ComplexSample > &input, std::vector< ComplexSample > &output, bool inverse=false) const
Transforms input into output. Returns false if the plan or sample count is invalid.
bool reset(size_t size)
Rebuilds the plan and returns false for zero or non-power-of-two sizes.
bool transformMany(const std::vector< std::vector< ComplexSample >> &inputs, std::vector< std::vector< ComplexSample >> &outputs, bool inverse=false) const
Transforms many equal-sized frames. Returns false if any frame has the wrong size.
FftPlan(size_t size)
Creates a plan for size when size is a non-zero power of two.
size_t size() const
Returns the FFT length owned by this plan.
bool transformFrames(const std::vector< ComplexSample > &input, size_t frameCount, std::vector< ComplexSample > &output, bool inverse=false) const
Transforms frameCount contiguous frames of size(). Returns false on invalid sizes.
std::vector< std::vector< ComplexSample > > transformMany(const std::vector< std::vector< ComplexSample >> &inputs, bool inverse=false) const
Transforms many equal-sized frames, returning an empty vector on invalid input.
Row-major dense floating-point matrix for DSP transforms and small linear algebra.
Definition: RADDsp.h:79
std::vector< float > & data()
Returns the mutable matrix backing storage in row-major order.
MatrixF(size_t rows, size_t columns, const std::vector< float > &rowMajor)
Creates a rows x columns matrix from row-major values; missing values are zero-filled.
MatrixF()=default
Creates an empty matrix.
float & operator()(size_t row, size_t column)
Fast unchecked element access for hot DSP loops.
size_t rows() const
Returns the number of rows.
bool empty() const
Returns true when either dimension is zero.
const std::vector< float > & data() const
Returns the matrix backing storage in row-major order.
float operator()(size_t row, size_t column) const
Fast unchecked element access for hot DSP loops.
size_t columns() const
Returns the number of columns.
bool set(size_t row, size_t column, float value)
Safely writes one value and returns false for invalid indices.
void resize(size_t rows, size_t columns, float value=0.0f)
Resizes the matrix and fills all values with value.
float get(size_t row, size_t column) const
Safely reads one value, returning 0 for invalid indices.
MatrixF(size_t rows, size_t columns, float value=0.0f)
Creates a rows x columns matrix initialized to value.
Definition: RADDsp.h:19
float peak(const std::vector< float > &samples)
Returns the absolute peak amplitude in a scalar sample buffer.
std::vector< float > mixCosine(const std::vector< float > &samples, float frequencyHz, uint32_t sampleRate)
Mixes scalar samples with a cosine oscillator.
std::vector< float > interpolateZeros(const std::vector< float > &samples, size_t factor)
Inserts factor-1 zeros between samples.
MatrixF outerProduct(const std::vector< float > &a, const std::vector< float > &b)
Builds the outer product a * b^T.
BiquadCoefficients designBiquadPeakingEQ(float centerHz, uint32_t sampleRate, float gainDb, float q=1.0f)
Designs an RBJ peaking equalizer biquad.
MatrixF hadamard(const MatrixF &a, const MatrixF &b)
Multiplies matching matrix elements, or returns an empty matrix.
std::vector< float > designLowPassFIR(size_t taps, float cutoffHz, uint32_t sampleRate)
Designs a windowed-sinc low-pass FIR filter.
std::vector< float > crossCorrelate(const std::vector< float > &a, const std::vector< float > &b)
Cross-correlates a and b using FFT-based convolution with reversed b.
std::vector< float > whiteNoise(size_t count, float amplitude=1.0f, uint32_t seed=0x524144u)
Generates deterministic white noise using seed for repeatable tests and examples.
void applyGain(std::vector< float > &samples, float gain)
Multiplies every scalar sample by gain in place.
std::vector< std::vector< float > > deinterleave(const std::vector< float > &interleaved, uint16_t channels)
Splits interleaved channel data into one vector per channel.
std::vector< float > rectangularWindow(size_t count)
Builds a rectangular window with count coefficients.
BiquadCoefficients designBiquadNotch(float centerHz, uint32_t sampleRate, float q=1.0f)
Designs an RBJ notch biquad.
float rms(const std::vector< float > &samples)
Returns root-mean-square amplitude for a scalar sample buffer.
MatrixF diagonalMatrix(const std::vector< float > &diagonal)
Builds a diagonal matrix from diagonal values.
bool invert(const MatrixF &matrix, MatrixF &inverse, float epsilon=1.0e-6f)
Computes the inverse of a square matrix with partial pivoting.
std::vector< float > convolve(const std::vector< float > &a, const std::vector< float > &b)
Convolves two scalar buffers using an FFT-based implementation.
void normalizePeak(std::vector< float > &samples, float targetPeak=1.0f)
Scales samples so their absolute peak equals targetPeak when possible.
std::vector< float > firFilter(const std::vector< float > &samples, const std::vector< float > &taps)
Applies an FIR filter using taps and returns filtered samples.
std::vector< float > phase(const std::vector< ComplexSample > &samples)
Converts complex I/Q samples to phase values in radians.
std::vector< float > powerSpectrum(const std::vector< ComplexSample > &spectrum)
Converts complex spectrum bins to power values.
MatrixF subtract(const MatrixF &a, const MatrixF &b)
Subtracts matrices with matching dimensions, or returns an empty matrix.
MatrixF scale(const MatrixF &matrix, float scalar)
Multiplies every matrix value by scalar.
FftPlan createFftPlan(size_t size)
Creates a reusable FFT plan for power-of-two sizes.
BiquadCoefficients designBiquadBandPass(float centerHz, uint32_t sampleRate, float q=1.0f)
Designs an RBJ band-pass biquad.
std::vector< float > blackmanWindow(size_t count)
Builds a Blackman window with count coefficients.
std::vector< float > magnitude(const std::vector< ComplexSample > &samples)
Converts complex I/Q samples to magnitude values.
void automaticGainControl(std::vector< float > &samples, float targetRms=0.25f, float maxGain=32.0f)
Applies simple automatic gain control toward targetRms.
void applyWindow(std::vector< float > &samples, const std::vector< float > &window)
Applies a window to samples in place up to the smaller buffer size.
std::vector< float > decimate(const std::vector< float > &samples, size_t factor)
Keeps every factor-th sample after low-pass filtering should be applied by caller when needed.
BiquadCoefficients designBiquadHighPass(float cutoffHz, uint32_t sampleRate, float q=0.70710678f)
Designs an RBJ high-pass biquad.
std::vector< float > mix(const std::vector< float > &a, const std::vector< float > &b)
Adds two scalar buffers sample-by-sample; extra tail samples are preserved from the longer input.
MatrixF covarianceMatrix(const MatrixF &observations)
Computes a covariance matrix from row-major observations where each row is one observation.
float dot(const std::vector< float > &a, const std::vector< float > &b)
Returns the dot product of equal-size vectors, or 0 for mismatched sizes.
std::vector< float > normalizedCrossCorrelate(const std::vector< float > &a, const std::vector< float > &b)
Cross-correlates and normalizes by signal energy when possible.
float l2Norm(const std::vector< float > &vector)
Returns the Euclidean norm of vector.
std::vector< float > onePoleLowPass(const std::vector< float > &samples, float alpha)
Applies a simple one-pole low-pass filter with alpha in the 0..1 smoothing range.
std::vector< float > hammingWindow(size_t count)
Builds a Hamming window with count coefficients.
bool solveLinearSystem(const MatrixF &matrix, const std::vector< float > &rhs, std::vector< float > &solution, float epsilon=1.0e-6f)
Solves matrix * x = rhs using Gaussian elimination with partial pivoting.
BiquadCoefficients designBiquadLowPass(float cutoffHz, uint32_t sampleRate, float q=0.70710678f)
Designs an RBJ low-pass biquad.
MatrixF transpose(const MatrixF &matrix)
Returns the transpose of matrix.
std::vector< ComplexSample > fftFrames(const std::vector< ComplexSample > &frames, size_t frameSize, bool inverse=false)
Computes many contiguous equal-sized power-of-two FFT frames using one reusable plan.
std::vector< ComplexSample > fft(const std::vector< ComplexSample > &samples, bool inverse=false)
Computes a complex FFT for power-of-two sizes and DFT fallback otherwise.
std::vector< float > normalizeVector(const std::vector< float > &vector)
Returns a normalized copy of vector, or zeros for zero-length input energy.
std::vector< float > linearResample(const std::vector< float > &interleaved, uint16_t channels, uint32_t sourceRate, uint32_t targetRate)
Resamples interleaved scalar audio using linear interpolation.
std::vector< std::vector< ComplexSample > > fftMany(const std::vector< std::vector< ComplexSample >> &frames, bool inverse=false)
Computes many equal-sized power-of-two FFTs using one reusable plan.
std::vector< ComplexSample > frequencyShift(const std::vector< ComplexSample > &samples, float frequencyHz, uint32_t sampleRate)
Frequency-shifts complex I/Q samples by frequencyHz at sampleRate.
std::vector< float > sine(float frequencyHz, float seconds, uint32_t sampleRate, float amplitude=1.0f)
Generates a sine wave at frequencyHz for seconds at sampleRate.
std::vector< float > magnitudeSpectrum(const std::vector< ComplexSample > &spectrum)
Converts complex spectrum bins to magnitudes.
std::vector< float > hannWindow(size_t count)
Builds a Hann window with count coefficients.
std::vector< float > interleave(const std::vector< std::vector< float >> &channels)
Combines per-channel buffers into interleaved channel order.
MatrixF identityMatrix(size_t size)
Builds a square identity matrix.
MatrixF multiply(const MatrixF &a, const MatrixF &b)
Multiplies two dense matrices, or returns an empty matrix for incompatible dimensions.
MatrixF add(const MatrixF &a, const MatrixF &b)
Adds matrices with matching dimensions, or returns an empty matrix.
Extra controls for tape/analog-style modulated stereo delay.
Definition: RADDsp.h:264
float tone
Feedback tone smoothing amount. Lower values are darker.
Definition: RADDsp.h:270
float modulationDepthMs
Peak delay-time modulation depth in milliseconds.
Definition: RADDsp.h:268
float stereoPhase
Right-channel LFO phase offset in cycles for stereo width.
Definition: RADDsp.h:274
float drive
Soft saturation amount applied in the feedback path.
Definition: RADDsp.h:272
float modulationRateHz
LFO frequency in hertz for delay-time modulation.
Definition: RADDsp.h:266
Normalized direct-form biquad coefficients with a0 folded into all terms.
Definition: RADDsp.h:116
float b1
Feed-forward coefficient for x[n-1].
Definition: RADDsp.h:120
float a2
Feedback coefficient for y[n-2], assuming y = b*x - a*y.
Definition: RADDsp.h:126
float a1
Feedback coefficient for y[n-1], assuming y = b*x - a*y.
Definition: RADDsp.h:124
float b2
Feed-forward coefficient for x[n-2].
Definition: RADDsp.h:122
float b0
Feed-forward coefficient for x[n].
Definition: RADDsp.h:118
Stateful direct-form biquad delay elements.
Definition: RADDsp.h:130
float x2
Input sample before x1.
Definition: RADDsp.h:134
float process(float input, const BiquadCoefficients &coeffs)
Processes one sample through coeffs and updates state.
float x1
Previous input sample.
Definition: RADDsp.h:132
void reset()
Clears all delay elements.
float y2
Output sample before y1.
Definition: RADDsp.h:138
float y1
Previous output sample.
Definition: RADDsp.h:136
Complex I/Q sample used by SDR and constellation-oriented helpers.
Definition: RADDsp.h:22
float q
Quadrature component.
Definition: RADDsp.h:26
float i
In-phase component.
Definition: RADDsp.h:24
Shared settings for stereo delay-line effects.
Definition: RADDsp.h:218
float crossFeedback
Cross-channel feedback gain for ping-pong style delays.
Definition: RADDsp.h:230
float dry
Dry input signal gain.
Definition: RADDsp.h:228
uint32_t sampleRate
Processing sample rate in hertz.
Definition: RADDsp.h:220
float delayMs
Nominal delay time in milliseconds.
Definition: RADDsp.h:222
float maxDelayMs
Maximum delay memory allocated by the effect.
Definition: RADDsp.h:232
float wet
Wet delayed signal gain.
Definition: RADDsp.h:226
float feedback
Same-channel feedback gain.
Definition: RADDsp.h:224
One 16-band equalizer band setting.
Definition: RADDsp.h:147
float frequencyHz
Center frequency in hertz.
Definition: RADDsp.h:149
float q
Peaking-EQ Q factor.
Definition: RADDsp.h:153
float gainDb
Gain in decibels.
Definition: RADDsp.h:151
One stereo audio frame used by stateful real-time effects.
Definition: RADDsp.h:210
float right
Right channel sample.
Definition: RADDsp.h:214
float left
Left channel sample.
Definition: RADDsp.h:212