mirror of
https://github.com/radio95-rnt/fm95.git
synced 2026-02-27 03:23:54 +01:00
speed up agc (in performance, not audio levels)
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -32,7 +32,8 @@
|
|||||||
"string": "c",
|
"string": "c",
|
||||||
"string_view": "c",
|
"string_view": "c",
|
||||||
"version.h": "c",
|
"version.h": "c",
|
||||||
"cdecl.h": "c"
|
"cdecl.h": "c",
|
||||||
|
"algorithm": "c"
|
||||||
},
|
},
|
||||||
"C_Cpp.errorSquiggles": "disabled"
|
"C_Cpp.errorSquiggles": "disabled"
|
||||||
}
|
}
|
||||||
@@ -17,10 +17,8 @@ void initAGC(AGC* agc, int sampleRate, float targetLevel, float minGain, float m
|
|||||||
agc->rms_buffer = 0.0f;
|
agc->rms_buffer = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float process_agc_stereo(AGC* agc, float left, float right, float *right_out) {
|
float process_agc(AGC* agc, float sidechain) {
|
||||||
float sample = (left+right)/2;
|
float x2 = sidechain * sidechain;
|
||||||
|
|
||||||
float x2 = sample * sample;
|
|
||||||
|
|
||||||
float rmsAlpha = expf(-1.0f / (agc->sampleRate * 0.04));
|
float rmsAlpha = expf(-1.0f / (agc->sampleRate * 0.04));
|
||||||
agc->rms_buffer = rmsAlpha * agc->rms_buffer + (1.0f - rmsAlpha) * x2;
|
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;
|
float gainAlpha = (desiredGain > agc->currentGain) ? agc->attackCoef : agc->releaseCoef;
|
||||||
agc->currentGain = gainAlpha * agc->currentGain + (1.0f - gainAlpha) * desiredGain;
|
agc->currentGain = gainAlpha * agc->currentGain + (1.0f - gainAlpha) * desiredGain;
|
||||||
|
|
||||||
*right_out = right * agc->currentGain;
|
return agc->currentGain;
|
||||||
return left * agc->currentGain;
|
|
||||||
}
|
}
|
||||||
@@ -19,4 +19,4 @@ typedef struct {
|
|||||||
} AGC;
|
} AGC;
|
||||||
|
|
||||||
void initAGC(AGC* agc, int sampleRate, float targetLevel, float minGain, float maxGain, float attackTime, float releaseTime);
|
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);
|
float process_agc(AGC* agc, float sidechain);
|
||||||
10
src/fm95.c
10
src/fm95.c
@@ -477,12 +477,16 @@ int main(int argc, char **argv) {
|
|||||||
float ready_r = apply_preemphasis(&preemp_r, right[i]);
|
float ready_r = apply_preemphasis(&preemp_r, right[i]);
|
||||||
iirfilt_rrrf_execute(lpf_l, ready_l, &ready_l);
|
iirfilt_rrrf_execute(lpf_l, ready_l, &ready_l);
|
||||||
iirfilt_rrrf_execute(lpf_r, ready_r, &ready_r);
|
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_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);
|
||||||
|
|
||||||
float mid = (ready_l + ready_r) / 2.0f;
|
float mid = (ready_l + ready_r) * 0.5f;
|
||||||
float side = (ready_l - ready_r) / 2.0f;
|
float side = (ready_l - ready_r) * 0.5f;
|
||||||
|
|
||||||
audio = mid*MONO_VOLUME;
|
audio = mid*MONO_VOLUME;
|
||||||
if(stereo) {
|
if(stereo) {
|
||||||
|
|||||||
Reference in New Issue
Block a user