From b526e274f8563226f29cb81e42062cf83e530185 Mon Sep 17 00:00:00 2001 From: Jordan Sherer Date: Mon, 28 Oct 2019 16:06:06 -0400 Subject: [PATCH] Use a ring buffer for the audio samples --- Detector.cpp | 11 +++++++--- commons.h | 5 +++-- mainwindow.cpp | 56 ++++++++++++++++++++++++++++++-------------------- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/Detector.cpp b/Detector.cpp index c81840f..d81d7c4 100644 --- a/Detector.cpp +++ b/Detector.cpp @@ -43,12 +43,17 @@ bool Detector::reset () void Detector::clear () { +#if 1 // set index to roughly where we are in time (1ms resolution) - // qint64 now (DriftingDateTime::currentMSecsSinceEpoch ()); - // unsigned msInPeriod ((now % 86400000LL) % (m_period * 1000)); - // dec_data.params.kin = qMin ((msInPeriod * m_frameRate) / 1000, static_cast (sizeof (dec_data.d2) / sizeof (dec_data.d2[0]))); + qDebug() << "detector clear"; + qint64 now (DriftingDateTime::currentMSecsSinceEpoch ()); + unsigned msInPeriod ((now % 86400000LL) % (m_period * 1000)); + dec_data.params.kin = qMin ((msInPeriod * m_frameRate) / 1000, static_cast (sizeof (dec_data.d2) / sizeof (dec_data.d2[0]))); + m_bufferPos = 0; +#else dec_data.params.kin = 0; m_bufferPos = 0; +#endif // fill buffer with zeros (G4WJS commented out because it might cause decoder hangs) // qFill (dec_data.d2, dec_data.d2 + sizeof (dec_data.d2) / sizeof (dec_data.d2[0]), 0); diff --git a/commons.h b/commons.h index cb0c972..a2fd564 100644 --- a/commons.h +++ b/commons.h @@ -6,6 +6,7 @@ #define RX_SAMPLE_RATE 12000 +#define JS8_RING_BUFFER 1 #define JS8_NUM_SYMBOLS 79 #define JS8_ENABLE_JS8B 1 #define JS8_ENABLE_JS8C 1 @@ -69,8 +70,8 @@ extern struct dec_data { float ss[184*NSMAX]; // symbol spectra float savg[NSMAX]; float sred[5760]; - short int d1[NTMAX*RX_SAMPLE_RATE]; // sample frame buffer - short int d2[NTMAX*RX_SAMPLE_RATE]; // sample frame buffer + short int d1[NTMAX*RX_SAMPLE_RATE]; // sample frame buffer for decoding (copied from d2 for the frame period) + short int d2[NTMAX*RX_SAMPLE_RATE]; // sample frame buffer for sample collection struct { int nutc; //UTC as integer, HHMM diff --git a/mainwindow.cpp b/mainwindow.cpp index 6476264..0ab9228 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2481,6 +2481,7 @@ void MainWindow::fixStop() //-------------------------------------------------------------- dataSink() void MainWindow::dataSink(qint64 frames) { + static int k0 = 0; static float s[NSMAX]; char line[80]; @@ -2512,17 +2513,38 @@ void MainWindow::dataSink(qint64 frames) int nsps=m_nsps; int nsmo=m_wideGraph->smoothYellow()-1; - symspec_(&dec_data,&k,&trmin,&nsps,&m_inGain,&nsmo,&m_px,s,&m_df3,&m_ihsym,&m_npts8,&m_pxmax); - qDebug() << "dataSink" << k << "ihsym" << m_ihsym; - if(m_ihsym <=0) return; + + /// START IHSYM + + // moving ihsym computation to here from symspec.f90 + // 1) set the initial ihsym + if(m_ihsym == 0){ + m_ihsym = int((float)k/m_nsps)*2; + } + // 2) reset the ihsym when loop around + if(k < k0){ + m_ihsym = 0; + } + k0 = k; + int ihs = m_ihsym; + symspec_(&dec_data,&k,&trmin,&nsps,&m_inGain,&nsmo,&m_px,s,&m_df3,&ihs,&m_npts8,&m_pxmax); + // 3) if symspec wants ihs to be 0, set it. + if(ihs == 0){ + m_ihsym = ihs; + } else { + m_ihsym += 1; + } + qDebug() << "dataSink" << k << "ihsym" << m_ihsym << "ihs" << ihs; + + /// END IHSYM + + if(m_ihsym <= 0) return; if(ui) ui->signal_meter_widget->setValue(m_px,m_pxmax); // Update thermometer if(m_monitoring || m_diskData) { m_wideGraph->dataSink2(s,m_df3,m_ihsym,m_diskData); } - if(m_mode=="MSK144") return; - fixStop(); // could we decode all at once? @@ -2607,8 +2629,6 @@ void MainWindow::dataSink(qint64 frames) dec_data.params.nzhsym=halfSymbolStop; m_dateTime = now.toString ("yyyy-MMM-dd hh:mm"); - //qDebug() << now << "half symbol" << m_ihsym << "stop symbol" << m_hsymStop; - #if 1 decode(submode, period); //Start decoder #else @@ -2617,9 +2637,7 @@ void MainWindow::dataSink(qint64 frames) if(n % JS8C_TX_SECONDS == 0) decode(Varicode::JS8CallTurbo, JS8C_TX_SECONDS); #endif -#if SAVE_TO_WAV if(!m_diskData) { //Always save; may delete later - if(m_mode=="FT8") { int n=now.time().second() % m_TRperiod; if(n<(m_TRperiod/2)) n=n+m_TRperiod; @@ -2640,7 +2658,6 @@ void MainWindow::dataSink(qint64 frames) m_config.my_grid(), m_mode, m_nSubMode, m_freqNominal, m_hisCall, m_hisGrid))); } } -#endif m_rxDone=true; } @@ -4022,26 +4039,21 @@ void MainWindow::decode(int submode, int period) strncpy(dec_data.params.hiscall,(hisCall + " ").toLatin1 ().constData (), 12); strncpy(dec_data.params.hisgrid,(hisGrid + " ").toLatin1 ().constData (), 6); -#if 0 - qDebug() << "kin" << dec_data.params.kin; - - unsigned maxframe = 30 * RX_SAMPLE_RATE; +#if JS8_RING_BUFFER + unsigned maxframe = period * RX_SAMPLE_RATE; unsigned periodFrames = m_hsymStop * m_nsps / 2; memset(dec_data.d1, 0, sizeof(dec_data.d1)); if(dec_data.params.kin < periodFrames){ - //kstart = 0; - //ksize = dec_data.params.kin; - // kin is less than the period, so we need to copy the first part missing from the end of the buffer int delta = periodFrames - dec_data.params.kin; - qDebug() << "try decode from" << (maxframe-delta) << "to" << dec_data.params.kin << "at beginning of buffer with delta" << delta << "and period" << periodFrames; - memcpy(dec_data.d1, &dec_data.d2[maxframe-delta], delta); - memcpy(&dec_data.d1[delta], dec_data.d2, dec_data.params.kin); + memcpy(dec_data.d1, &dec_data.d2[maxframe-delta], delta * sizeof(dec_data.d2[0])); + memcpy(&dec_data.d1[delta * sizeof(dec_data.d2[0])], dec_data.d2, dec_data.params.kin * sizeof(dec_data.d2[0])); + //qDebug() << "try decode from" << (maxframe-delta) << "to" << dec_data.params.kin << "at beginning of buffer with delta" << delta << "and period" << periodFrames; } else { // decode the last N frames based on the current tr period - qDebug() << "try decode from" << (dec_data.params.kin-periodFrames) << "to" << dec_data.params.kin << "with period" << periodFrames; - memcpy(dec_data.d1, &dec_data.d2[dec_data.params.kin-periodFrames], periodFrames); + memcpy(dec_data.d1, &dec_data.d2[dec_data.params.kin-periodFrames], periodFrames * sizeof(dec_data.d2[0])); + //qDebug() << "try decode from" << (dec_data.params.kin-periodFrames) << "to" << dec_data.params.kin << "with period" << periodFrames; } #else memset(dec_data.d1, 0, sizeof(dec_data.d1));