From 56d457a0561e20fbfdbd295e96de6e992cdd7342 Mon Sep 17 00:00:00 2001 From: Jordan Sherer Date: Fri, 25 Oct 2019 14:15:45 -0400 Subject: [PATCH] Initial experimentation --- Detector.cpp | 3 +-- commons.h | 5 ++++- lib/jt9a.f90 | 2 +- lib/jt9com.f90 | 3 +++ lib/symspec.f90 | 13 ++++++------ mainwindow.cpp | 55 ++++++++++++++++++++++++++++++++++++++----------- 6 files changed, 59 insertions(+), 22 deletions(-) diff --git a/Detector.cpp b/Detector.cpp index a26cab3..1774445 100644 --- a/Detector.cpp +++ b/Detector.cpp @@ -58,6 +58,7 @@ qint64 Detector::writeData (char const * data, qint64 maxSize) { int ns=secondInPeriod(); if(ns < m_ns) { // When ns has wrapped around to zero, restart the buffers + dec_data.params.kpos = 0; dec_data.params.kin = 0; m_bufferPos = 0; } @@ -117,8 +118,6 @@ qint64 Detector::writeData (char const * data, qint64 maxSize) remaining -= numFramesProcessed; } - - return maxSize; // we drop any data past the end of the buffer on // the floor until the next period starts } diff --git a/commons.h b/commons.h index 647d2ce..3c2551b 100644 --- a/commons.h +++ b/commons.h @@ -69,6 +69,7 @@ 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 struct { @@ -85,7 +86,9 @@ extern struct dec_data { int nfSplit; //JT65 | JT9 split frequency int nfb; //High decode limit (Hz) int ntol; //+/- decoding range around fQSO (Hz) - int kin; + int knum; // maximum number of frames per period in d2 + int kpos; // number of frames already processed in d2 + int kin; // number of frames available in d2 int nzhsym; int nsubmode; bool nagain; diff --git a/lib/jt9a.f90 b/lib/jt9a.f90 index 9729e08..ad45bc3 100644 --- a/lib/jt9a.f90 +++ b/lib/jt9a.f90 @@ -61,7 +61,7 @@ subroutine jt9a() local_params=shared_data%params !save a copy because wsjtx carries on accessing call flush(6) call timer('decoder ',0) - call multimode_decoder(shared_data%ss,shared_data%id2,local_params,12000) + call multimode_decoder(shared_data%ss,shared_data%id1,local_params,12000) call timer('decoder ',1) 100 inquire(file=trim(temp_dir)//'/.lock',exist=fileExists) diff --git a/lib/jt9com.f90 b/lib/jt9com.f90 index c595582..d25a415 100644 --- a/lib/jt9com.f90 +++ b/lib/jt9com.f90 @@ -18,6 +18,8 @@ integer(c_int) :: nfsplit integer(c_int) :: nfb integer(c_int) :: ntol + integer(c_int) :: knum + integer(c_int) :: kpos integer(c_int) :: kin integer(c_int) :: nzhsym integer(c_int) :: nsubmode @@ -52,6 +54,7 @@ real(c_float) :: ss(184,NSMAX) real(c_float) :: savg(NSMAX) real(c_float) :: sred(5760) + integer(c_short) :: id1(NMAX) integer(c_short) :: id2(NMAX) type(params_block) :: params end type dec_data diff --git a/lib/symspec.f90 b/lib/symspec.f90 index 28035d2..2d26203 100644 --- a/lib/symspec.f90 +++ b/lib/symspec.f90 @@ -2,12 +2,13 @@ subroutine symspec(shared_data,k,ntrperiod,nsps,ingain,nminw,pxdb,s, & df3,ihsym,npts8,pxdbmax) ! Input: -! k pointer to the most recent new data -! ntrperiod T/R sequence length, minutes -! nsps samples per symbol, at 12000 Hz -! ndiskdat 0/1 to indicate if data from disk -! nb 0/1 status of noise blanker (off/on) -! nbslider NB setting, 0-100 +! shared_data pointer to the most recent new data +! k frames in that data +! ntrperiod T/R sequence length, minutes +! nsps samples per symbol, at 12000 Hz +! ndiskdat 0/1 to indicate if data from disk +! nb 0/1 status of noise blanker (off/on) +! nbslider NB setting, 0-100 ! Output: ! pxdb raw power (0-90 dB) diff --git a/mainwindow.cpp b/mainwindow.cpp index ae11f8c..bcda9d7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2496,9 +2496,9 @@ 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); - - if(m_mode=="WSPR") wspr_downsample_(dec_data.d2,&k); + qDebug() << "dataSink" << k << "ihsym" << m_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); @@ -2519,27 +2519,43 @@ void MainWindow::dataSink(qint64 frames) int submode = m_nSubMode; int period = m_TRperiod; qint32 halfSymbolStop = m_hsymStop; - bool newDataReady = m_ihsym == m_hsymStop; + //bool newDataReady = m_ihsym == m_hsymStop; + bool newDataReady = m_ihsym % m_hsymStop == 0; #if 0 - if(m_nSubMode == Varicode::JS8CallNormal) + static int lastn = 0; + int n = now.time().second(); + + if(!m_decoderBusy) // m_nSubMode == Varicode::JS8CallNormal) { - int n = now.time().second(); #if 0 - if(n % JS8A_TX_SECONDS == 0){ + if(lastn != n && n % JS8A_TX_SECONDS == 0){ qDebug() << "could decode normal now" << n; + period = JS8A_TX_SECONDS; + submode = Varicode::JS8CallNormal; + newDataReady = true; + m_hsymStop = m_ihsym; } - if(n % JS8B_TX_SECONDS == 0){ + if(lastn != n && n % JS8B_TX_SECONDS == 0){ qDebug() << "could decode fast now" << n; + period = JS8B_TX_SECONDS; + submode = Varicode::JS8CallFast; + newDataReady = true; + m_hsymStop = m_ihsym; } - if(n % JS8C_TX_SECONDS == 0){ + if(lastn != n && n % JS8C_TX_SECONDS == 0){ qDebug() << "could decode turbo now" << n; + period = JS8C_TX_SECONDS; + submode = Varicode::JS8CallTurbo; + newDataReady = true; + m_hsymStop = m_ihsym; } + lastn = n; #endif #if 0 qint32 hsymNormalStop = ((int(JS8A_TX_SECONDS/0.288))/8)*8 - 1; // 0.288 because 6912/12000/2 = 0.288 - qint32 hsymFastStop = ((int(JS8B_TX_SECONDS/0.288))/8)*8 - 1; // 0.288 because 6912/12000/2 = 0.288 - qint32 hsymTurboStop = ((int(JS8C_TX_SECONDS/0.288))/8)*8 - 1; // 0.288 because 6912/12000/2 = 0.288 + qint32 hsymFastStop = ((int(JS8B_TX_SECONDS/0.288))/8)*8 - 1; // 0.288 because 6912/12000/2 = 0.288 + qint32 hsymTurboStop = ((int(JS8C_TX_SECONDS/0.288))/8)*8 - 1; // 0.288 because 6912/12000/2 = 0.288 if(m_ihsym % hsymNormalStop == 0){ period = JS8A_TX_SECONDS; submode = Varicode::JS8CallNormal; @@ -2575,12 +2591,19 @@ void MainWindow::dataSink(qint64 frames) dec_data.params.newdat=1; dec_data.params.nagain=0; dec_data.params.nzhsym=halfSymbolStop; + dec_data.params.knum=period * RX_SAMPLE_RATE; m_dateTime = now.toString ("yyyy-MMM-dd hh:mm"); //qDebug() << now << "half symbol" << m_ihsym << "stop symbol" << m_hsymStop; if(!m_mode.startsWith ("WSPR")){ +#if 1 decode(submode, period); //Start decoder +#else + if(n % JS8A_TX_SECONDS == 0) decode(Varicode::JS8CallNormal, JS8A_TX_SECONDS); + if(n % JS8B_TX_SECONDS == 0) decode(Varicode::JS8CallFast, JS8B_TX_SECONDS); + if(n % JS8C_TX_SECONDS == 0) decode(Varicode::JS8CallTurbo, JS8C_TX_SECONDS); +#endif } if(!m_diskData) { //Always save; may delete later @@ -3888,6 +3911,7 @@ void MainWindow::decode(int submode, int period) m_msec0=DriftingDateTime::currentMSecsSinceEpoch(); if(!m_dataAvailable or m_TRperiod==0) return; + ui->DecodeButton->setChecked (true); if(dec_data.params.nagain==0 && dec_data.params.newdat==1 && (!m_diskData)) { qint64 ms = DriftingDateTime::currentMSecsSinceEpoch() % 86400000; @@ -3903,6 +3927,11 @@ void MainWindow::decode(int submode, int period) int isec=t.toString("ss").toInt(); isec=isec - isec%m_TRperiod; dec_data.params.nutc=10000*ihr + 100*imin + isec; + + // qint64 now (DriftingDateTime::currentMSecsSinceEpoch ()); + //unsigned msInPeriod = (ms % (period * 1000)); + //unsigned frameInPeriod = qMin ((msInPeriod * RX_SAMPLE_RATE) / 1000, static_cast (sizeof (dec_data.d2) / sizeof (dec_data.d2[0]))); + //dec_data.params.kpos = qMax(0, (period * RX_SAMPLE_RATE)); } } @@ -3959,7 +3988,7 @@ void MainWindow::decode(int submode, int period) if(m_mode=="FT8") dec_data.params.nmode=8; if(m_mode=="FT8") dec_data.params.lft8apon = ui->actionEnable_AP_FT8->isVisible () && ui->actionEnable_AP_FT8->isChecked (); if(m_mode=="FT8") dec_data.params.napwid=50; - dec_data.params.ntrperiod= period; //m_TRperiod; + dec_data.params.ntrperiod=period; //m_TRperiod; dec_data.params.nsubmode=submode; // m_nSubMode; if(m_mode=="QRA64") dec_data.params.nsubmode=100 + m_nSubMode; dec_data.params.minw=0; @@ -3985,6 +4014,8 @@ 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); + qDebug() << "knum" << dec_data.params.knum << "kpos" << dec_data.params.kpos << "kin" << dec_data.params.kin; + //newdat=1 ==> this is new data, must do the big FFT //nagain=1 ==> decode only at fQSO +/- Tol @@ -3996,7 +4027,7 @@ void MainWindow::decode(int submode, int period) to += noffset; from += noffset; size -= noffset; - } + } memcpy(to, from, qMin(mem_js8->size(), size)); QFile {m_config.temp_dir ().absoluteFilePath (".lock")}.remove (); // Allow jt9 to start