diff --git a/firmware/baseband/dsp_iir_config.hpp b/firmware/baseband/dsp_iir_config.hpp index 7e99ed03..371521c4 100644 --- a/firmware/baseband/dsp_iir_config.hpp +++ b/firmware/baseband/dsp_iir_config.hpp @@ -48,4 +48,12 @@ constexpr iir_biquad_config_t audio_deemph_300_6_config { { 1.00000000f, -0.96148145f, 0.00000000f, }, }; +// 75us RC time constant, used in broadcast FM in Americas, South Korea +// scipy.signal.butter(1, 2122 / 24000.0, 'lowpass', analog=False) +// NOTE: Technically, order-1 filter, b[2] = a[2] = 0. +constexpr iir_biquad_config_t audio_deemph_2122_6_config { + { 0.12264116f, 0.12264116f, 0.00000000f, }, + { 1.00000000f, -0.75471767f, 0.00000000f, }, +}; + #endif/*__DSP_IIR_CONFIG_H__*/ diff --git a/firmware/baseband/proc_wfm_audio.cpp b/firmware/baseband/proc_wfm_audio.cpp index a708a9ac..d1bc8fe9 100644 --- a/firmware/baseband/proc_wfm_audio.cpp +++ b/firmware/baseband/proc_wfm_audio.cpp @@ -68,5 +68,7 @@ void WidebandFMAudio::execute(const buffer_c8_t& buffer) { /* -> 48kHz int16_t[32] */ audio_hpf.execute_in_place(audio); + audio_deemph.execute_in_place(audio); + fill_audio_buffer(audio); } diff --git a/firmware/baseband/proc_wfm_audio.hpp b/firmware/baseband/proc_wfm_audio.hpp index 6b0fed88..91965cc7 100644 --- a/firmware/baseband/proc_wfm_audio.hpp +++ b/firmware/baseband/proc_wfm_audio.hpp @@ -50,6 +50,7 @@ private: dsp::decimate::FIR64AndDecimateBy2Real audio_filter { audio_filter_taps.taps }; IIRBiquadFilter audio_hpf { audio_hpf_30hz_config }; + IIRBiquadFilter audio_deemph { audio_deemph_2122_6_config }; }; #endif/*__PROC_WFM_AUDIO_H__*/