From 0ca7b0e5ed25573d8a690afae034d4ae0dafade3 Mon Sep 17 00:00:00 2001 From: Jordan Sherer Date: Tue, 29 Oct 2019 09:55:32 -0400 Subject: [PATCH] Updated ultra to 4, reorgnazed fixStop, and testing new decode patterns --- commons.h | 1 + lib/decoder.f90 | 28 ++++++++--------- lib/jt9com.f90 | 1 + mainwindow.cpp | 82 ++++++++++++++++++++++++------------------------- varicode.h | 2 +- 5 files changed, 57 insertions(+), 57 deletions(-) diff --git a/commons.h b/commons.h index a2fd564..ab2ed55 100644 --- a/commons.h +++ b/commons.h @@ -88,6 +88,7 @@ extern struct dec_data { int nfb; //High decode limit (Hz) int ntol; //+/- decoding range around fQSO (Hz) int kin; // number of frames written to d2 + int nsz; // number of frames to use in the decoder (period size) int nzhsym; int nsubmode; bool nagain; diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 87aa7ce..8e8a039 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -1,4 +1,4 @@ -subroutine multimode_decoder(ss,id2,params,nfsample) +subroutine multimode_decoder(ss,id1,params,nfsample) !$ use omp_lib use prog_args @@ -29,13 +29,13 @@ subroutine multimode_decoder(ss,id2,params,nfsample) real ss(184,NSMAX) logical baddata,newdat65,newdat9,single_decode,bVHF,bad0,newdat - integer*2 id2(NTMAX*12000) + integer*2 id1(NTMAX*12000) type(params_block) :: params character(len=20) :: datetime character(len=12) :: mycall, hiscall character(len=6) :: mygrid, hisgrid save - type(counting_ft8_decoder) :: my_js8a + type(counting_ft8_decoder) :: my_js8a type(counting_js8b_decoder) :: my_js8b type(counting_js8c_decoder) :: my_js8c type(counting_js8d_decoder) :: my_js8d @@ -78,11 +78,11 @@ subroutine multimode_decoder(ss,id2,params,nfsample) endif endif - if(params%nmode.eq.8 .and. params%nsubmode.eq.3) then + if(params%nmode.eq.8 .and. params%nsubmode.eq.4) then ! We're in JS8 mode D call timer('decjs8d ',0) newdat=params%newdat - call my_js8d%decode(js8d_decoded,id2,params%nQSOProgress,params%nfqso, & + call my_js8d%decode(js8d_decoded,id1,params%nQSOProgress,params%nfqso, & params%nftx,newdat,params%nutc,params%nfa,params%nfb, & params%nexp_decode,params%ndepth,logical(params%nagain), & logical(params%lft8apon),logical(params%lapcqonly),params%napwid, & @@ -95,7 +95,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample) ! We're in JS8 mode C call timer('decjs8c ',0) newdat=params%newdat - call my_js8c%decode(js8c_decoded,id2,params%nQSOProgress,params%nfqso, & + call my_js8c%decode(js8c_decoded,id1,params%nQSOProgress,params%nfqso, & params%nftx,newdat,params%nutc,params%nfa,params%nfb, & params%nexp_decode,params%ndepth,logical(params%nagain), & logical(params%lft8apon),logical(params%lapcqonly),params%napwid, & @@ -108,7 +108,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample) ! We're in JS8 mode B call timer('decjs8b ',0) newdat=params%newdat - call my_js8b%decode(js8b_decoded,id2,params%nQSOProgress,params%nfqso, & + call my_js8b%decode(js8b_decoded,id1,params%nQSOProgress,params%nfqso, & params%nftx,newdat,params%nutc,params%nfa,params%nfb, & params%nexp_decode,params%ndepth,logical(params%nagain), & logical(params%lft8apon),logical(params%lapcqonly),params%napwid, & @@ -117,11 +117,11 @@ subroutine multimode_decoder(ss,id2,params,nfsample) go to 800 endif - if(params%nmode.eq.8) then + if(params%nmode.eq.8 .and. params%nsubmode.eq.0) then ! We're in JS8 mode A call timer('decjs8a ',0) newdat=params%newdat - call my_js8a%decode(js8a_decoded,id2,params%nQSOProgress,params%nfqso, & + call my_js8a%decode(js8a_decoded,id1,params%nQSOProgress,params%nfqso, & params%nftx,newdat,params%nutc,params%nfa,params%nfb, & params%nexp_decode,params%ndepth,logical(params%nagain), & logical(params%lft8apon),logical(params%lapcqonly),params%napwid, & @@ -130,8 +130,8 @@ subroutine multimode_decoder(ss,id2,params,nfsample) go to 800 endif - rms=sqrt(dot_product(float(id2(300000:310000)), & - float(id2(300000:310000)))/10000.0) + rms=sqrt(dot_product(float(id1(300000:310000)), & + float(id1(300000:310000)))/10000.0) if(rms.lt.2.0) go to 800 ! Zap data at start that might come from T/R switching transient? @@ -142,7 +142,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample) sq=0. do n=1,nadd k=k+1 - sq=sq + float(id2(k))**2 + sq=sq + float(id1(k))**2 enddo rms=sqrt(sq/nadd) if(rms.gt.10000.0) then @@ -153,11 +153,11 @@ subroutine multimode_decoder(ss,id2,params,nfsample) enddo if(bad0) then nz=min(NTMAX*12000,kbad+100) -! id2(1:nz)=0 ! temporarily disabled as it can breaak the JT9 decoder, maybe others +! id1(1:nz)=0 ! temporarily disabled as it can breaak the JT9 decoder, maybe others endif npts65=52*12000 - if(baddata(id2,npts65)) then + if(baddata(id1,npts65)) then nsynced=0 ndecoded=0 go to 800 diff --git a/lib/jt9com.f90 b/lib/jt9com.f90 index 7bfb50a..22ffe2e 100644 --- a/lib/jt9com.f90 +++ b/lib/jt9com.f90 @@ -19,6 +19,7 @@ integer(c_int) :: nfb integer(c_int) :: ntol integer(c_int) :: kin + integer(c_int) :: nsz integer(c_int) :: nzhsym integer(c_int) :: nsubmode logical(c_bool) :: nagain diff --git a/mainwindow.cpp b/mainwindow.cpp index 0ab9228..5f000ee 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2455,7 +2455,7 @@ void MainWindow::setDecodedTextFont (QFont const& font) void MainWindow::fixStop() { -#if 1 +#if 0 m_hsymStop=((int(m_TRperiod/0.288))/8)*8 - 1; // 0.288 because 6912/12000/2 = 0.288 if(m_nSubMode == Varicode::JS8CallUltra){ m_hsymStop++; @@ -2463,18 +2463,15 @@ void MainWindow::fixStop() #elif 0 m_hsymStop = int(m_TRperiod/0.288); #else - if(m_nSubMode == Varicode::JS8CallNormal){ - m_hsymStop = int(((float)JS8A_SYMBOL_SAMPLES*(float)JS8_NUM_SYMBOLS/(float)RX_SAMPLE_RATE)/0.288); - } - else if(m_nSubMode == Varicode::JS8CallFast){ - m_hsymStop = int(((float)JS8B_SYMBOL_SAMPLES*(float)JS8_NUM_SYMBOLS/(float)RX_SAMPLE_RATE)/0.288); - } - else if(m_nSubMode == Varicode::JS8CallTurbo){ - m_hsymStop = int(((float)JS8C_SYMBOL_SAMPLES*(float)JS8_NUM_SYMBOLS/(float)RX_SAMPLE_RATE)/0.288); - } - else if(m_nSubMode == Varicode::JS8CallUltra){ - m_hsymStop = int(((float)JS8D_SYMBOL_SAMPLES*(float)JS8_NUM_SYMBOLS/(float)RX_SAMPLE_RATE)/0.288); + int symbolSamples = 0; + float threshold = 1.0; + switch(m_nSubMode){ + case Varicode::JS8CallNormal: symbolSamples = JS8A_SYMBOL_SAMPLES; break; + case Varicode::JS8CallFast: symbolSamples = JS8B_SYMBOL_SAMPLES; break; + case Varicode::JS8CallTurbo: symbolSamples = JS8C_SYMBOL_SAMPLES; break; + case Varicode::JS8CallUltra: symbolSamples = JS8D_SYMBOL_SAMPLES; break; } + m_hsymStop = qFloor(float(symbolSamples*JS8_NUM_SYMBOLS + threshold*RX_SAMPLE_RATE)/(float)m_nsps*2.0); #endif } @@ -2551,10 +2548,9 @@ void MainWindow::dataSink(qint64 frames) QDateTime now {DriftingDateTime::currentDateTimeUtc ()}; // if the current half symbol index is the half symbol stop index, then proceed - int submode = m_nSubMode; - int period = m_TRperiod; + qint32 submode = m_nSubMode; + qint32 period = m_TRperiod; qint32 halfSymbolStop = m_hsymStop; - //bool newDataReady = m_ihsym == m_hsymStop; bool newDataReady = m_ihsym % m_hsymStop == 0; #if 0 @@ -2564,6 +2560,7 @@ void MainWindow::dataSink(qint64 frames) if(!m_decoderBusy) // m_nSubMode == Varicode::JS8CallNormal) { +#if 0 if(lastn != n && n % JS8A_TX_SECONDS == 0){ qDebug() << "could decode normal now" << n; period = JS8A_TX_SECONDS; @@ -2571,8 +2568,7 @@ void MainWindow::dataSink(qint64 frames) newDataReady = true; m_hsymStop = m_ihsym; } - lastn = n; -#if 0 + if(lastn != n && n % JS8B_TX_SECONDS == 0){ qDebug() << "could decode fast now" << n; period = JS8B_TX_SECONDS; @@ -2587,29 +2583,29 @@ void MainWindow::dataSink(qint64 frames) newDataReady = true; m_hsymStop = m_ihsym; } - -#endif -#if 0 + lastn = n; +#elif 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 - if(m_ihsym % hsymNormalStop == 0){ - period = JS8A_TX_SECONDS; - submode = Varicode::JS8CallNormal; - halfSymbolStop= hsymNormalStop; - qDebug() << "could decode normal now" << n; - newDataReady = true; - } - if(m_ihsym % hsymFastStop == 0){ - period = JS8B_TX_SECONDS; - submode = Varicode::JS8CallFast; - halfSymbolStop= hsymFastStop; - qDebug() << "could decode fast now" << n; - newDataReady = true; - } - if(m_ihsym % hsymTurboStop == 0){ + /// if(m_ihsym % hsymNormalStop == 0){ + /// period = JS8A_TX_SECONDS; + /// submode = Varicode::JS8CallNormal; + /// halfSymbolStop= hsymNormalStop; + /// qDebug() << "could decode normal now" << n; + /// newDataReady = true; + /// } + /// if(m_ihsym % hsymFastStop == 0){ + /// period = JS8B_TX_SECONDS; + /// submode = Varicode::JS8CallFast; + /// halfSymbolStop= hsymFastStop; + /// qDebug() << "could decode fast now" << n; + /// newDataReady = true; + /// } + if(m_ihsym % hsymTurboStop == 0 || m_ihsym == hsymTurboStop/2-1){ period = JS8C_TX_SECONDS; submode = Varicode::JS8CallTurbo; + dec_data.params.nsz = hsymTurboStop * m_nsps / 2; halfSymbolStop= hsymTurboStop; qDebug() << "could decode turbo now" << n; newDataReady = true; @@ -2633,8 +2629,8 @@ void MainWindow::dataSink(qint64 frames) 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); + 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 @@ -4039,9 +4035,11 @@ 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 JS8_RING_BUFFER - unsigned maxframe = period * RX_SAMPLE_RATE; - unsigned periodFrames = m_hsymStop * m_nsps / 2; +#if 0 // JS8_RING_BUFFER + // TODO: m_TRperiod here needs to be replaced with what we send to m_detector period + unsigned maxframe = m_TRperiod * RX_SAMPLE_RATE; + unsigned periodFrames = dec_data.params.nsz; //m_hsymStop * m_nsps / 2; + //dec_data.params.nsz = periodFrames; memset(dec_data.d1, 0, sizeof(dec_data.d1)); if(dec_data.params.kin < periodFrames){ @@ -4049,11 +4047,11 @@ void MainWindow::decode(int submode, int period) int delta = periodFrames - 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; + qDebug() << "try decode from" << (maxframe-delta) << "to" << dec_data.params.kin << "at beginning of buffer with delta" << delta << "and period frames" << periodFrames; } else { // decode the last N frames based on the current tr period 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; + qDebug() << "try decode from" << (dec_data.params.kin-periodFrames) << "to" << dec_data.params.kin << "with period frames" << periodFrames; } #else memset(dec_data.d1, 0, sizeof(dec_data.d1)); diff --git a/varicode.h b/varicode.h index 3eeadd7..7008306 100644 --- a/varicode.h +++ b/varicode.h @@ -28,7 +28,7 @@ public: JS8CallNormal = 0, JS8CallFast = 1, JS8CallTurbo = 2, - JS8CallUltra = 3 + JS8CallUltra = 4 }; // frame type transmitted via itype and decoded by the ft8 decoded