mirror of https://github.com/g4klx/MMDVM.git
Merge pull request #146 from juribeparada/nxdn
Add inverse SINC filter for NXDN demodulator
This commit is contained in:
commit
e43c992249
19
IO.cpp
19
IO.cpp
|
@ -40,6 +40,10 @@ static q15_t NXDN_0_2_FILTER[] = {284, 198, 73, -78, -240, -393, -517, -590, -59
|
||||||
-517, -393, -240, -78, 73, 198, 284, 0};
|
-517, -393, -240, -78, 73, 198, 284, 0};
|
||||||
const uint16_t NXDN_0_2_FILTER_LEN = 82U;
|
const uint16_t NXDN_0_2_FILTER_LEN = 82U;
|
||||||
|
|
||||||
|
static q15_t NXDN_ISINC_FILTER[] = {790, -1085, -1073, -553, 747, 2341, 3156, 2152, -893, -4915, -7834, -7536, -3102, 4441, 12354, 17394, 17394,
|
||||||
|
12354, 4441, -3102, -7536, -7834, -4915, -893, 2152, 3156, 2341, 747, -553, -1073, -1085, 790};
|
||||||
|
const uint16_t NXDN_ISINC_FILTER_LEN = 32U;
|
||||||
|
|
||||||
// Generated using gaussfir(0.5, 4, 5) in MATLAB
|
// Generated using gaussfir(0.5, 4, 5) in MATLAB
|
||||||
static q15_t GAUSSIAN_0_5_FILTER[] = {8, 104, 760, 3158, 7421, 9866, 7421, 3158, 760, 104, 8, 0};
|
static q15_t GAUSSIAN_0_5_FILTER[] = {8, 104, 760, 3158, 7421, 9866, 7421, 3158, 760, 104, 8, 0};
|
||||||
const uint16_t GAUSSIAN_0_5_FILTER_LEN = 12U;
|
const uint16_t GAUSSIAN_0_5_FILTER_LEN = 12U;
|
||||||
|
@ -61,11 +65,13 @@ m_dmrFilter(),
|
||||||
m_gaussianFilter(),
|
m_gaussianFilter(),
|
||||||
m_boxcarFilter(),
|
m_boxcarFilter(),
|
||||||
m_nxdnFilter(),
|
m_nxdnFilter(),
|
||||||
|
m_nxdnISincFilter(),
|
||||||
m_ysfFilter(),
|
m_ysfFilter(),
|
||||||
m_dmrState(),
|
m_dmrState(),
|
||||||
m_gaussianState(),
|
m_gaussianState(),
|
||||||
m_boxcarState(),
|
m_boxcarState(),
|
||||||
m_nxdnState(),
|
m_nxdnState(),
|
||||||
|
m_nxdnISincState(),
|
||||||
m_ysfState(),
|
m_ysfState(),
|
||||||
m_pttInvert(false),
|
m_pttInvert(false),
|
||||||
m_rxLevel(128 * 128),
|
m_rxLevel(128 * 128),
|
||||||
|
@ -89,6 +95,7 @@ m_lockout(false)
|
||||||
::memset(m_gaussianState, 0x00U, 40U * sizeof(q15_t));
|
::memset(m_gaussianState, 0x00U, 40U * sizeof(q15_t));
|
||||||
::memset(m_boxcarState, 0x00U, 30U * sizeof(q15_t));
|
::memset(m_boxcarState, 0x00U, 30U * sizeof(q15_t));
|
||||||
::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_ysfState, 0x00U, 70U * sizeof(q15_t));
|
::memset(m_ysfState, 0x00U, 70U * sizeof(q15_t));
|
||||||
::memset(m_dcState, 0x00U, 4U * sizeof(q31_t));
|
::memset(m_dcState, 0x00U, 4U * sizeof(q31_t));
|
||||||
|
|
||||||
|
@ -112,6 +119,10 @@ m_lockout(false)
|
||||||
m_nxdnFilter.numTaps = NXDN_0_2_FILTER_LEN;
|
m_nxdnFilter.numTaps = NXDN_0_2_FILTER_LEN;
|
||||||
m_nxdnFilter.pState = m_nxdnState;
|
m_nxdnFilter.pState = m_nxdnState;
|
||||||
m_nxdnFilter.pCoeffs = NXDN_0_2_FILTER;
|
m_nxdnFilter.pCoeffs = NXDN_0_2_FILTER;
|
||||||
|
|
||||||
|
m_nxdnISincFilter.numTaps = NXDN_ISINC_FILTER_LEN;
|
||||||
|
m_nxdnISincFilter.pState = m_nxdnISincState;
|
||||||
|
m_nxdnISincFilter.pCoeffs = NXDN_ISINC_FILTER;
|
||||||
|
|
||||||
m_ysfFilter.numTaps = RRC_0_2_FILTER_LEN;
|
m_ysfFilter.numTaps = RRC_0_2_FILTER_LEN;
|
||||||
m_ysfFilter.pState = m_ysfState;
|
m_ysfFilter.pState = m_ysfState;
|
||||||
|
@ -331,7 +342,9 @@ void CIO::process()
|
||||||
|
|
||||||
if (m_nxdnEnable) {
|
if (m_nxdnEnable) {
|
||||||
q15_t NXDNVals[RX_BLOCK_SIZE];
|
q15_t NXDNVals[RX_BLOCK_SIZE];
|
||||||
::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNVals, RX_BLOCK_SIZE);
|
q15_t NXDNValsTmp[RX_BLOCK_SIZE];
|
||||||
|
::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNValsTmp, RX_BLOCK_SIZE);
|
||||||
|
::arm_fir_fast_q15(&m_nxdnISincFilter, NXDNValsTmp, NXDNVals, RX_BLOCK_SIZE);
|
||||||
|
|
||||||
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
@ -391,7 +404,9 @@ void CIO::process()
|
||||||
} else if (m_modemState == STATE_NXDN) {
|
} else if (m_modemState == STATE_NXDN) {
|
||||||
if (m_nxdnEnable) {
|
if (m_nxdnEnable) {
|
||||||
q15_t NXDNVals[RX_BLOCK_SIZE];
|
q15_t NXDNVals[RX_BLOCK_SIZE];
|
||||||
::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNVals, RX_BLOCK_SIZE);
|
q15_t NXDNValsTmp[RX_BLOCK_SIZE];
|
||||||
|
::arm_fir_fast_q15(&m_nxdnFilter, dcSamples, NXDNValsTmp, RX_BLOCK_SIZE);
|
||||||
|
::arm_fir_fast_q15(&m_nxdnISincFilter, NXDNValsTmp, NXDNVals, RX_BLOCK_SIZE);
|
||||||
|
|
||||||
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
nxdnRX.samples(NXDNVals, rssi, RX_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
|
2
IO.h
2
IO.h
|
@ -70,11 +70,13 @@ private:
|
||||||
arm_fir_instance_q15 m_gaussianFilter;
|
arm_fir_instance_q15 m_gaussianFilter;
|
||||||
arm_fir_instance_q15 m_boxcarFilter;
|
arm_fir_instance_q15 m_boxcarFilter;
|
||||||
arm_fir_instance_q15 m_nxdnFilter;
|
arm_fir_instance_q15 m_nxdnFilter;
|
||||||
|
arm_fir_instance_q15 m_nxdnISincFilter;
|
||||||
arm_fir_instance_q15 m_ysfFilter;
|
arm_fir_instance_q15 m_ysfFilter;
|
||||||
q15_t m_dmrState[70U]; // NoTaps + BlockSize - 1, 42 + 20 - 1 plus some spare
|
q15_t m_dmrState[70U]; // NoTaps + BlockSize - 1, 42 + 20 - 1 plus some spare
|
||||||
q15_t m_gaussianState[40U]; // NoTaps + BlockSize - 1, 12 + 20 - 1 plus some spare
|
q15_t m_gaussianState[40U]; // NoTaps + BlockSize - 1, 12 + 20 - 1 plus some spare
|
||||||
q15_t m_boxcarState[30U]; // NoTaps + BlockSize - 1, 6 + 20 - 1 plus some spare
|
q15_t m_boxcarState[30U]; // NoTaps + BlockSize - 1, 6 + 20 - 1 plus some spare
|
||||||
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_ysfState[70U]; // NoTaps + BlockSize - 1, 42 + 20 - 1 plus some spare
|
q15_t m_ysfState[70U]; // NoTaps + BlockSize - 1, 42 + 20 - 1 plus some spare
|
||||||
|
|
||||||
bool m_pttInvert;
|
bool m_pttInvert;
|
||||||
|
|
Loading…
Reference in New Issue