Add input audio delay to match the CTCSS decoder results.

This commit is contained in:
Jonathan Naylor 2020-05-09 13:01:02 +01:00
parent fa29a27695
commit 3bb7cde322
2 changed files with 17 additions and 0 deletions

14
FM.cpp
View File

@ -46,8 +46,10 @@ m_cosInvert(false),
m_rfAudioBoost(1U), m_rfAudioBoost(1U),
m_downsampler(128U),//Size might need adjustement m_downsampler(128U),//Size might need adjustement
m_rxLevel(1), m_rxLevel(1),
m_inputRB(4800U), // 200ms of audio
m_outputRB(2400U) // 100ms of audio m_outputRB(2400U) // 100ms of audio
{ {
insertDelay(100U);
} }
void CFM::samples(bool cos, const q15_t* samples, uint8_t length) void CFM::samples(bool cos, const q15_t* samples, uint8_t length)
@ -68,6 +70,10 @@ void CFM::samples(bool cos, const q15_t* samples, uint8_t length)
uint8_t ctcssState = m_ctcssRX.process(currentSample); uint8_t ctcssState = m_ctcssRX.process(currentSample);
// Delay the audio by 100ms to better match the CTCSS detector output
m_inputRB.put(currentSample);
m_inputRB.get(currentSample);
if (CTCSS_NOT_READY(ctcssState) && m_modemState != STATE_FM) { if (CTCSS_NOT_READY(ctcssState) && m_modemState != STATE_FM) {
//Not enough samples to determine if you have CTCSS, just carry on //Not enough samples to determine if you have CTCSS, just carry on
continue; continue;
@ -462,6 +468,14 @@ void CFM::beginRelaying()
m_ackMinTimer.start(); m_ackMinTimer.start();
} }
void CFM::insertDelay(uint16_t ms)
{
uint32_t nSamples = ms * 24U;
for (uint32_t i = 0U; i < nSamples; i++)
m_inputRB.put(0);
}
void CFM::insertSilence(uint16_t ms) void CFM::insertSilence(uint16_t ms)
{ {
uint32_t nSamples = ms * 24U; uint32_t nSamples = ms * 24U;

3
FM.h
View File

@ -84,6 +84,7 @@ private:
q15_t m_rfAudioBoost; q15_t m_rfAudioBoost;
CFMDownsampler m_downsampler; CFMDownsampler m_downsampler;
q15_t m_rxLevel; q15_t m_rxLevel;
CFMRB m_inputRB;
CFMRB m_outputRB; CFMRB m_outputRB;
void stateMachine(bool validSignal); void stateMachine(bool validSignal);
@ -99,6 +100,8 @@ private:
void sendCallsign(); void sendCallsign();
void beginRelaying(); void beginRelaying();
void insertDelay(uint16_t ms);
void insertSilence(uint16_t ms); void insertSilence(uint16_t ms);
}; };