mirror of https://github.com/g4klx/MMDVM.git
Work on the DMO RX to improve synchronisation.
This commit is contained in:
parent
5efe222ec3
commit
8652f58c19
74
DMRDMORX.cpp
74
DMRDMORX.cpp
|
@ -118,20 +118,29 @@ bool CDMRDMORX::processSample(q15_t sample)
|
||||||
if (m_state == DMORXS_VOICE && m_dataPtr == m_syncPtr && m_rssiCount == 2U)
|
if (m_state == DMORXS_VOICE && m_dataPtr == m_syncPtr && m_rssiCount == 2U)
|
||||||
m_rssi = io.getRSSIValue();
|
m_rssi = io.getRSSIValue();
|
||||||
#endif
|
#endif
|
||||||
uint16_t min = m_syncPtr + DMO_BUFFER_LENGTH_SAMPLES - 1U;
|
uint16_t min = m_syncPtr + DMO_BUFFER_LENGTH_SAMPLES - 1U;
|
||||||
uint16_t max = m_syncPtr + 1U;
|
uint16_t max = m_syncPtr + 1U;
|
||||||
|
uint16_t max1 = m_syncPtr + 2U;
|
||||||
|
|
||||||
if (min >= DMO_BUFFER_LENGTH_SAMPLES)
|
if (min >= DMO_BUFFER_LENGTH_SAMPLES)
|
||||||
min -= DMO_BUFFER_LENGTH_SAMPLES;
|
min -= DMO_BUFFER_LENGTH_SAMPLES;
|
||||||
if (max >= DMO_BUFFER_LENGTH_SAMPLES)
|
if (max >= DMO_BUFFER_LENGTH_SAMPLES)
|
||||||
max -= DMO_BUFFER_LENGTH_SAMPLES;
|
max -= DMO_BUFFER_LENGTH_SAMPLES;
|
||||||
|
if (max1 >= DMO_BUFFER_LENGTH_SAMPLES)
|
||||||
|
max1 -= DMO_BUFFER_LENGTH_SAMPLES;
|
||||||
|
|
||||||
if (min < max) {
|
if (min < max) {
|
||||||
if (m_dataPtr >= min && m_dataPtr <= max)
|
if (m_dataPtr >= min && m_dataPtr <= max)
|
||||||
correlateSync(false);
|
correlateSync(false);
|
||||||
|
|
||||||
|
// if (m_dataPtr == max1 && m_control == CONTROL_NONE)
|
||||||
|
// correlateEMB();
|
||||||
} else {
|
} else {
|
||||||
if (m_dataPtr >= min || m_dataPtr <= max)
|
if (m_dataPtr >= min || m_dataPtr <= max)
|
||||||
correlateSync(false);
|
correlateSync(false);
|
||||||
|
|
||||||
|
// if (m_dataPtr == max1 && m_control == CONTROL_NONE)
|
||||||
|
// correlateEMB();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,6 +409,67 @@ void CDMRDMORX::correlateSync(bool first)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CDMRDMORX::correlateEMB()
|
||||||
|
{
|
||||||
|
uint16_t ptr = m_dataPtr + DMO_BUFFER_LENGTH_SAMPLES - DMR_SYNC_LENGTH_SAMPLES + DMR_RADIO_SYMBOL_LENGTH - 3U;
|
||||||
|
if (ptr >= DMO_BUFFER_LENGTH_SAMPLES)
|
||||||
|
ptr -= DMO_BUFFER_LENGTH_SAMPLES;
|
||||||
|
|
||||||
|
q15_t centre = (m_centre[0U] + m_centre[1U] + m_centre[2U] + m_centre[3U]) >> 2;
|
||||||
|
q15_t threshold = (m_threshold[0U] + m_threshold[1U] + m_threshold[2U] + m_threshold[3U]) >> 2;
|
||||||
|
|
||||||
|
bool correct[3U] = {false, false, false};
|
||||||
|
for (uint8_t i = 0U; i < 3U; i++) {
|
||||||
|
uint8_t emb[1U];
|
||||||
|
samplesToBits(ptr, DMR_EMB_LENGTH_SYMBOLS / 2U, emb, 0U, centre, threshold);
|
||||||
|
|
||||||
|
uint8_t cc = (emb[0U] & 0xF0U) >> 4;
|
||||||
|
uint8_t lcss = (emb[0U] & 0x06U) >> 1;
|
||||||
|
|
||||||
|
if (cc == m_colorCode && ((m_n == 0U && lcss == 1U) ||
|
||||||
|
(m_n == 1U && lcss == 3U) ||
|
||||||
|
(m_n == 2U && lcss == 3U) ||
|
||||||
|
(m_n == 3U && lcss == 2U) ||
|
||||||
|
(m_n == 4U && lcss == 0U))) {
|
||||||
|
correct[i] = true;
|
||||||
|
int16_t diff = m_syncPtr - ptr;
|
||||||
|
DEBUG4("DMRDMORX: ptr/emb/diff", ptr, cc, diff);
|
||||||
|
uint8_t pi = (emb[0U] & 0x08U) >> 3;
|
||||||
|
DEBUG4("DMRDMORX: pi/lcss/n", pi, lcss, m_n);
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr++;
|
||||||
|
if (ptr >= DMO_BUFFER_LENGTH_SAMPLES)
|
||||||
|
ptr -= DMO_BUFFER_LENGTH_SAMPLES;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (correct[1U]) {
|
||||||
|
// Prefer the status quo
|
||||||
|
return;
|
||||||
|
} else if (correct[0U]) {
|
||||||
|
// m_syncPtr--
|
||||||
|
m_syncPtr += DMO_BUFFER_LENGTH_SAMPLES - 1U;
|
||||||
|
} else if (correct[2U]) {
|
||||||
|
m_syncPtr++;
|
||||||
|
} else {
|
||||||
|
// No match, don't change anything
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_syncPtr >= DMO_BUFFER_LENGTH_SAMPLES)
|
||||||
|
m_syncPtr -= DMO_BUFFER_LENGTH_SAMPLES;
|
||||||
|
|
||||||
|
m_startPtr = m_dataPtr + DMO_BUFFER_LENGTH_SAMPLES - DMR_SLOT_TYPE_LENGTH_SAMPLES / 2U - DMR_INFO_LENGTH_SAMPLES / 2U - DMR_SYNC_LENGTH_SAMPLES;
|
||||||
|
if (m_startPtr >= DMO_BUFFER_LENGTH_SAMPLES)
|
||||||
|
m_startPtr -= DMO_BUFFER_LENGTH_SAMPLES;
|
||||||
|
|
||||||
|
m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_SAMPLES / 2U + DMR_INFO_LENGTH_SAMPLES / 2U - 1U;
|
||||||
|
if (m_endPtr >= DMO_BUFFER_LENGTH_SAMPLES)
|
||||||
|
m_endPtr -= DMO_BUFFER_LENGTH_SAMPLES;
|
||||||
|
|
||||||
|
DEBUG2("DMRDMORX: m_syncPtr", m_syncPtr);
|
||||||
|
}
|
||||||
|
|
||||||
void CDMRDMORX::samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold)
|
void CDMRDMORX::samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold)
|
||||||
{
|
{
|
||||||
for (uint8_t i = 0U; i < count; i++) {
|
for (uint8_t i = 0U; i < count; i++) {
|
||||||
|
|
|
@ -63,6 +63,7 @@ private:
|
||||||
|
|
||||||
bool processSample(q15_t sample);
|
bool processSample(q15_t sample);
|
||||||
void correlateSync(bool first);
|
void correlateSync(bool first);
|
||||||
|
void correlateEMB();
|
||||||
void samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold);
|
void samplesToBits(uint16_t start, uint8_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue