From a97cd642acecee73f380648c8b9b6b13282757a2 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Sat, 30 Jan 2016 19:03:32 -0800 Subject: [PATCH] Multiple AM modes selection in application API. --- firmware/application/analog_audio_app.cpp | 20 ++++++++++++++++---- firmware/application/analog_audio_app.hpp | 2 +- firmware/common/dsp_fir_taps.hpp | 23 +++++++++++++++++++++++ 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index e333b7c2..d5094c60 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -48,7 +48,7 @@ AnalogAudioModel::AnalogAudioModel(ReceiverModel::Mode mode) { break; case ReceiverModel::Mode::AMAudio: - configure_am(); + configure_am(0); break; default: @@ -98,13 +98,25 @@ void AnalogAudioModel::configure_wfm() { clock_manager.set_base_audio_clock_divider(1); } -void AnalogAudioModel::configure_am() { +struct AMMode { + const fir_taps_complex<64> channel; + const AMConfigureMessage::Modulation modulation; +}; + +static constexpr std::array am_mode_configs { { + { taps_6k0_dsb_channel, AMConfigureMessage::Modulation::DSB }, + { taps_2k8_usb_channel, AMConfigureMessage::Modulation::SSB }, + { taps_2k8_lsb_channel, AMConfigureMessage::Modulation::SSB }, +} }; + +void AnalogAudioModel::configure_am(const size_t index) { + const auto config = am_mode_configs[index]; const AMConfigureMessage message { taps_6k0_decim_0, taps_6k0_decim_1, taps_6k0_decim_2, - taps_2k8_usb_channel, - AMConfigureMessage::Modulation::SSB, + config.channel, + config.modulation, audio_12k_hpf_300hz_config }; shared_memory.baseband_queue.push(message); diff --git a/firmware/application/analog_audio_app.hpp b/firmware/application/analog_audio_app.hpp index f032f01f..a598a6b4 100644 --- a/firmware/application/analog_audio_app.hpp +++ b/firmware/application/analog_audio_app.hpp @@ -32,7 +32,7 @@ public: private: void configure_nbfm(const size_t index); void configure_wfm(); - void configure_am(); + void configure_am(const size_t index); }; namespace ui { diff --git a/firmware/common/dsp_fir_taps.hpp b/firmware/common/dsp_fir_taps.hpp index 53c7fa5a..63944282 100644 --- a/firmware/common/dsp_fir_taps.hpp +++ b/firmware/common/dsp_fir_taps.hpp @@ -189,6 +189,29 @@ constexpr fir_taps_real<32> taps_6k0_decim_2 { } }, }; +constexpr fir_taps_complex<64> taps_6k0_dsb_channel { + .pass_frequency_normalized = 3000.0f / 12000.0f, + .stop_frequency_normalized = 3300.0f / 12000.0f, + .taps = { { + { -70, 0 }, { -142, 0 }, { 121, 0 }, { 90, 0 }, + { -134, 0 }, { -136, 0 }, { 200, 0 }, { 170, 0 }, + { -278, 0 }, { -209, 0 }, { 378, 0 }, { 251, 0 }, + { -505, 0 }, { -294, 0 }, { 665, 0 }, { 336, 0 }, + { -868, 0 }, { -378, 0 }, { 1131, 0 }, { 417, 0 }, + { -1479, 0 }, { -453, 0 }, { 1965, 0 }, { 484, 0 }, + { -2698, 0 }, { -510, 0 }, { 3967, 0 }, { 528, 0 }, + { -6829, 0 }, { -540, 0 }, { 20819, 0 }, { 32767, 0 }, /* TODO: Saturated peak! Originally 33312. */ + { 20819, 0 }, { -540, 0 }, { -6829, 0 }, { 528, 0 }, + { 3967, 0 }, { -510, 0 }, { -2698, 0 }, { 484, 0 }, + { 1965, 0 }, { -453, 0 }, { -1479, 0 }, { 417, 0 }, + { 1131, 0 }, { -378, 0 }, { -868, 0 }, { 336, 0 }, + { 665, 0 }, { -294, 0 }, { -505, 0 }, { 251, 0 }, + { 378, 0 }, { -209, 0 }, { -278, 0 }, { 170, 0 }, + { 200, 0 }, { -136, 0 }, { -134, 0 }, { 90, 0 }, + { 121, 0 }, { -142, 0 }, { -70, 0 }, { 0, 0 }, + } }, +}; + // USB AM 2K80J3E emission type /////////////////////////////////////////// // IFIR prototype filter: fs=12000, pass=3000, stop=3300, decim=1, fout=12000