mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 13:30:52 -05:00 
			
		
		
		
	Make wspr_fsk8d search for DT as well as f0.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7681 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
		
							parent
							
								
									28c09d4a76
								
							
						
					
					
						commit
						303eecdfd6
					
				@ -510,6 +510,7 @@ set (wsjt_FSRCS
 | 
			
		||||
  lib/fsk4hf/wspr5sim.f90
 | 
			
		||||
  lib/fsk4hf/wspr_fsk8d.f90
 | 
			
		||||
  lib/fsk4hf/wspr_fsk8_sim.f90
 | 
			
		||||
  lib/fsk4hf/wspr_fsk8_wav.f90
 | 
			
		||||
  lib/fsk4hf/wspr5_downsample.f90
 | 
			
		||||
  lib/fsk4hf/wspr_fsk8_downsample.f90
 | 
			
		||||
  lib/fsk4hf/wspr5_wav.f90
 | 
			
		||||
@ -1325,7 +1326,7 @@ install (TARGETS udp_daemon message_aggregator
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
install (TARGETS jt9 jt65code qra64code qra64sim jt9code jt4code
 | 
			
		||||
  msk144code wsprd wspr5d fmtave fcal fmeasure
 | 
			
		||||
  msk144code wsprd wspr5d wspr_fsk8d fmtave fcal fmeasure
 | 
			
		||||
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
 | 
			
		||||
  BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
subroutine spec8(c,s,savg)
 | 
			
		||||
 | 
			
		||||
  include 'wspr_fsk8_params.f90'
 | 
			
		||||
  complex c(0:NZ-1)
 | 
			
		||||
  complex c(0:NMAXD-1)
 | 
			
		||||
  complex c1(0:NSPS-1)
 | 
			
		||||
  real s(0:NH2,NN)
 | 
			
		||||
  real savg(0:NH2)
 | 
			
		||||
 | 
			
		||||
@ -1,13 +1,12 @@
 | 
			
		||||
subroutine wspr_fsk8_downsample(iwave,c)
 | 
			
		||||
 | 
			
		||||
! Input: i*2 data in iwave() at sample rate 12000 Hz
 | 
			
		||||
! Output: Complex data in c(), sampled at 4=500 Hz
 | 
			
		||||
! Output: Complex data in c(), sampled at 12000/24=500 Hz
 | 
			
		||||
 | 
			
		||||
  include 'wspr_fsk8_params.f90'
 | 
			
		||||
  parameter (NMAX=240*12000,NFFTD=NMAX/24)
 | 
			
		||||
  integer*2 iwave(NMAX)
 | 
			
		||||
  complex c(0:NZ-1)
 | 
			
		||||
  complex c1(0:NFFTD-1)
 | 
			
		||||
  complex c(0:NMAXD-1)
 | 
			
		||||
  complex c1(0:NMAXD-1)
 | 
			
		||||
  complex cx(0:NMAX/2)
 | 
			
		||||
  real x(NMAX)
 | 
			
		||||
  equivalence (x,cx)
 | 
			
		||||
@ -17,13 +16,12 @@ subroutine wspr_fsk8_downsample(iwave,c)
 | 
			
		||||
  call four2a(x,NMAX,1,-1,0)             !r2c FFT to freq domain
 | 
			
		||||
  i0=nint(1500.0/df)
 | 
			
		||||
  c1(0)=cx(i0)
 | 
			
		||||
  do i=1,NFFTD/2
 | 
			
		||||
  do i=1,NMAXD/2
 | 
			
		||||
     c1(i)=cx(i0+i)
 | 
			
		||||
     c1(NFFTD-i)=cx(i0-i)
 | 
			
		||||
     c1(NMAXD-i)=cx(i0-i)
 | 
			
		||||
  enddo
 | 
			
		||||
  c1=c1/NFFTD
 | 
			
		||||
  call four2a(c1,NFFTD,1,1,1)            !c2c FFT back to time domain
 | 
			
		||||
  c=c1(0:NZ-1)
 | 
			
		||||
  c=c1/NMAXD
 | 
			
		||||
  call four2a(c,NMAXD,1,1,1)            !c2c FFT back to time domain
 | 
			
		||||
  
 | 
			
		||||
  return
 | 
			
		||||
end subroutine wspr_fsk8_downsample
 | 
			
		||||
 | 
			
		||||
@ -8,6 +8,7 @@ parameter (NSPS0=24576)               !Samples per symbol at 12000 S/s
 | 
			
		||||
parameter (NSPS=NSPS0/NDOWN)          !Sam/sym, downsampled (1024)
 | 
			
		||||
parameter (N7=7*NSPS)                 !Samples in Costas 7x7 array (7168)
 | 
			
		||||
parameter (NZ=NSPS*NN)                !Samples in downsampled waveform (116,736)
 | 
			
		||||
parameter (NZMAX=NSPS0*NN)            !Samples in *.wav (2,801,664)
 | 
			
		||||
parameter (NMAX=240*12000)            !Samples in iwave()
 | 
			
		||||
parameter (NMAXD=NMAX/24)             !Samples in c(), after downsampling
 | 
			
		||||
parameter (NFFT1=4*NSPS,NH1=NFFT1/2)
 | 
			
		||||
parameter (NH2=NSPS/2)
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,6 @@ program wspr_fsk8_sim
 | 
			
		||||
 | 
			
		||||
  use wavhdr
 | 
			
		||||
  include 'wspr_fsk8_params.f90'         !Set various constants
 | 
			
		||||
  parameter (NMAX=300*12000)
 | 
			
		||||
  type(hdr) h                            !Header for .wav file
 | 
			
		||||
  character arg*12,fname*16
 | 
			
		||||
  character msg*22,msgsent*22
 | 
			
		||||
@ -59,6 +58,3 @@ program wspr_fsk8_sim
 | 
			
		||||
  enddo
 | 
			
		||||
       
 | 
			
		||||
999 end program wspr_fsk8_sim
 | 
			
		||||
 | 
			
		||||
  include 'wspr_fsk8_wav.f90'
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,6 @@ subroutine wspr_fsk8_wav(baud,xdt,f0,itone,snrdb,iwave)
 | 
			
		||||
! Generate iwave() from itone().
 | 
			
		||||
  
 | 
			
		||||
  include 'wspr_fsk8_params.f90'
 | 
			
		||||
  parameter (NMAX=240*12000)
 | 
			
		||||
  integer itone(NN)
 | 
			
		||||
  integer*2 iwave(NMAX)
 | 
			
		||||
  real*8 twopi,dt,dphi,phi
 | 
			
		||||
@ -15,7 +14,7 @@ subroutine wspr_fsk8_wav(baud,xdt,f0,itone,snrdb,iwave)
 | 
			
		||||
  dat=0.
 | 
			
		||||
  if(snrdb.lt.90) then
 | 
			
		||||
     do i=1,NMAX
 | 
			
		||||
        dat(i)=gran()          !Generate gaussian noise
 | 
			
		||||
        dat(i)=gran()          !Generate gaussian noise, rms = 1.0
 | 
			
		||||
     enddo
 | 
			
		||||
     bandwidth_ratio=2500.0/6000.0
 | 
			
		||||
     sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*snrdb)
 | 
			
		||||
@ -24,7 +23,7 @@ subroutine wspr_fsk8_wav(baud,xdt,f0,itone,snrdb,iwave)
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  phi=0.d0
 | 
			
		||||
  k=nint(xdt/dt)
 | 
			
		||||
  k=nint((xdt+1.0)/dt)
 | 
			
		||||
  do j=1,NN
 | 
			
		||||
     dphi=twopi*(f0+ itone(j)*baud)*dt
 | 
			
		||||
     if(k.eq.0) phi=-dphi
 | 
			
		||||
 | 
			
		||||
@ -15,13 +15,12 @@ program wspr_fsk8d
 | 
			
		||||
! Still to do: find and decode more than one signal in the specified passband.
 | 
			
		||||
 | 
			
		||||
  include 'wspr_fsk8_params.f90'
 | 
			
		||||
  parameter (NMAX=240*12000)
 | 
			
		||||
  character arg*8,message*22,cbits*50,infile*80,datetime*11
 | 
			
		||||
  character*120 data_dir
 | 
			
		||||
  complex csync(0:N7-1)                 !Sync symbols for Costas 7x7 array
 | 
			
		||||
  complex c1(0:2*N7-1)
 | 
			
		||||
  complex c2(0:2*N7-1)
 | 
			
		||||
  complex c(0:NMAX-1)                     !Complex waveform
 | 
			
		||||
  complex c(0:NMAXD-1)                     !Complex waveform
 | 
			
		||||
  real*8 fMHz
 | 
			
		||||
  real rxdata(3*ND),llr(3*ND)           !Soft symbols
 | 
			
		||||
  real a(5)                             !For twkfreq1
 | 
			
		||||
@ -86,10 +85,13 @@ program wspr_fsk8d
 | 
			
		||||
     read(infile(j2-4:j2-1),*) nutc
 | 
			
		||||
     datetime=infile(j2-11:j2-1)
 | 
			
		||||
     call wspr_fsk8_downsample(iwave,c)
 | 
			
		||||
     c(NZ:)=0.
 | 
			
		||||
 | 
			
		||||
     j0=0
 | 
			
		||||
! Need to get jpk ==> xdt     
 | 
			
		||||
     pmax=0.
 | 
			
		||||
     df1=fs/(2*N7)
 | 
			
		||||
     ipk=0
 | 
			
		||||
     jpk=0
 | 
			
		||||
! Get xdt and f0 from the sync arrays
 | 
			
		||||
     do j0=0,1000,50
 | 
			
		||||
        j0b=j0+107*NSPS
 | 
			
		||||
        c1(0:N7-1)=c(j0:j0+N7-1)*conjg(csync)
 | 
			
		||||
        c1(N7:)=0.
 | 
			
		||||
@ -97,8 +99,6 @@ program wspr_fsk8d
 | 
			
		||||
        c2(N7:)=0.
 | 
			
		||||
        call four2a(c1,2*N7,1,-1,1)
 | 
			
		||||
        call four2a(c2,2*N7,1,-1,1)
 | 
			
		||||
     pmax=0.
 | 
			
		||||
     df1=fs/(2*N7)
 | 
			
		||||
        do i=0,N7
 | 
			
		||||
           f=1500.0 + i*df1
 | 
			
		||||
           p=1.e-9*(real(c1(i))**2 + aimag(c1(i))**2 +                        &
 | 
			
		||||
@ -107,10 +107,12 @@ program wspr_fsk8d
 | 
			
		||||
           if(p.gt.pmax) then
 | 
			
		||||
              pmax=p
 | 
			
		||||
              ipk=i
 | 
			
		||||
              jpk=j0
 | 
			
		||||
           endif
 | 
			
		||||
        write(32,3201) f,ss(i)
 | 
			
		||||
3201    format(f12.4,e12.4)
 | 
			
		||||
        enddo
 | 
			
		||||
     enddo
 | 
			
		||||
     f0=ipk*df1
 | 
			
		||||
     xdt=jpk*dt - 1.0
 | 
			
		||||
     
 | 
			
		||||
     sp3n=(ss(ipk-1)+ss(ipk)+ss(ipk+1))      !Sig + 3*noise
 | 
			
		||||
     call pctile(ss,N7,45,base)
 | 
			
		||||
@ -118,13 +120,13 @@ program wspr_fsk8d
 | 
			
		||||
     pnoise=(2500.0/df1)*base                !Noise in 2500 Hz
 | 
			
		||||
     xsnr=db(psig/pnoise)                    !SNR from sync tones
 | 
			
		||||
 | 
			
		||||
     f0=ipk*df1
 | 
			
		||||
     if(jpk.ge.0) c(0:NMAXD-1-jpk)=c(jpk:NMAX-1)
 | 
			
		||||
 | 
			
		||||
     a(1)=-f0
 | 
			
		||||
     a(2:5)=0.
 | 
			
		||||
     call twkfreq1(c,NZ,fs,a,c)              !Mix from f0 down to 0
 | 
			
		||||
     call spec8(c,s,savg)                    !Get symbol spectra
 | 
			
		||||
 | 
			
		||||
     j0=0
 | 
			
		||||
     do j=1,ND
 | 
			
		||||
        k=j+7
 | 
			
		||||
        ps=s(0:7,k)
 | 
			
		||||
 | 
			
		||||
@ -94,7 +94,7 @@ extern "C" {
 | 
			
		||||
 | 
			
		||||
  void genwspr_(char* msg, char* msgsent, int itone[], int len1, int len2);
 | 
			
		||||
 | 
			
		||||
  void genwspr5_(char* msg, char* msgsent, int itone[], int len1, int len2);
 | 
			
		||||
  void genwspr_fsk8_(char* msg, char* msgsent, int itone[], int len1, int len2);
 | 
			
		||||
 | 
			
		||||
  void geniscat_(char* msg, char* msgsent, int itone[], int len1, int len2);
 | 
			
		||||
 | 
			
		||||
@ -1111,7 +1111,7 @@ void MainWindow::fixStop()
 | 
			
		||||
  if(m_mode=="WSPR") {
 | 
			
		||||
    m_hsymStop=396;
 | 
			
		||||
  } else if(m_mode=="WSPR-LF") {
 | 
			
		||||
    m_hsymStop=1030;
 | 
			
		||||
    m_hsymStop=832;
 | 
			
		||||
  } else if(m_mode=="Echo") {
 | 
			
		||||
    m_hsymStop=10;
 | 
			
		||||
  } else if (m_mode=="JT4"){
 | 
			
		||||
@ -1288,7 +1288,7 @@ void MainWindow::dataSink(qint64 frames)
 | 
			
		||||
      QString t3=cmnd;
 | 
			
		||||
      int i1=cmnd.indexOf("/wsprd ");
 | 
			
		||||
      cmnd=t3.mid(0,i1+7) + t3.mid(i1+7);
 | 
			
		||||
      if(m_mode=="WSPR-LF") cmnd=cmnd.replace("/wsprd ","/wspr5d ");
 | 
			
		||||
      if(m_mode=="WSPR-LF") cmnd=cmnd.replace("/wsprd ","/wspr_fsk8d ");
 | 
			
		||||
      if (ui) ui->DecodeButton->setChecked (true);
 | 
			
		||||
      m_cmndP1=QDir::toNativeSeparators(cmnd);
 | 
			
		||||
      p1Timer.start(1000);
 | 
			
		||||
@ -2972,7 +2972,7 @@ void MainWindow::guiUpdate()
 | 
			
		||||
                                    &m_currentMessageType, len1, len1);
 | 
			
		||||
        if(m_mode=="WSPR") genwspr_(message, msgsent, const_cast<int *> (itone),
 | 
			
		||||
                                    len1, len1);
 | 
			
		||||
        if(m_mode=="WSPR-LF") genwspr5_(message, msgsent, const_cast<int *> (itone),
 | 
			
		||||
        if(m_mode=="WSPR-LF") genwspr_fsk8_(message, msgsent, const_cast<int *> (itone),
 | 
			
		||||
                                    len1, len1);
 | 
			
		||||
        if(m_modeTx=="MSK144") {
 | 
			
		||||
          bool bcontest=m_config.contestMode();
 | 
			
		||||
@ -4569,11 +4569,11 @@ void MainWindow::on_actionWSPR_LF_triggered()
 | 
			
		||||
  m_mode="WSPR-LF";
 | 
			
		||||
  switch_mode (Modes::WSPR);
 | 
			
		||||
  m_modeTx="WSPR-LF";
 | 
			
		||||
  m_TRperiod=300;
 | 
			
		||||
  m_TRperiod=240;
 | 
			
		||||
  m_modulator->setPeriod(m_TRperiod); // TODO - not thread safe
 | 
			
		||||
  m_detector->setPeriod(m_TRperiod);  // TODO - not thread safe
 | 
			
		||||
  m_hsymStop=1030;
 | 
			
		||||
  m_toneSpacing=0.5*12000.0/8640.0;
 | 
			
		||||
  m_hsymStop=832;
 | 
			
		||||
  m_toneSpacing=12000.0/24576.0;
 | 
			
		||||
  setup_status_bar (false);
 | 
			
		||||
  ui->actionWSPR_LF->setChecked(true);
 | 
			
		||||
   m_wideGraph->setPeriod(m_TRperiod,m_nsps);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user