diff --git a/.vscode/settings.json b/.vscode/settings.json index b9475d1..7afaac6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -32,7 +32,8 @@ "string": "c", "string_view": "c", "version.h": "c", - "cdecl.h": "c" + "cdecl.h": "c", + "algorithm": "c" }, "C_Cpp.errorSquiggles": "disabled" } \ No newline at end of file diff --git a/dsp/gain_control.c b/dsp/gain_control.c index e5d0cec..6863b3f 100644 --- a/dsp/gain_control.c +++ b/dsp/gain_control.c @@ -17,10 +17,8 @@ void initAGC(AGC* agc, int sampleRate, float targetLevel, float minGain, float m agc->rms_buffer = 0.0f; } -float process_agc_stereo(AGC* agc, float left, float right, float *right_out) { - float sample = (left+right)/2; - - float x2 = sample * sample; +float process_agc(AGC* agc, float sidechain) { + float x2 = sidechain * sidechain; float rmsAlpha = expf(-1.0f / (agc->sampleRate * 0.04)); agc->rms_buffer = rmsAlpha * agc->rms_buffer + (1.0f - rmsAlpha) * x2; @@ -35,6 +33,5 @@ float process_agc_stereo(AGC* agc, float left, float right, float *right_out) { float gainAlpha = (desiredGain > agc->currentGain) ? agc->attackCoef : agc->releaseCoef; agc->currentGain = gainAlpha * agc->currentGain + (1.0f - gainAlpha) * desiredGain; - *right_out = right * agc->currentGain; - return left * agc->currentGain; + return agc->currentGain; } \ No newline at end of file diff --git a/dsp/gain_control.h b/dsp/gain_control.h index b5ebd29..45f215e 100644 --- a/dsp/gain_control.h +++ b/dsp/gain_control.h @@ -19,4 +19,4 @@ typedef struct { } AGC; void initAGC(AGC* agc, int sampleRate, float targetLevel, float minGain, float maxGain, float attackTime, float releaseTime); -float process_agc_stereo(AGC* agc, float left, float right, float *right_out); \ No newline at end of file +float process_agc(AGC* agc, float sidechain); \ No newline at end of file diff --git a/src/fm95.c b/src/fm95.c index 88c0944..3df621d 100644 --- a/src/fm95.c +++ b/src/fm95.c @@ -477,12 +477,16 @@ int main(int argc, char **argv) { float ready_r = apply_preemphasis(&preemp_r, right[i]); iirfilt_rrrf_execute(lpf_l, ready_l, &ready_l); iirfilt_rrrf_execute(lpf_r, ready_r, &ready_r); - ready_l = process_agc_stereo(&agc, ready_l, ready_r, &ready_r); + + float agc_gain = process_agc(&agc, ((ready_l + ready_r) * 0.5f)); + ready_l *= agc_gain; + ready_r *= agc_gain; + ready_l = hard_clip(ready_l*audio_volume, clipper_threshold); ready_r = hard_clip(ready_r*audio_volume, clipper_threshold); - float mid = (ready_l + ready_r) / 2.0f; - float side = (ready_l - ready_r) / 2.0f; + float mid = (ready_l + ready_r) * 0.5f; + float side = (ready_l - ready_r) * 0.5f; audio = mid*MONO_VOLUME; if(stereo) {