diff --git a/lib/filters.c b/lib/filters.c index 124686f..1efdc70 100644 --- a/lib/filters.c +++ b/lib/filters.c @@ -24,35 +24,7 @@ void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampl filter->z2 = 0.0f; } -void init_hpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate) { - 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 apply_biquad(BiquadFilter* filter, float input) { float out = input*filter->a0+filter->z1; filter->z1 = input*filter->a1+filter->z2-filter->b1*out; filter->z2 = input*filter->a2-filter->b2*out; diff --git a/lib/filters.h b/lib/filters.h index 977d616..d56788d 100644 --- a/lib/filters.h +++ b/lib/filters.h @@ -21,9 +21,7 @@ typedef struct { float z1, z2; } BiquadFilter; void init_lpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate); -void init_hpf(BiquadFilter* filter, float cutoffFreq, float qFactor, float sampleRate); -void init_bpf(BiquadFilter* filter, float centerFreq, float qFactor, float sampleRate); -float apply_frequency_filter(BiquadFilter* filter, float input); +float apply_biquad(BiquadFilter* filter, float input); float hard_clip(float sample, float threshold); float voltage_db_to_voltage(float db); diff --git a/lib/fm_modulator.c b/lib/fm_modulator.c index 0ed4287..67fc5a5 100644 --- a/lib/fm_modulator.c +++ b/lib/fm_modulator.c @@ -3,12 +3,13 @@ void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate) { fm->frequency = frequency; 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 inst_freq = fm->frequency+(sample*fm->deviation); if (inst_freq < 0.0f) inst_freq = 0.0f; - change_oscillator_frequency(&fm->osc, inst_freq); - return get_oscillator_sin_sample(&fm->osc); + fm->osc_phase += fmodf(fm->osc_phase + ((M_2PI * inst_freq) / fm->sample_rate), M_2PI); + return sinf(fm->osc_phase); } \ No newline at end of file diff --git a/lib/fm_modulator.h b/lib/fm_modulator.h index 7079a33..9391fed 100644 --- a/lib/fm_modulator.h +++ b/lib/fm_modulator.h @@ -6,7 +6,8 @@ typedef struct { float frequency; float deviation; - Oscillator osc; + float osc_phase; + float sample_rate; } FMModulator; void init_fm_modulator(FMModulator *fm, float frequency, float deviation, float sample_rate); diff --git a/src/fm95.c b/src/fm95.c index 54f9e95..acf1ac8 100644 --- a/src/fm95.c +++ b/src/fm95.c @@ -414,10 +414,10 @@ int main(int argc, char **argv) { float current_mpx_in = mpx_in[i]; float current_sca_in = sca_in[i]; - float ready_l = apply_frequency_filter(&lpf_l, l_in); - float ready_r = apply_frequency_filter(&lpf_r, r_in); - ready_l = apply_preemphasis(&preemp_l, ready_l)*4; - ready_r = apply_preemphasis(&preemp_r, ready_r)*4; + float ready_l = apply_biquad(&lpf_l, l_in); + float ready_r = apply_biquad(&lpf_r, r_in); + ready_l = apply_preemphasis(&preemp_l, ready_l)*2; + ready_r = apply_preemphasis(&preemp_r, ready_r)*2; ready_l = hard_clip(ready_l*audio_volume, clipper_threshold); ready_r = hard_clip(ready_r*audio_volume, clipper_threshold);