Fixed bug in M17 demodulator causing the M17Demodulator::getFrame() function to return the frame currently being processed instead of the fully demodulated one.
This commit is contained in:
parent
63f4c787c0
commit
bfa3494777
|
|
@ -142,10 +142,9 @@ private:
|
||||||
streamId basebandId; ///< Id of the baseband input stream.
|
streamId basebandId; ///< Id of the baseband input stream.
|
||||||
int16_t *baseband_buffer; ///< Buffer for baseband audio handling.
|
int16_t *baseband_buffer; ///< Buffer for baseband audio handling.
|
||||||
dataBlock_t baseband; ///< Half buffer, free to be processed.
|
dataBlock_t baseband; ///< Half buffer, free to be processed.
|
||||||
uint16_t *rawFrame; ///< Analog values to be quantized.
|
|
||||||
uint16_t frame_index; ///< Index for filling the raw frame.
|
uint16_t frame_index; ///< Index for filling the raw frame.
|
||||||
frame_t *activeFrame; ///< Half frame, in demodulation.
|
frame_t *demodFrame; ///< Frame being demodulated.
|
||||||
frame_t *idleFrame; ///< Half frame, free to be processed.
|
frame_t *readyFrame; ///< Fully demodulated frame to be returned.
|
||||||
bool syncDetected; ///< A syncword was detected.
|
bool syncDetected; ///< A syncword was detected.
|
||||||
bool locked; ///< A syncword was correctly demodulated.
|
bool locked; ///< A syncword was correctly demodulated.
|
||||||
bool newFrame; ///< A new frame has been fully decoded.
|
bool newFrame; ///< A new frame has been fully decoded.
|
||||||
|
|
|
||||||
|
|
@ -169,9 +169,8 @@ void M17Demodulator::init()
|
||||||
|
|
||||||
baseband_buffer = new int16_t[2 * M17_SAMPLE_BUF_SIZE];
|
baseband_buffer = new int16_t[2 * M17_SAMPLE_BUF_SIZE];
|
||||||
baseband = { nullptr, 0 };
|
baseband = { nullptr, 0 };
|
||||||
activeFrame = new frame_t;
|
demodFrame = new frame_t;
|
||||||
rawFrame = new uint16_t[M17_FRAME_SYMBOLS];
|
readyFrame = new frame_t;
|
||||||
idleFrame = new frame_t;
|
|
||||||
frame_index = 0;
|
frame_index = 0;
|
||||||
phase = 0;
|
phase = 0;
|
||||||
syncDetected = false;
|
syncDetected = false;
|
||||||
|
|
@ -195,9 +194,8 @@ void M17Demodulator::terminate()
|
||||||
|
|
||||||
// Delete the buffers and deallocate memory.
|
// Delete the buffers and deallocate memory.
|
||||||
delete[] baseband_buffer;
|
delete[] baseband_buffer;
|
||||||
delete activeFrame;
|
delete demodFrame;
|
||||||
delete[] rawFrame;
|
delete readyFrame;
|
||||||
delete idleFrame;
|
|
||||||
|
|
||||||
#ifdef ENABLE_DEMOD_LOG
|
#ifdef ENABLE_DEMOD_LOG
|
||||||
logRunning = false;
|
logRunning = false;
|
||||||
|
|
@ -327,7 +325,7 @@ sync_t M17Demodulator::nextFrameSync(int32_t offset)
|
||||||
log.qnt_neg_avg = 0.0;
|
log.qnt_neg_avg = 0.0;
|
||||||
log.symbol = 0;
|
log.symbol = 0;
|
||||||
log.frame_index = 0;
|
log.frame_index = 0;
|
||||||
log.flags = 0;//1;
|
log.flags = 1;
|
||||||
|
|
||||||
pushLog(log);
|
pushLog(log);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -370,7 +368,7 @@ const frame_t& M17Demodulator::getFrame()
|
||||||
{
|
{
|
||||||
// When a frame is read is not new anymore
|
// When a frame is read is not new anymore
|
||||||
newFrame = false;
|
newFrame = false;
|
||||||
return *activeFrame;
|
return *readyFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool M17Demodulator::isLocked()
|
bool M17Demodulator::isLocked()
|
||||||
|
|
@ -404,7 +402,7 @@ int32_t M17Demodulator::syncwordSweep(int32_t offset)
|
||||||
log.qnt_neg_avg = 0.0;
|
log.qnt_neg_avg = 0.0;
|
||||||
log.symbol = 0;
|
log.symbol = 0;
|
||||||
log.frame_index = 0;
|
log.frame_index = 0;
|
||||||
log.flags = 0;//2;
|
log.flags = 2;
|
||||||
|
|
||||||
pushLog(log);
|
pushLog(log);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -415,6 +413,7 @@ int32_t M17Demodulator::syncwordSweep(int32_t offset)
|
||||||
max_index = i;
|
max_index = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return max_index;
|
return max_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -447,11 +446,12 @@ bool M17Demodulator::update()
|
||||||
if (!syncDetected)
|
if (!syncDetected)
|
||||||
{
|
{
|
||||||
syncword = nextFrameSync(phase);
|
syncword = nextFrameSync(phase);
|
||||||
|
|
||||||
if (syncword.index != -1) // Valid syncword found
|
if (syncword.index != -1) // Valid syncword found
|
||||||
{
|
{
|
||||||
syncDetected = true;
|
|
||||||
phase = syncword.index + 1;
|
phase = syncword.index + 1;
|
||||||
frame_index = 0;
|
syncDetected = true;
|
||||||
|
frame_index = 0;
|
||||||
decoded_syms = 0;
|
decoded_syms = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -484,40 +484,37 @@ bool M17Demodulator::update()
|
||||||
log.qnt_neg_avg = qnt_neg_avg / 1.5f;
|
log.qnt_neg_avg = qnt_neg_avg / 1.5f;
|
||||||
log.symbol = symbol;
|
log.symbol = symbol;
|
||||||
log.frame_index = frame_index;
|
log.frame_index = frame_index;
|
||||||
log.flags = 0;
|
log.flags = 3;
|
||||||
if(i == 0) log.flags = 1;
|
if(i == 0) log.flags += 8;
|
||||||
|
|
||||||
pushLog(log);
|
pushLog(log);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setSymbol(*activeFrame, frame_index, symbol);
|
setSymbol(*demodFrame, frame_index, symbol);
|
||||||
decoded_syms++;
|
decoded_syms++;
|
||||||
frame_index++;
|
frame_index++;
|
||||||
|
|
||||||
if (frame_index == M17_SYNCWORD_SYMBOLS)
|
if (frame_index == M17_SYNCWORD_SYMBOLS)
|
||||||
{
|
{
|
||||||
// If syncword is not valid, lock is lost, accept 2 bit errors
|
// If syncword is not valid, lock is lost, accept 2 bit errors
|
||||||
uint8_t hammingSync = hammingDistance((*activeFrame)[0],
|
uint8_t hammingSync = hammingDistance((*demodFrame)[0],
|
||||||
STREAM_SYNC_WORD[0])
|
STREAM_SYNC_WORD[0])
|
||||||
+ hammingDistance((*activeFrame)[1],
|
+ hammingDistance((*demodFrame)[1],
|
||||||
STREAM_SYNC_WORD[1]);
|
STREAM_SYNC_WORD[1]);
|
||||||
|
|
||||||
uint8_t hammingLsf = hammingDistance((*activeFrame)[0],
|
uint8_t hammingLsf = hammingDistance((*demodFrame)[0],
|
||||||
LSF_SYNC_WORD[0])
|
LSF_SYNC_WORD[0])
|
||||||
+ hammingDistance((*activeFrame)[1],
|
+ hammingDistance((*demodFrame)[1],
|
||||||
LSF_SYNC_WORD[1]);
|
LSF_SYNC_WORD[1]);
|
||||||
|
|
||||||
// Too many errors in the syncword, lock is lost
|
// Too many errors in the syncword, lock is lost
|
||||||
if ((hammingSync > 2) && (hammingLsf > 2))
|
if ((hammingSync > 2) && (hammingLsf > 2))
|
||||||
{
|
{
|
||||||
syncDetected = false;
|
syncDetected = false;
|
||||||
locked = false;
|
locked = false;
|
||||||
std::swap(activeFrame, idleFrame);
|
phase = 0;
|
||||||
frame_index = 0;
|
|
||||||
newFrame = true;
|
|
||||||
phase = 0;
|
|
||||||
|
|
||||||
#ifdef ENABLE_DEMOD_LOG
|
#ifdef ENABLE_DEMOD_LOG
|
||||||
// Pre-arm the log trigger.
|
// Pre-arm the log trigger.
|
||||||
|
|
@ -554,21 +551,23 @@ bool M17Demodulator::update()
|
||||||
phase += sync_skew;
|
phase += sync_skew;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the frame buffer is full switch active and idle frame
|
// If the frame buffer is full switch demod and ready frame
|
||||||
if (frame_index == M17_FRAME_SYMBOLS)
|
if (frame_index == M17_FRAME_SYMBOLS)
|
||||||
{
|
{
|
||||||
std::swap(activeFrame, idleFrame);
|
std::swap(demodFrame, readyFrame);
|
||||||
frame_index = 0;
|
frame_index = 0;
|
||||||
newFrame = true;
|
newFrame = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy last N samples to bridge buffer
|
// Copy last N samples to bridge buffer
|
||||||
memcpy(basebandBridge,
|
memcpy(basebandBridge,
|
||||||
baseband.data + (baseband.len - M17_BRIDGE_SIZE),
|
baseband.data + (baseband.len - M17_BRIDGE_SIZE),
|
||||||
sizeof(int16_t) * M17_BRIDGE_SIZE);
|
sizeof(int16_t) * M17_BRIDGE_SIZE);
|
||||||
}
|
}
|
||||||
#ifdef PLATFORM_LINUX
|
|
||||||
|
#if defined(PLATFORM_LINUX) && defined(ENABLE_DEMOD_LOG)
|
||||||
if (baseband.data == NULL)
|
if (baseband.data == NULL)
|
||||||
dumpData = true;
|
dumpData = true;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue