From b21c1f21a4e54ef958fb00bbcfb9d264e6086135 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Mon, 26 Feb 2018 19:55:14 +0000 Subject: [PATCH] Make the DC blocker optional to reduce CPU load. --- Config.h | 3 +++ IO.cpp | 45 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/Config.h b/Config.h index b201991..1de81a0 100644 --- a/Config.h +++ b/Config.h @@ -66,4 +66,7 @@ // Use the modem as a serial repeater for Nextion displays // #define SERIAL_REPEATER +// To reduce CPU load, you can remove the DC blocker by commenting out the next line +#define USE_DCBLOCKER + #endif diff --git a/IO.cpp b/IO.cpp index 1f95d14..4639090 100644 --- a/IO.cpp +++ b/IO.cpp @@ -301,13 +301,14 @@ void CIO::process() if (m_lockout) return; - q31_t dcLevel = 0; - q31_t dcValues[RX_BLOCK_SIZE]; +#if defined(USE_DCBLOCKER) q31_t q31Samples[RX_BLOCK_SIZE]; - ::arm_q15_to_q31(samples, q31Samples, RX_BLOCK_SIZE); + + q31_t dcValues[RX_BLOCK_SIZE]; ::arm_biquad_cascade_df1_q31(&m_dcFilter, q31Samples, dcValues, RX_BLOCK_SIZE); + q31_t dcLevel = 0; for (uint8_t i = 0U; i < RX_BLOCK_SIZE; i++) dcLevel += dcValues[i]; dcLevel /= RX_BLOCK_SIZE; @@ -317,26 +318,37 @@ void CIO::process() q15_t dcSamples[RX_BLOCK_SIZE]; for (uint8_t i = 0U; i < RX_BLOCK_SIZE; i++) dcSamples[i] = samples[i] - offset; +#endif if (m_modemState == STATE_IDLE) { if (m_dstarEnable) { q15_t GMSKVals[RX_BLOCK_SIZE]; +#if defined(USE_DCBLOCKER) ::arm_fir_fast_q15(&m_gaussianFilter, dcSamples, GMSKVals, RX_BLOCK_SIZE); - +#else + ::arm_fir_fast_q15(&m_gaussianFilter, samples, GMSKVals, RX_BLOCK_SIZE); +#endif dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE); } if (m_p25Enable) { q15_t P25Vals[RX_BLOCK_SIZE]; +#if defined(USE_DCBLOCKER) ::arm_fir_fast_q15(&m_boxcarFilter, dcSamples, P25Vals, RX_BLOCK_SIZE); - +#else + ::arm_fir_fast_q15(&m_boxcarFilter, samples, P25Vals, RX_BLOCK_SIZE); +#endif p25RX.samples(P25Vals, rssi, RX_BLOCK_SIZE); } if (m_nxdnEnable) { - q15_t NXDNVals[RX_BLOCK_SIZE]; q15_t NXDNValsTmp[RX_BLOCK_SIZE]; +#if defined(USE_DCBLOCKER) ::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNValsTmp, RX_BLOCK_SIZE); +#else + ::arm_fir_fast_q15(&m_nxdnFilter, samples, NXDNValsTmp, RX_BLOCK_SIZE); +#endif + q15_t NXDNVals[RX_BLOCK_SIZE]; ::arm_fir_fast_q15(&m_nxdnISincFilter, NXDNValsTmp, NXDNVals, RX_BLOCK_SIZE); nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE); @@ -359,8 +371,11 @@ void CIO::process() } else if (m_modemState == STATE_DSTAR) { if (m_dstarEnable) { q15_t GMSKVals[RX_BLOCK_SIZE]; +#if defined(USE_DCBLOCKER) ::arm_fir_fast_q15(&m_gaussianFilter, dcSamples, GMSKVals, RX_BLOCK_SIZE); - +#else + ::arm_fir_fast_q15(&m_gaussianFilter, samples, GMSKVals, RX_BLOCK_SIZE); +#endif dstarRX.samples(GMSKVals, rssi, RX_BLOCK_SIZE); } } else if (m_modemState == STATE_DMR) { @@ -381,22 +396,32 @@ void CIO::process() } else if (m_modemState == STATE_YSF) { if (m_ysfEnable) { q15_t YSFVals[RX_BLOCK_SIZE]; +#if defined(USE_DCBLOCKER) ::arm_fir_fast_q15(&m_rrcFilter, dcSamples, YSFVals, RX_BLOCK_SIZE); - +#else + ::arm_fir_fast_q15(&m_rrcFilter, samples, YSFVals, RX_BLOCK_SIZE); +#endif ysfRX.samples(YSFVals, rssi, RX_BLOCK_SIZE); } } else if (m_modemState == STATE_P25) { if (m_p25Enable) { q15_t P25Vals[RX_BLOCK_SIZE]; +#if defined(USE_DCBLOCKER) ::arm_fir_fast_q15(&m_boxcarFilter, dcSamples, P25Vals, RX_BLOCK_SIZE); - +#else + ::arm_fir_fast_q15(&m_boxcarFilter, samples, P25Vals, RX_BLOCK_SIZE); +#endif p25RX.samples(P25Vals, rssi, RX_BLOCK_SIZE); } } else if (m_modemState == STATE_NXDN) { if (m_nxdnEnable) { - q15_t NXDNVals[RX_BLOCK_SIZE]; q15_t NXDNValsTmp[RX_BLOCK_SIZE]; +#if defined(USE_DCBLOCKER) ::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNValsTmp, RX_BLOCK_SIZE); +#else + ::arm_fir_fast_q15(&m_nxdnFilter, samples, NXDNValsTmp, RX_BLOCK_SIZE); +#endif + q15_t NXDNVals[RX_BLOCK_SIZE]; ::arm_fir_fast_q15(&m_nxdnISincFilter, NXDNValsTmp, NXDNVals, RX_BLOCK_SIZE); nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);