mirror of
https://github.com/radio95-rnt/fm95.git
synced 2026-02-27 03:23:54 +01:00
refactor filter functions and update FM modulator logic
This commit is contained in:
@@ -24,35 +24,7 @@ void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampl
|
|||||||
filter->z2 = 0.0f;
|
filter->z2 = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_hpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate) {
|
float apply_biquad(BiquadFilter* filter, float input) {
|
||||||
float cutoffNorm = cutoffFreq / sampleRate;
|
|
||||||
float K = tanf(M_PI * cutoffNorm);
|
|
||||||
float norm = 1.0f/(1.0f+K/qFactor+K*K);
|
|
||||||
filter->a0 = 1.0f*norm;
|
|
||||||
filter->a1 = -2.0f*norm;
|
|
||||||
filter->a2 = 1.0f*norm;
|
|
||||||
filter->b1 = 2.0f*(K*K-1.0f)*norm;
|
|
||||||
filter->b2 = (1.0f-K/qFactor+K*K)*norm;
|
|
||||||
|
|
||||||
filter->z1 = 0.0f;
|
|
||||||
filter->z2 = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
void init_bpf(BiquadFilter* filter, float centerFreq, float qFactor, float sampleRate) {
|
|
||||||
float cutoffNorm = centerFreq / sampleRate;
|
|
||||||
float K = tanf(M_PI * cutoffNorm);
|
|
||||||
float norm = 1.0f/(1.0f+K/qFactor+K*K);
|
|
||||||
filter->a0 = K/qFactor*norm;
|
|
||||||
filter->a1 = 0.0f;
|
|
||||||
filter->a2 = -K/qFactor*norm;
|
|
||||||
filter->b1 = 2.0f*(K*K-1.0f)*norm;
|
|
||||||
filter->b2 = (1.0f-K/qFactor+K*K)*norm;
|
|
||||||
|
|
||||||
filter->z1 = 0.0f;
|
|
||||||
filter->z2 = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
float apply_frequency_filter(BiquadFilter* filter, float input) {
|
|
||||||
float out = input*filter->a0+filter->z1;
|
float out = input*filter->a0+filter->z1;
|
||||||
filter->z1 = input*filter->a1+filter->z2-filter->b1*out;
|
filter->z1 = input*filter->a1+filter->z2-filter->b1*out;
|
||||||
filter->z2 = input*filter->a2-filter->b2*out;
|
filter->z2 = input*filter->a2-filter->b2*out;
|
||||||
|
|||||||
@@ -21,9 +21,7 @@ typedef struct {
|
|||||||
float z1, z2;
|
float z1, z2;
|
||||||
} BiquadFilter;
|
} BiquadFilter;
|
||||||
void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate);
|
void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate);
|
||||||
void init_hpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate);
|
float apply_biquad(BiquadFilter* filter, float input);
|
||||||
void init_bpf(BiquadFilter* filter, float centerFreq, float qFactor, float sampleRate);
|
|
||||||
float apply_frequency_filter(BiquadFilter* filter, float input);
|
|
||||||
|
|
||||||
float hard_clip(float sample, float threshold);
|
float hard_clip(float sample, float threshold);
|
||||||
float voltage_db_to_voltage(float db);
|
float voltage_db_to_voltage(float db);
|
||||||
|
|||||||
@@ -3,12 +3,13 @@
|
|||||||
void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate) {
|
void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate) {
|
||||||
fm->frequency = frequency;
|
fm->frequency = frequency;
|
||||||
fm->deviation = deviation;
|
fm->deviation = deviation;
|
||||||
init_oscillator(&fm->osc, frequency, sample_rate);
|
fm->sample_rate = sample_rate;
|
||||||
|
fm->osc_phase = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float modulate_fm(FMModulator *fm, float sample) {
|
float modulate_fm(FMModulator *fm, float sample) {
|
||||||
float inst_freq = fm->frequency+(sample*fm->deviation);
|
float inst_freq = fm->frequency+(sample*fm->deviation);
|
||||||
if (inst_freq < 0.0f) inst_freq = 0.0f;
|
if (inst_freq < 0.0f) inst_freq = 0.0f;
|
||||||
change_oscillator_frequency(&fm->osc, inst_freq);
|
fm->osc_phase += fmodf(fm->osc_phase + ((M_2PI * inst_freq) / fm->sample_rate), M_2PI);
|
||||||
return get_oscillator_sin_sample(&fm->osc);
|
return sinf(fm->osc_phase);
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,8 @@ typedef struct
|
|||||||
{
|
{
|
||||||
float frequency;
|
float frequency;
|
||||||
float deviation;
|
float deviation;
|
||||||
Oscillator osc;
|
float osc_phase;
|
||||||
|
float sample_rate;
|
||||||
} FMModulator;
|
} FMModulator;
|
||||||
|
|
||||||
void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate);
|
void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate);
|
||||||
|
|||||||
@@ -414,10 +414,10 @@ int main(int argc, char **argv) {
|
|||||||
float current_mpx_in = mpx_in[i];
|
float current_mpx_in = mpx_in[i];
|
||||||
float current_sca_in = sca_in[i];
|
float current_sca_in = sca_in[i];
|
||||||
|
|
||||||
float ready_l = apply_frequency_filter(&lpf_l, l_in);
|
float ready_l = apply_biquad(&lpf_l, l_in);
|
||||||
float ready_r = apply_frequency_filter(&lpf_r, r_in);
|
float ready_r = apply_biquad(&lpf_r, r_in);
|
||||||
ready_l = apply_preemphasis(&preemp_l, ready_l)*4;
|
ready_l = apply_preemphasis(&preemp_l, ready_l)*2;
|
||||||
ready_r = apply_preemphasis(&preemp_r, ready_r)*4;
|
ready_r = apply_preemphasis(&preemp_r, ready_r)*2;
|
||||||
ready_l = hard_clip(ready_l*audio_volume, clipper_threshold);
|
ready_l = hard_clip(ready_l*audio_volume, clipper_threshold);
|
||||||
ready_r = hard_clip(ready_r*audio_volume, clipper_threshold);
|
ready_r = hard_clip(ready_r*audio_volume, clipper_threshold);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user