diff --git a/firmware/baseband/proc_tpms.cpp b/firmware/baseband/proc_tpms.cpp index b9e111222..1e8d378a0 100644 --- a/firmware/baseband/proc_tpms.cpp +++ b/firmware/baseband/proc_tpms.cpp @@ -26,10 +26,43 @@ #include "i2s.hpp" using namespace lpc43xx; +#include "dsp_fir_taps.hpp" + +static constexpr fir_taps_real<24> taps_200k_decim_0 = { + .pass_frequency_normalized = 100000.0f / 2457600.0f, + .stop_frequency_normalized = 407200.0f / 2457600.0f, + .taps = { { + 90, 94, 4, -240, -570, -776, -563, 309, + 1861, 3808, 5618, 6710, 6710, 5618, 3808, 1861, + 309, -563, -776, -570, -240, 4, 94, 90, + } }, +}; + +static constexpr fir_taps_real<16> taps_200k_decim_1 = { + .pass_frequency_normalized = 100000.0f / 614400.0f, + .stop_frequency_normalized = 207200.0f / 614400.0f, + .taps = { { + -132, -256, 545, 834, -1507, -2401, 4666, 14583, + 14583, 4666, -2401, -1507, 834, 545, -256, -132, + } }, +}; + +TPMSProcessor::TPMSProcessor() { + decim_0.configure(taps_200k_decim_0.taps, 33554432); + decim_1.configure(taps_200k_decim_1.taps, 131072); +} + void TPMSProcessor::execute(const buffer_c8_t& buffer) { /* 2.4576MHz, 2048 samples */ - auto decimator_out = decimator.execute(buffer); + const buffer_c16_t dst_buffer { + dst.data(), + dst.size() + }; + + const auto decim_0_out = decim_0.execute(buffer, dst_buffer); + const auto decim_1_out = decim_1.execute(decim_0_out, dst_buffer); + const auto decimator_out = decim_1_out; /* 76.8kHz, 64 samples */ feed_channel_stats(decimator_out); diff --git a/firmware/baseband/proc_tpms.hpp b/firmware/baseband/proc_tpms.hpp index 45a655fa7..10b902489 100644 --- a/firmware/baseband/proc_tpms.hpp +++ b/firmware/baseband/proc_tpms.hpp @@ -39,22 +39,31 @@ #include // Translate+rectangular filter -// sample=153.6k, deviation=38400, symbol=19200 -// Length: 8 taps, 1 symbols, 2 cycles of sinusoid -constexpr std::array, 8> rect_taps_153k6_1t_p { { - { 1.2500000000e-01f, 0.0000000000e+00f }, { 0.0000000000e+00f, 1.2500000000e-01f }, - { -1.2500000000e-01f, 0.0000000000e+00f }, { 0.0000000000e+00f, -1.2500000000e-01f }, - { 1.2500000000e-01f, 0.0000000000e+00f }, { 0.0000000000e+00f, 1.2500000000e-01f }, - { -1.2500000000e-01f, 0.0000000000e+00f }, { 0.0000000000e+00f, -1.2500000000e-01f }, +// sample=307.2k, deviation=38400, symbol=19200 +// Length: 16 taps, 1 symbols, 2 cycles of sinusoid +constexpr std::array, 16> rect_taps_307k2_1t_p { { + { 6.2500000000e-02f, 0.0000000000e+00f }, { 4.4194173824e-02f, 4.4194173824e-02f }, + { 0.0000000000e+00f, 6.2500000000e-02f }, { -4.4194173824e-02f, 4.4194173824e-02f }, + { -6.2500000000e-02f, 0.0000000000e+00f }, { -4.4194173824e-02f, -4.4194173824e-02f }, + { 0.0000000000e+00f, -6.2500000000e-02f }, { 4.4194173824e-02f, -4.4194173824e-02f }, + { 6.2500000000e-02f, 0.0000000000e+00f }, { 4.4194173824e-02f, 4.4194173824e-02f }, + { 0.0000000000e+00f, 6.2500000000e-02f }, { -4.4194173824e-02f, 4.4194173824e-02f }, + { -6.2500000000e-02f, 0.0000000000e+00f }, { -4.4194173824e-02f, -4.4194173824e-02f }, + { 0.0000000000e+00f, -6.2500000000e-02f }, { 4.4194173824e-02f, -4.4194173824e-02f }, } }; class TPMSProcessor : public BasebandProcessor { public: + TPMSProcessor(); + void execute(const buffer_c8_t& buffer) override; private: - ChannelDecimator decimator { ChannelDecimator::DecimationFactor::By16 }; - dsp::matched_filter::MatchedFilter mf { rect_taps_153k6_1t_p, 4 }; + std::array dst; + dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0; + dsp::decimate::FIRC16xR16x16Decim2 decim_1; + + dsp::matched_filter::MatchedFilter mf { rect_taps_307k2_1t_p, 8 }; clock_recovery::ClockRecovery clock_recovery { 38400, 19200, { 0.0555f },