From 4cc2ba690b0059f5fadcf2a690f3916e51acf25b Mon Sep 17 00:00:00 2001 From: Sandbox <143267209+Win-Sandbox@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:53:26 +0800 Subject: [PATCH] Add 12k5 RXBW to NFM Mode (#3023) * Add 12k5 option to NFM * Updated freqman_db * Add 12k5 RXBW to NFM * Add 12k5 RXBW * formating --- firmware/application/apps/ui_mictx.hpp | 3 ++- firmware/application/freqman_db.cpp | 3 ++- firmware/application/receiver_model.cpp | 3 ++- firmware/common/dsp_fir_taps.hpp | 31 +++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/firmware/application/apps/ui_mictx.hpp b/firmware/application/apps/ui_mictx.hpp index bbeac2392..770d7cf2a 100644 --- a/firmware/application/apps/ui_mictx.hpp +++ b/firmware/application/apps/ui_mictx.hpp @@ -304,7 +304,8 @@ class MicTXView : public View { { {" 8k5 ", 0}, // Initial dynamic values when we start Mic App. {" 11k ", 1}, - {" 16k ", 2}, + {" 12k5 ", 2}, + {" 16k ", 3}, }}; NumberField field_squelch{ diff --git a/firmware/application/freqman_db.cpp b/firmware/application/freqman_db.cpp index d899f979f..615b75cf4 100644 --- a/firmware/application/freqman_db.cpp +++ b/firmware/application/freqman_db.cpp @@ -66,7 +66,8 @@ options_t freqman_bandwidths[6] = { // NFM {"8k5", 0}, {"11k", 1}, - {"16k", 2}, + {"12k5", 2}, + {"16k", 3}, }, { // WFM diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index c335d0c46..cd4159afb 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -63,9 +63,10 @@ static constexpr std::array am_configs{{ {taps_6k0_narrow_decim_1, taps_6k0_decim_2, taps_2k6_usb_wefax_channel, AMConfigureMessage::Modulation::SSB_FM, apt_audio_12k_lpf_1500hz_config, (int)AMConfigureMessage::Zoom_waterfall::ZOOM_x_2}, // SSB USB+FM to demod. Subcarrier FM Audio Tones to get APT Weather Fax with waterfall zoom x 2 (we need taps_6k0_narrow_decim_1 to minimize aliasing) }}; -static constexpr std::array nbfm_configs{{ +static constexpr std::array nbfm_configs{{ {taps_4k25_decim_0, taps_4k25_decim_1, taps_4k25_channel, 2500}, {taps_11k0_decim_0, taps_11k0_decim_1, taps_11k0_channel, 2500}, + {taps_12k5_decim_0, taps_12k5_decim_1, taps_12k5_channel, 2500}, {taps_16k0_decim_0, taps_16k0_decim_1, taps_16k0_channel, 5000}, }}; diff --git a/firmware/common/dsp_fir_taps.hpp b/firmware/common/dsp_fir_taps.hpp index 9602e4f73..37ea6307b 100644 --- a/firmware/common/dsp_fir_taps.hpp +++ b/firmware/common/dsp_fir_taps.hpp @@ -278,6 +278,37 @@ constexpr fir_taps_real<32> taps_11k0_channel{ }}, }; +// NBFM 12K5F3E emission type ///////////////////////////////////////////// + +// IFIR image-reject filter: fs=3072000, pass=6250, stop=342250, decim=8, fout=384000 +constexpr fir_taps_real<24> taps_12k5_decim_0{ + .low_frequency_normalized = -6250.0f / 3072000.0f, + .high_frequency_normalized = 6250.0f / 3072000.0f, + .transition_normalized = 336000.0f / 3072000.0f, + .taps = {{42, 108, 226, 412, 672, 1004, 1391, 1807, 2211, 2565, 2828, 2969, + 2969, 2828, 2565, 2211, 1807, 1391, 1004, 672, 412, 226, 108, 42}}, +}; + +// IFIR prototype filter: fs=384000, pass=6250, stop=42500, decim=8, fout=48000 +constexpr fir_taps_real<32> taps_12k5_decim_1{ + .low_frequency_normalized = -6250.0f / 384000.0f, + .high_frequency_normalized = 6250.0f / 384000.0f, + .transition_normalized = 36250.0f / 384000.0f, + .taps = {{-38, -85, -162, -245, -315, -338, -275, -85, 255, 752, 1378, 2088, + 2807, 3452, 3939, 4202, 4202, 3939, 3452, 2807, 2088, 1378, 752, 255, + -85, -275, -338, -315, -245, -162, -85, -38}}, +}; + +// Channel filter: fs=48000, pass=6250, stop=9250, decim=1, fout=48000 +constexpr fir_taps_real<32> taps_12k5_channel{ + .low_frequency_normalized = -6250.0f / 48000.0f, + .high_frequency_normalized = 6250.0f / 48000.0f, + .transition_normalized = 3000.0f / 48000.0f, + .taps = {{-75, -362, -712, -908, -592, 268, 1324, 1720, 684, -1522, -3541, -3385, + 342, 7150, 14642, 19541, 19541, 14642, 7150, 342, -3385, -3541, -1522, 684, + 1720, 1324, 268, -592, -908, -712, -362, -75}}, +}; + // NBFM 8K50F3E emission type ///////////////////////////////////////////// // IFIR image-reject filter: fs=3072000, pass=4250, stop=340250, decim=8, fout=384000