mirror of https://github.com/g4klx/MMDVM.git
Add the boxcar filter as an option for NXDN.
This commit is contained in:
parent
99d2a0d822
commit
46c0958704
6
Config.h
6
Config.h
|
@ -33,12 +33,12 @@
|
||||||
// Enable System Fusion support
|
// Enable System Fusion support
|
||||||
#define MODE_YSF
|
#define MODE_YSF
|
||||||
|
|
||||||
// Enable P25 phase 1 support, the boxcar filter sometimes improves the performance of P25 receive on some systems.
|
// Enable P25 phase 1 support.
|
||||||
#define MODE_P25
|
#define MODE_P25
|
||||||
#define USE_P25_BOXCAR
|
|
||||||
|
|
||||||
// Enable NXDN support
|
// Enable NXDN support, the boxcar filter sometimes improves the performance of P25 receive on some systems
|
||||||
#define MODE_NXDN
|
#define MODE_NXDN
|
||||||
|
#define USE_NXDN_BOXCAR
|
||||||
|
|
||||||
// Enable M17 support
|
// Enable M17 support
|
||||||
#define MODE_M17
|
#define MODE_M17
|
||||||
|
|
66
IO.cpp
66
IO.cpp
|
@ -45,6 +45,11 @@ const uint16_t RRC_0_5_FILTER_LEN = 42U;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MODE_NXDN)
|
#if defined(MODE_NXDN)
|
||||||
|
#if defined(USE_NXDN_BOXCAR)
|
||||||
|
// One symbol boxcar filter
|
||||||
|
static q15_t BOXCAR10_FILTER[] = {6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000};
|
||||||
|
const uint16_t BOXCAR10_FILTER_LEN = 10U;
|
||||||
|
#else
|
||||||
// Generated using rcosdesign(0.2, 8, 10, 'sqrt') in MATLAB
|
// Generated using rcosdesign(0.2, 8, 10, 'sqrt') in MATLAB
|
||||||
static q15_t NXDN_0_2_FILTER[] = {284, 198, 73, -78, -240, -393, -517, -590, -599, -533, -391, -181, 79, 364, 643, 880, 1041, 1097, 1026, 819,
|
static q15_t NXDN_0_2_FILTER[] = {284, 198, 73, -78, -240, -393, -517, -590, -599, -533, -391, -181, 79, 364, 643, 880, 1041, 1097, 1026, 819,
|
||||||
483, 39, -477, -1016, -1516, -1915, -2150, -2164, -1914, -1375, -545, 557, 1886, 3376, 4946, 6502, 7946, 9184,
|
483, 39, -477, -1016, -1516, -1915, -2150, -2164, -1914, -1375, -545, 557, 1886, 3376, 4946, 6502, 7946, 9184,
|
||||||
|
@ -57,6 +62,7 @@ static q15_t NXDN_ISINC_FILTER[] = {790, -1085, -1073, -553, 747, 2341, 3156, 21
|
||||||
12354, 4441, -3102, -7536, -7834, -4915, -893, 2152, 3156, 2341, 747, -553, -1073, -1085, 790};
|
12354, 4441, -3102, -7536, -7834, -4915, -893, 2152, 3156, 2341, 747, -553, -1073, -1085, 790};
|
||||||
const uint16_t NXDN_ISINC_FILTER_LEN = 32U;
|
const uint16_t NXDN_ISINC_FILTER_LEN = 32U;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MODE_DSTAR)
|
#if defined(MODE_DSTAR)
|
||||||
// Generated using gaussfir(0.5, 4, 5) in MATLAB
|
// Generated using gaussfir(0.5, 4, 5) in MATLAB
|
||||||
|
@ -66,8 +72,8 @@ const uint16_t GAUSSIAN_0_5_FILTER_LEN = 12U;
|
||||||
|
|
||||||
#if defined(MODE_P25)
|
#if defined(MODE_P25)
|
||||||
// One symbol boxcar filter
|
// One symbol boxcar filter
|
||||||
static q15_t BOXCAR_FILTER[] = {12000, 12000, 12000, 12000, 12000, 0};
|
static q15_t BOXCAR5_FILTER[] = {12000, 12000, 12000, 12000, 12000, 0};
|
||||||
const uint16_t BOXCAR_FILTER_LEN = 6U;
|
const uint16_t BOXCAR5_FILTER_LEN = 6U;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const uint16_t DC_OFFSET = 2048U;
|
const uint16_t DC_OFFSET = 2048U;
|
||||||
|
@ -90,15 +96,20 @@ m_rrc02Filter(),
|
||||||
m_rrc02State(),
|
m_rrc02State(),
|
||||||
#endif
|
#endif
|
||||||
#if defined(MODE_P25)
|
#if defined(MODE_P25)
|
||||||
m_boxcarFilter(),
|
m_boxcar5Filter(),
|
||||||
m_boxcarState(),
|
m_boxcar5State(),
|
||||||
#endif
|
#endif
|
||||||
#if defined(MODE_NXDN)
|
#if defined(MODE_NXDN)
|
||||||
|
#if defined(USE_NXDN_BOXCAR)
|
||||||
|
m_boxcar10Filter(),
|
||||||
|
m_boxcar10State(),
|
||||||
|
#else
|
||||||
m_nxdnFilter(),
|
m_nxdnFilter(),
|
||||||
m_nxdnISincFilter(),
|
m_nxdnISincFilter(),
|
||||||
m_nxdnState(),
|
m_nxdnState(),
|
||||||
m_nxdnISincState(),
|
m_nxdnISincState(),
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#if defined(MODE_M17)
|
#if defined(MODE_M17)
|
||||||
m_rrc05Filter(),
|
m_rrc05Filter(),
|
||||||
m_rrc05State(),
|
m_rrc05State(),
|
||||||
|
@ -149,13 +160,19 @@ m_lockout(false)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MODE_P25)
|
#if defined(MODE_P25)
|
||||||
::memset(m_boxcarState, 0x00U, 30U * sizeof(q15_t));
|
::memset(m_boxcar5State, 0x00U, 30U * sizeof(q15_t));
|
||||||
m_boxcarFilter.numTaps = BOXCAR_FILTER_LEN;
|
m_boxcar5Filter.numTaps = BOXCAR5_FILTER_LEN;
|
||||||
m_boxcarFilter.pState = m_boxcarState;
|
m_boxcar5Filter.pState = m_boxcar5State;
|
||||||
m_boxcarFilter.pCoeffs = BOXCAR_FILTER;
|
m_boxcar5Filter.pCoeffs = BOXCAR5_FILTER;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MODE_NXDN)
|
#if defined(MODE_NXDN)
|
||||||
|
#if defined(USE_NXDN_BOXCAR)
|
||||||
|
::memset(m_boxcar10State, 0x00U, 40U * sizeof(q15_t));
|
||||||
|
m_boxcar10Filter.numTaps = BOXCAR10_FILTER_LEN;
|
||||||
|
m_boxcar10Filter.pState = m_boxcar10State;
|
||||||
|
m_boxcar10Filter.pCoeffs = BOXCAR10_FILTER;
|
||||||
|
#else
|
||||||
::memset(m_nxdnState, 0x00U, 110U * sizeof(q15_t));
|
::memset(m_nxdnState, 0x00U, 110U * sizeof(q15_t));
|
||||||
::memset(m_nxdnISincState, 0x00U, 60U * sizeof(q15_t));
|
::memset(m_nxdnISincState, 0x00U, 60U * sizeof(q15_t));
|
||||||
|
|
||||||
|
@ -167,6 +184,7 @@ m_lockout(false)
|
||||||
m_nxdnISincFilter.pState = m_nxdnISincState;
|
m_nxdnISincFilter.pState = m_nxdnISincState;
|
||||||
m_nxdnISincFilter.pCoeffs = NXDN_ISINC_FILTER;
|
m_nxdnISincFilter.pCoeffs = NXDN_ISINC_FILTER;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MODE_M17)
|
#if defined(MODE_M17)
|
||||||
::memset(m_rrc05State, 0x00U, 70U * sizeof(q15_t));
|
::memset(m_rrc05State, 0x00U, 70U * sizeof(q15_t));
|
||||||
|
@ -407,9 +425,9 @@ void CIO::process()
|
||||||
if (m_p25Enable) {
|
if (m_p25Enable) {
|
||||||
q15_t P25Vals[RX_BLOCK_SIZE];
|
q15_t P25Vals[RX_BLOCK_SIZE];
|
||||||
#if defined(USE_DCBLOCKER)
|
#if defined(USE_DCBLOCKER)
|
||||||
::arm_fir_fast_q15(&m_boxcarFilter, dcSamples, P25Vals, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_boxcar5Filter, dcSamples, P25Vals, RX_BLOCK_SIZE);
|
||||||
#else
|
#else
|
||||||
::arm_fir_fast_q15(&m_boxcarFilter, samples, P25Vals, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_boxcar5Filter, samples, P25Vals, RX_BLOCK_SIZE);
|
||||||
#endif
|
#endif
|
||||||
p25RX.samples(P25Vals, rssi, RX_BLOCK_SIZE);
|
p25RX.samples(P25Vals, rssi, RX_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
@ -417,15 +435,22 @@ void CIO::process()
|
||||||
|
|
||||||
#if defined(MODE_NXDN)
|
#if defined(MODE_NXDN)
|
||||||
if (m_nxdnEnable) {
|
if (m_nxdnEnable) {
|
||||||
|
q15_t NXDNVals[RX_BLOCK_SIZE];
|
||||||
|
#if defined(USE_NXDN_BOXCAR)
|
||||||
|
#if defined(USE_DCBLOCKER)
|
||||||
|
::arm_fir_fast_q15(&m_boxcar10Filter, dcSamples, NXDNVals, RX_BLOCK_SIZE);
|
||||||
|
#else
|
||||||
|
::arm_fir_fast_q15(&m_boxcar10Filter, samples, NXDNVals, RX_BLOCK_SIZE);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
q15_t NXDNValsTmp[RX_BLOCK_SIZE];
|
q15_t NXDNValsTmp[RX_BLOCK_SIZE];
|
||||||
#if defined(USE_DCBLOCKER)
|
#if defined(USE_DCBLOCKER)
|
||||||
::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNValsTmp, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNValsTmp, RX_BLOCK_SIZE);
|
||||||
#else
|
#else
|
||||||
::arm_fir_fast_q15(&m_nxdnFilter, samples, NXDNValsTmp, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_nxdnFilter, samples, NXDNValsTmp, RX_BLOCK_SIZE);
|
||||||
#endif
|
#endif
|
||||||
q15_t NXDNVals[RX_BLOCK_SIZE];
|
|
||||||
::arm_fir_fast_q15(&m_nxdnISincFilter, NXDNValsTmp, NXDNVals, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_nxdnISincFilter, NXDNValsTmp, NXDNVals, RX_BLOCK_SIZE);
|
||||||
|
#endif
|
||||||
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -540,9 +565,9 @@ void CIO::process()
|
||||||
if (m_p25Enable) {
|
if (m_p25Enable) {
|
||||||
q15_t P25Vals[RX_BLOCK_SIZE];
|
q15_t P25Vals[RX_BLOCK_SIZE];
|
||||||
#if defined(USE_DCBLOCKER)
|
#if defined(USE_DCBLOCKER)
|
||||||
::arm_fir_fast_q15(&m_boxcarFilter, dcSamples, P25Vals, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_boxcar5Filter, dcSamples, P25Vals, RX_BLOCK_SIZE);
|
||||||
#else
|
#else
|
||||||
::arm_fir_fast_q15(&m_boxcarFilter, samples, P25Vals, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_boxcar5Filter, samples, P25Vals, RX_BLOCK_SIZE);
|
||||||
#endif
|
#endif
|
||||||
p25RX.samples(P25Vals, rssi, RX_BLOCK_SIZE);
|
p25RX.samples(P25Vals, rssi, RX_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
@ -552,15 +577,22 @@ void CIO::process()
|
||||||
#if defined(MODE_NXDN)
|
#if defined(MODE_NXDN)
|
||||||
else if (m_modemState == STATE_NXDN) {
|
else if (m_modemState == STATE_NXDN) {
|
||||||
if (m_nxdnEnable) {
|
if (m_nxdnEnable) {
|
||||||
|
q15_t NXDNVals[RX_BLOCK_SIZE];
|
||||||
|
#if defined(USE_NXDN_BOXCAR)
|
||||||
|
#if defined(USE_DCBLOCKER)
|
||||||
|
::arm_fir_fast_q15(&m_boxcar10Filter, dcSamples, NXDNVals, RX_BLOCK_SIZE);
|
||||||
|
#else
|
||||||
|
::arm_fir_fast_q15(&m_boxcar10Filter, samples, NXDNVals, RX_BLOCK_SIZE);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
q15_t NXDNValsTmp[RX_BLOCK_SIZE];
|
q15_t NXDNValsTmp[RX_BLOCK_SIZE];
|
||||||
#if defined(USE_DCBLOCKER)
|
#if defined(USE_DCBLOCKER)
|
||||||
::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNValsTmp, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNValsTmp, RX_BLOCK_SIZE);
|
||||||
#else
|
#else
|
||||||
::arm_fir_fast_q15(&m_nxdnFilter, samples, NXDNValsTmp, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_nxdnFilter, samples, NXDNValsTmp, RX_BLOCK_SIZE);
|
||||||
#endif
|
#endif
|
||||||
q15_t NXDNVals[RX_BLOCK_SIZE];
|
|
||||||
::arm_fir_fast_q15(&m_nxdnISincFilter, NXDNValsTmp, NXDNVals, RX_BLOCK_SIZE);
|
::arm_fir_fast_q15(&m_nxdnISincFilter, NXDNValsTmp, NXDNVals, RX_BLOCK_SIZE);
|
||||||
|
#endif
|
||||||
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
9
IO.h
9
IO.h
|
@ -87,16 +87,21 @@ private:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MODE_P25)
|
#if defined(MODE_P25)
|
||||||
arm_fir_instance_q15 m_boxcarFilter;
|
arm_fir_instance_q15 m_boxcar5Filter;
|
||||||
q15_t m_boxcarState[30U]; // NoTaps + BlockSize - 1, 6 + 20 - 1 plus some spare
|
q15_t m_boxcar5State[30U]; // NoTaps + BlockSize - 1, 6 + 20 - 1 plus some spare
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MODE_NXDN)
|
#if defined(MODE_NXDN)
|
||||||
|
#if defined(USE_NXDN_BOXCAR)
|
||||||
|
arm_fir_instance_q15 m_boxcar10Filter;
|
||||||
|
q15_t m_boxcar10State[40U]; // NoTaps + BlockSize - 1, 10 + 20 - 1 plus some spare
|
||||||
|
#else
|
||||||
arm_fir_instance_q15 m_nxdnFilter;
|
arm_fir_instance_q15 m_nxdnFilter;
|
||||||
arm_fir_instance_q15 m_nxdnISincFilter;
|
arm_fir_instance_q15 m_nxdnISincFilter;
|
||||||
q15_t m_nxdnState[110U]; // NoTaps + BlockSize - 1, 82 + 20 - 1 plus some spare
|
q15_t m_nxdnState[110U]; // NoTaps + BlockSize - 1, 82 + 20 - 1 plus some spare
|
||||||
q15_t m_nxdnISincState[60U]; // NoTaps + BlockSize - 1, 32 + 20 - 1 plus some spare
|
q15_t m_nxdnISincState[60U]; // NoTaps + BlockSize - 1, 32 + 20 - 1 plus some spare
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MODE_M17)
|
#if defined(MODE_M17)
|
||||||
arm_fir_instance_q15 m_rrc05Filter;
|
arm_fir_instance_q15 m_rrc05Filter;
|
||||||
|
|
Loading…
Reference in New Issue