1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-26 17:58:43 -05:00

FreeDV demod: collect some statistics

This commit is contained in:
f4exb 2019-02-27 13:57:38 +01:00
parent b4bd35fc21
commit 96b72667b5
2 changed files with 76 additions and 1 deletions

View File

@ -46,6 +46,54 @@ MESSAGE_CLASS_DEFINITION(FreeDVDemod::MsgConfigureChannelizer, Message)
const QString FreeDVDemod::m_channelIdURI = "sdrangel.channel.freedvdemod"; const QString FreeDVDemod::m_channelIdURI = "sdrangel.channel.freedvdemod";
const QString FreeDVDemod::m_channelId = "FreeDVDemod"; const QString FreeDVDemod::m_channelId = "FreeDVDemod";
FreeDVDemod::FreeDVStats::FreeDVStats()
{
init();
}
void FreeDVDemod::FreeDVStats::init()
{
m_sync = 0;
m_snrEst = -20;
m_clockOffset = 0;
m_freqOffset = 0;
m_syncMetric = 0;
m_totalBitErrors = 0;
m_lastTotalBitErrors = 0;
m_ber = 0;
m_frameCount = 0;
m_berFrameCount = 0;
m_fps = 1;
}
void FreeDVDemod::FreeDVStats::collect(struct freedv *freeDV)
{
struct MODEM_STATS stats;
freedv_get_modem_extended_stats(freeDV, &stats);
m_totalBitErrors = freedv_get_total_bit_errors(freeDV);
m_clockOffset = stats.clock_offset;
m_freqOffset = stats.foff;
m_syncMetric = stats.sync_metric;
m_sync = stats.sync;
m_snrEst = stats.snr_est;
if (m_berFrameCount >= m_fps)
{
m_ber = m_totalBitErrors - m_lastTotalBitErrors;
m_ber = m_ber < 0 ? 0 : m_ber;
m_berFrameCount = 0;
m_lastTotalBitErrors = m_totalBitErrors;
}
m_berFrameCount++;
m_frameCount++;
qDebug("FreeDVStats::collect: demod sync: %d sync metric: %f demod snr: %3.2f dB BER: %d clock offset: %f freq offset: %f",
m_sync, m_syncMetric, m_snrEst, m_ber, m_clockOffset, m_freqOffset);
}
FreeDVDemod::FreeDVDemod(DeviceSourceAPI *deviceAPI) : FreeDVDemod::FreeDVDemod(DeviceSourceAPI *deviceAPI) :
ChannelSinkAPI(m_channelIdURI), ChannelSinkAPI(m_channelIdURI),
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
@ -324,6 +372,7 @@ void FreeDVDemod::pushSampleToDV(int16_t sample)
if (m_iModem == m_nin) if (m_iModem == m_nin)
{ {
int nout = freedv_rx(m_freeDV, m_speechOut, m_modIn); int nout = freedv_rx(m_freeDV, m_speechOut, m_modIn);
m_freeDVStats.collect(m_freeDV);
for (int i = 0; i < nout; i++) for (int i = 0; i < nout; i++)
{ {
@ -494,6 +543,11 @@ void FreeDVDemod::applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode)
int nMaxModemSamples = freedv_get_n_max_modem_samples(m_freeDV); int nMaxModemSamples = freedv_get_n_max_modem_samples(m_freeDV);
int Fs = freedv_get_modem_sample_rate(m_freeDV); int Fs = freedv_get_modem_sample_rate(m_freeDV);
int Rs = freedv_get_modem_symbol_rate(m_freeDV); int Rs = freedv_get_modem_symbol_rate(m_freeDV);
m_freeDVStats.init();
if (m_nin > 0) {
m_freeDVStats.m_fps = m_modemSampleRate / m_nin;
}
if (nSpeechSamples != m_nSpeechSamples) if (nSpeechSamples != m_nSpeechSamples)
{ {
@ -526,7 +580,8 @@ void FreeDVDemod::applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode)
<< " Rs: " << Rs << " Rs: " << Rs
<< " m_nSpeechSamples: " << m_nSpeechSamples << " m_nSpeechSamples: " << m_nSpeechSamples
<< " m_nMaxModemSamples: " << m_nMaxModemSamples << " m_nMaxModemSamples: " << m_nMaxModemSamples
<< " m_nin: " << m_nin; << " m_nin: " << m_nin
<< " FPS: " << m_freeDVStats.m_fps;
} }
m_settingsMutex.unlock(); m_settingsMutex.unlock();

View File

@ -177,6 +177,25 @@ private:
double m_magsqPeak; double m_magsqPeak;
}; };
struct FreeDVStats
{
FreeDVStats();
void init();
void collect(struct freedv *freedv);
int m_sync;
float m_snrEst;
float m_clockOffset;
float m_freqOffset;
float m_syncMetric;
int m_totalBitErrors;
int m_lastTotalBitErrors;
int m_ber; //!< estimated BER (b/s)
uint32_t m_frameCount;
uint32_t m_berFrameCount; //!< count of frames for BER estimation
uint32_t m_fps; //!< frames per second
};
class MsgConfigureFreeDVDemodPrivate : public Message { class MsgConfigureFreeDVDemodPrivate : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
@ -326,6 +345,7 @@ private:
int16_t *m_speechOut; int16_t *m_speechOut;
int16_t *m_modIn; int16_t *m_modIn;
AudioResampler m_audioResampler; AudioResampler m_audioResampler;
FreeDVStats m_freeDVStats;
QMutex m_settingsMutex; QMutex m_settingsMutex;