diff --git a/qmap/libqmap/getcand2.f90 b/qmap/libqmap/getcand2.f90 index 212b97e39..ac1e6f0e8 100644 --- a/qmap/libqmap/getcand2.f90 +++ b/qmap/libqmap/getcand2.f90 @@ -39,7 +39,7 @@ subroutine getcand2(ss,savg0,nts_q65,nagain,nhsym,ntx30a,ntx30b, & nguard=5 !Guard range in bins i1=1 i2=NFFT-nbw-nguard - if(nagain.eq.1) then + if(nagain.ge.1) then i1=nint((1000.0*f0_selected-ntol)/df) i2=nint((1000.0*f0_selected+ntol)/df) endif diff --git a/qmap/libqmap/q65b.f90 b/qmap/libqmap/q65b.f90 index 5ef96b5c6..fb2a07c15 100644 --- a/qmap/libqmap/q65b.f90 +++ b/qmap/libqmap/q65b.f90 @@ -9,12 +9,14 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ! in common/cacb. Decoded messages are sent back to the GUI. use q65_decode + use wavhdr use timer_module, only: timer parameter (MAXFFT1=5376000) !56*96000 parameter (MAXFFT2=336000) !56*6000 (downsampled by 1/16) parameter (NMAX=60*12000) parameter (RAD=57.2957795) + type(hdr) h integer*2 iwave(60*12000) integer offset complex ca(MAXFFT1) !FFT of raw I/Q data from Linrad @@ -26,11 +28,13 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & character*6 hisgrid character*4 grid4 character*3 csubmode + character*17 fname character*64 result,ctmp character*20 datetime,datetime1 common/decodes/ndecodes,ncand,nQDecoderDone,nWDecoderBusy, & nWTransmitting,result(50) common/cacb/ca + data ifile/0/ save if(mycall0(1:1).ne.' ') mycall=mycall0 @@ -46,8 +50,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & nh=nfft2/2 f_mouse=1000.0*(fqso+48.0) + mousedf k0=nint((ipk*df3-1000.0)/df) - if(nagain.eq.1) k0=nint((f_mouse-1000.0)/df) - if(k0.lt.nh .or. k0.gt.MAXFFT1-nfft2+1) go to 900 fac=1.0/nfft2 cx(0:nfft2-1)=ca(k0:k0+nfft2-1) @@ -87,7 +89,7 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & nsubmode=mode_q65-1 nfa=990 !Tight limits around ipk for the wideband decode nfb=1010 - if(nagain.eq.1) then !For nagain=1, use limits of +/- ntol + if(nagain.ge.1) then !For nagain>=1, use limits of +/- ntol nfa=max(100,1000-ntol) nfb=min(2500,1000+ntol) endif @@ -108,9 +110,23 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & if(iseq.eq.1) datetime1(12:13)='30' endif +! if(nagain.eq.2) then +! h=default_header(12000,30*12000) +! ifile=ifile+1 +! write(fname,1000) ifile +!1000 format('000000_',i6.6,'.wav') +! open(27,file=fname,status='unknown',access='stream') +! ia=ifile*30*12000 + 1 +! ib=ia + 30*12000 - 1 +! write(27) h,iwave(ia:ib) +! close(27) +! endif +! print*,'A',nagain,ifile,fname + ! NB: Frequency of ipk is now shifted to 1000 Hz. + nagain2=0 call map65_mmdec(nutc1,iwave,nqd,ntrperiod,nsubmode,nfa,nfb,1000,ntol, & - newdat,nagain,max_drift,ndepth,mycall,hiscall,hisgrid) + newdat,nagain2,max_drift,ndepth,mycall,hiscall,hisgrid) MHz=fcenter freq0=MHz + 0.001d0*ikhz @@ -132,8 +148,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & freq1=freq0 + 0.001d0*(ikhz1-ikhz) frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal fsked=frx - 0.001*ndop00/2.0 - 0.001*offset -! if(iand(nCFOM,2).eq.2) write(*,3001) nCFOM,ndop00,frx,fsked -!3001 format('A',i5,i8,f10.3,f10.1) ctmp=csubmode//' '//trim(msg0) ndecodes=min(ndecodes+1,50) write(result(ndecodes),1120) nhhmmss,frx,fsked,xdt0,nsnr0,trim(ctmp) diff --git a/qmap/libqmap/qmapa.f90 b/qmap/libqmap/qmapa.f90 index 679ccf898..dfb675c3c 100644 --- a/qmap/libqmap/qmapa.f90 +++ b/qmap/libqmap/qmapa.f90 @@ -40,7 +40,7 @@ subroutine qmapa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & save tsec0=sec_midn() - if(nagain.eq.1) ndepth=3 !Use full depth for click-to-decode + if(nagain.ge.1) ndepth=3 !Use full depth for click-to-decode nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 mfb=nfb-nkhz_center+48 @@ -60,8 +60,7 @@ subroutine qmapa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) nqd=0 - bClickDecode=(nagain.eq.1) - nagain2=0 + bClickDecode=(nagain.ge.1) call timer('fftbig ',0) call fftbig(dd,NSMAX) !Do the full-length FFT @@ -80,12 +79,14 @@ subroutine qmapa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & ntrperiod=cand(icand)%ntrperiod iseq=cand(icand)%iseq -! Skip this candidate if we already decoded it. - do j=1,ndecodes - if(abs(f0-found(j)%f).lt.0.005 .and. & + if(nagain.eq.0) then + ! Skip this candidate if we already decoded it. + do j=1,ndecodes + if(abs(f0-found(j)%f).lt.0.005 .and. & ntrperiod.eq.found(j)%ntrperiod .and. & iseq.eq.found(j)%iseq) go to 10 - enddo + enddo + endif mode_q65_tmp=mode_q65 if(ntrperiod.eq.30) mode_q65_tmp=max(1,mode_q65-1) @@ -95,7 +96,7 @@ subroutine qmapa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ntrperiod,iseq,mycall,hiscall,hisgrid,mode_q65_tmp,f0,fqso, & - nkhz_center,newdat,nagain2,bClickDecode,max_drift,offset, & + nkhz_center,newdat,nagain,bClickDecode,max_drift,offset, & ndepth,datetime,nCFOM,ndop00,nhsym,idec) call timer('q65b ',1) if(bClickDecode .and. idec.ge.0) exit diff --git a/qmap/mainwindow.cpp b/qmap/mainwindow.cpp index 540ce0540..cf1f6259d 100644 --- a/qmap/mainwindow.cpp +++ b/qmap/mainwindow.cpp @@ -192,7 +192,6 @@ MainWindow::~MainWindow() soundInThread.quit(); soundInThread.wait(3000); } -// fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("qmap_wisdom.dat").toLocal8Bit ()); delete ui; } @@ -951,6 +950,7 @@ void MainWindow::decode() //decode() memcpy(savecom_.revision, m_revision.toLatin1(), len2); memcpy(savecom_.saveFileName, m_saveFileName.toLatin1(),len1); + ui->actionExport_wav_file_at_fQSO->setEnabled(m_diskData); watcher3.setFuture(QtConcurrent::run (q65c_)); decodeBusy(true); } @@ -1184,3 +1184,11 @@ void MainWindow::on_sbMaxDrift_valueChanged(int n) if(n==5) ui->sbMaxDrift->setStyleSheet("QSpinBox { background-color: #ffff82; }"); if(n>=10) ui->sbMaxDrift->setStyleSheet("QSpinBox { background-color: #ffff00; }"); } + +void MainWindow::on_actionExport_wav_file_at_fQSO_triggered() +{ + qDebug() << "Export .wav file" << m_path; + datcom_.newdat=0; + datcom_.nagain=2; + decode(); +} diff --git a/qmap/mainwindow.h b/qmap/mainwindow.h index 3c2fb75b0..534f9e853 100644 --- a/qmap/mainwindow.h +++ b/qmap/mainwindow.h @@ -83,8 +83,8 @@ private slots: void on_actionQuick_Start_Guide_to_WSJT_X_2_7_and_QMAP_triggered(); void on_actionAlso_Q65_30x_toggled(bool b); void on_sbMaxDrift_valueChanged(int arg1); - void on_actionSave_decoded_triggered(); + void on_actionExport_wav_file_at_fQSO_triggered(); private: Ui::MainWindow *ui; diff --git a/qmap/mainwindow.ui b/qmap/mainwindow.ui index 548990813..74d7cea9e 100644 --- a/qmap/mainwindow.ui +++ b/qmap/mainwindow.ui @@ -434,6 +434,7 @@ p, li { white-space: pre-wrap; } + @@ -855,6 +856,11 @@ p, li { white-space: pre-wrap; } Save decoded + + + Export .wav file at fQSO + + @@ -873,8 +879,8 @@ p, li { white-space: pre-wrap; } update() - 269 - 255 + 287 + 281 126