You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.9 KiB
80 lines
1.9 KiB
#pragma once
|
|
#ifndef DSY_NLFILT_H
|
|
#define DSY_NLFILT_H
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#define DSY_NLFILT_MAX_DELAY 1024
|
|
|
|
namespace daisysp
|
|
{
|
|
/** Non-linear filter
|
|
|
|
port by: Stephen Hensley, December 2019
|
|
|
|
The four 5-coefficients: a, b, d, C, and L are used to configure different filter types.
|
|
|
|
Structure for Dobson/Fitch nonlinear filter
|
|
|
|
Revised Formula from Risto Holopainen 12 Mar 2004
|
|
|
|
`Y{n} =tanh(a Y{n-1} + b Y{n-2} + d Y^2{n-L} + X{n} - C)`
|
|
|
|
Though traditional filter types can be made,
|
|
the effect will always respond differently to different input.
|
|
|
|
This Source is a heavily modified version of the original
|
|
source from Csound.
|
|
|
|
\todo make this work on a single sample instead of just on blocks at a time.
|
|
*/
|
|
class NlFilt
|
|
{
|
|
public:
|
|
/** Initializes the NlFilt object.
|
|
*/
|
|
void Init();
|
|
|
|
/** Process the array pointed to by \*in and updates the output to \*out;
|
|
This works on a block of audio at once, the size of which is set with the size.
|
|
*/
|
|
void ProcessBlock(float *in, float *out, size_t size);
|
|
|
|
|
|
/** inputs these are the five coefficients for the filter.
|
|
*/
|
|
inline void SetCoefficients(float a, float b, float d, float C, float L)
|
|
{
|
|
a_ = a;
|
|
b_ = b;
|
|
d_ = d;
|
|
C_ = C;
|
|
L_ = L;
|
|
}
|
|
|
|
|
|
/** Set Coefficient a
|
|
*/
|
|
inline void SetA(float a) { a_ = a; }
|
|
/** Set Coefficient b
|
|
*/
|
|
inline void SetB(float b) { b_ = b; }
|
|
/** Set Coefficient d
|
|
*/
|
|
inline void SetD(float d) { d_ = d; }
|
|
/** Set Coefficient C
|
|
*/
|
|
inline void SetC(float C) { C_ = C; }
|
|
/** Set Coefficient L
|
|
*/
|
|
inline void SetL(float L) { L_ = L; }
|
|
|
|
private:
|
|
int32_t Set();
|
|
|
|
float in_, a_, b_, d_, C_, L_;
|
|
float delay_[DSY_NLFILT_MAX_DELAY];
|
|
int32_t point_;
|
|
};
|
|
} // namespace daisysp
|
|
|
|
#endif
|
|
|