mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	Now computing (but not yet plotting) spectra s1 and s2.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/jtms3@2508 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
		
							parent
							
								
									91c5d3915a
								
							
						
					
					
						commit
						945b6ef048
					
				@ -1,185 +1,88 @@
 | 
				
			|||||||
subroutine specjtms(k)
 | 
					subroutine specjtms(k,px,pxsmo,spk0,f0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
! Starting code for a JTMS3 decoder.
 | 
					! Starting code for a JTMS3 decoder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  parameter (NSMAX=30*48000)
 | 
					  parameter (NSMAX=30*48000)
 | 
				
			||||||
  parameter (NFFT=16384,NH=NFFT/2)
 | 
					  parameter (MAXFFT=8192)
 | 
				
			||||||
  character*22 decoded
 | 
					 | 
				
			||||||
  character*72 c72
 | 
					 | 
				
			||||||
  integer*2 id
 | 
					  integer*2 id
 | 
				
			||||||
  real x(NFFT),w(NFFT)
 | 
					  real x(MAXFFT)
 | 
				
			||||||
  real p(24)
 | 
					  complex cx(MAXFFT),cx2(MAXFFT)
 | 
				
			||||||
  real rsent(258),softsym(683),sym2(258)
 | 
					  logical first
 | 
				
			||||||
  integer nsum(24)
 | 
					  common/mscom/id(1440000),s1(215),s2(215)
 | 
				
			||||||
  complex cx(NFFT),cx2(NFFT),cx0(NFFT)
 | 
					 | 
				
			||||||
  complex covx(NH)
 | 
					 | 
				
			||||||
  real s1a(NH),s2a(NH)
 | 
					 | 
				
			||||||
  integer mettab(0:255,0:1)             !Metric table
 | 
					 | 
				
			||||||
  integer data4a(9)                     !Decoded data (8-bit byte values)
 | 
					 | 
				
			||||||
  integer data4(12)                     !Decoded data (6-bit byte values)
 | 
					 | 
				
			||||||
  integer*1 data1(13)
 | 
					 | 
				
			||||||
  integer*1 isync(43)
 | 
					 | 
				
			||||||
  integer*1 chansym1(258),datsym2(215)
 | 
					 | 
				
			||||||
  logical first,window
 | 
					 | 
				
			||||||
  integer*1 i1
 | 
					 | 
				
			||||||
  equivalence (i1,i4)
 | 
					 | 
				
			||||||
  common/mscom/id(1440000),s1(215,703),s2(215,703)
 | 
					 | 
				
			||||||
  data first/.true./
 | 
					  data first/.true./
 | 
				
			||||||
  save
 | 
					  save
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  if(first) then
 | 
					  if(first) then
 | 
				
			||||||
     pi=4.0*atan(1.0)
 | 
					     pi=4.0*atan(1.0)
 | 
				
			||||||
     twopi=2.0*pi
 | 
					     twopi=2.0*pi
 | 
				
			||||||
     do i=1,nfft
 | 
					     kstep=2048
 | 
				
			||||||
        w(i)=(sin(i*pi/nfft))**2
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
     df=48000.0/nfft
 | 
					 | 
				
			||||||
     ja=nint(2600.0)/df
 | 
					 | 
				
			||||||
     jb=nint(3400.0)/df
 | 
					 | 
				
			||||||
     iz=3000.0/df
 | 
					 | 
				
			||||||
     covx=0.
 | 
					 | 
				
			||||||
     kstep=4096
 | 
					 | 
				
			||||||
     read(10,3001) rsent
 | 
					 | 
				
			||||||
3001 format(50f1.0)
 | 
					 | 
				
			||||||
     do i=1,258,6
 | 
					 | 
				
			||||||
        rsent(i)=0.
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
     rsent=2.0*rsent - 1.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     open(11,file='bpskmetrics.dat',status='old')
 | 
					 | 
				
			||||||
     bias=0.5
 | 
					 | 
				
			||||||
     scale=20.0
 | 
					 | 
				
			||||||
     do i=0,255
 | 
					 | 
				
			||||||
        read(11,*) xjunk,x0,x1
 | 
					 | 
				
			||||||
        mettab(i,0)=nint(scale*(x0-bias))
 | 
					 | 
				
			||||||
        mettab(i,1)=nint(scale*(x1-bias))
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
     close(11)
 | 
					 | 
				
			||||||
     window=.false.
 | 
					 | 
				
			||||||
     first=.false.
 | 
					     first=.false.
 | 
				
			||||||
 | 
					     sqsmo=0.
 | 
				
			||||||
  endif
 | 
					  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  t=k/48000.0
 | 
				
			||||||
 | 
					  nfft=4096
 | 
				
			||||||
 | 
					  df=48000.0/nfft
 | 
				
			||||||
 | 
					  nh=nfft/2
 | 
				
			||||||
  ib=k
 | 
					  ib=k
 | 
				
			||||||
  ia=k-kstep+1
 | 
					  ia=k-kstep+1
 | 
				
			||||||
  i0=k-nfft+1
 | 
					  i0=k-nfft+1
 | 
				
			||||||
  sq=0.
 | 
					  sq=0.
 | 
				
			||||||
  do i=ia,ib
 | 
					  do i=ia,ib
 | 
				
			||||||
     sq=sq + (0.001*id(i))**2
 | 
					     d=id(i)
 | 
				
			||||||
 | 
					     sq=sq + d*d
 | 
				
			||||||
  enddo
 | 
					  enddo
 | 
				
			||||||
  write(13,1010) t,sq,db(sq)
 | 
					  sq=sq/2048.0
 | 
				
			||||||
1010 format(3f12.3)
 | 
					  sqsmo=0.95*sqsmo + 0.05*sq
 | 
				
			||||||
 | 
					  rms=sqrt(sq)
 | 
				
			||||||
 | 
					  px=db(sq) - 23.0
 | 
				
			||||||
 | 
					  pxsmo=db(sqsmo) - 23.0
 | 
				
			||||||
 | 
					!  write(13,1010) t,rms,sq,px,pxsmo
 | 
				
			||||||
 | 
					!1010 format(5f12.3)
 | 
				
			||||||
  if(k.lt.nfft) return
 | 
					  if(k.lt.nfft) return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  x(1:nfft)=0.001*id(i0:ib)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fac=2.0/nfft
 | 
					  x(1:nfft)=id(i0:ib)
 | 
				
			||||||
 | 
					  fac=0.002/nfft
 | 
				
			||||||
  cx=fac*x
 | 
					  cx=fac*x
 | 
				
			||||||
  if(window) cx=w*cx
 | 
					 | 
				
			||||||
  call four2a(cx,nfft,1,-1,1)                    !Forward c2c FFT
 | 
					  call four2a(cx,nfft,1,-1,1)                    !Forward c2c FFT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  iz=nint(2500.0/df)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  do i=1,iz                                      !Save spectrum for plot
 | 
					  do i=1,iz                                      !Save spectrum for plot
 | 
				
			||||||
     s1a(i)=real(cx(i+1))**2 + aimag(cx(i+1))**2
 | 
					     s1(i)=real(cx(i+1))**2 + aimag(cx(i+1))**2
 | 
				
			||||||
  enddo
 | 
					  enddo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cx(1)=0.5*cx(1)
 | 
					  cx(1)=0.5*cx(1)
 | 
				
			||||||
  cx(nh+2:nfft)=0.
 | 
					  cx(nh+2:nfft)=0.
 | 
				
			||||||
  call four2a(cx,nfft,1,1,1)                     !Inverse c2c FFT
 | 
					  call four2a(cx,nfft,1,1,1)                     !Inverse c2c FFT
 | 
				
			||||||
  if(window) then
 | 
					 | 
				
			||||||
     cx(1:nh)=cx(1:nh)+covx(1:nh)               !Add previous segment's 2nd half
 | 
					 | 
				
			||||||
     covx(1:nh)=cx(nh+1:nfft)                    !Save 2nd half
 | 
					 | 
				
			||||||
  endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  t=k/48000.0
 | 
					  cx2(1:nfft)=cx(1:nfft)*cx(1:nfft)
 | 
				
			||||||
  cx2=cx*cx
 | 
					  cx2(nfft+1:)=0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  nfft=8192
 | 
				
			||||||
 | 
					  df=48000.0/nfft
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  call four2a(cx2,nfft,1,-1,1)                   !Forward c2c FFT of cx2
 | 
					  call four2a(cx2,nfft,1,-1,1)                   !Forward c2c FFT of cx2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  spk0=0.
 | 
					  spk0=0.
 | 
				
			||||||
 | 
					  j0=nint(2.0*1428.57/df)
 | 
				
			||||||
 | 
					  ja=j0-107
 | 
				
			||||||
 | 
					  jb=j0+107
 | 
				
			||||||
  do j=ja,jb
 | 
					  do j=ja,jb
 | 
				
			||||||
     sq=1.e-6*(real(cx2(j))**2 + aimag(cx2(j))**2)
 | 
					     sq=1.e-4*(real(cx2(j))**2 + aimag(cx2(j))**2)
 | 
				
			||||||
     s2a(j)=sq
 | 
					     s2(j-ja+1)=sq
 | 
				
			||||||
     f=(j-1)*df
 | 
					 | 
				
			||||||
     if(sq.gt.spk0) then
 | 
					     if(sq.gt.spk0) then
 | 
				
			||||||
        spk0=sq
 | 
					        spk0=sq
 | 
				
			||||||
 | 
					        f=(j-1)*df
 | 
				
			||||||
        f0=0.5*(f-3000.0)
 | 
					        f0=0.5*(f-3000.0)
 | 
				
			||||||
        phi0=0.5*atan2(aimag(cx2(j)),real(cx2(j)))
 | 
					        phi0=0.5*atan2(aimag(cx2(j)),real(cx2(j)))
 | 
				
			||||||
     endif
 | 
					     endif
 | 
				
			||||||
     write(15,1020) f,sq
 | 
					 | 
				
			||||||
1020 format(f10.3,f12.3)
 | 
					 | 
				
			||||||
  enddo
 | 
					  enddo
 | 
				
			||||||
 | 
					  spk0=0.5*db(spk0) - 7.0
 | 
				
			||||||
 | 
					!  write(14,3001) k/2048,spk0,f0,phi0
 | 
				
			||||||
 | 
					!3001 format(i8,3f12.3)
 | 
				
			||||||
 | 
					  call flush(14)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  slimit=2.5
 | 
					  return
 | 
				
			||||||
!  if(spk0.gt.slimit) then
 | 
					 | 
				
			||||||
  if(abs(spk0-43.5).lt.0.1) then
 | 
					 | 
				
			||||||
     write(*,1030) t,f0,phi0,spk0
 | 
					 | 
				
			||||||
1030 format('t:',f6.2,'   f0:',f7.1,'   phi0:',f6.2,'   spk0:',f8.1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     phi=phi0
 | 
					 | 
				
			||||||
     phi=3.9                                   !### test ###
 | 
					 | 
				
			||||||
     dphi=twopi*(f0+1500.0 -1.1)/48000.0
 | 
					 | 
				
			||||||
     p=0.
 | 
					 | 
				
			||||||
     nsum=0
 | 
					 | 
				
			||||||
     do i=1,nfft
 | 
					 | 
				
			||||||
        phi=phi+dphi
 | 
					 | 
				
			||||||
        if(phi.gt.twopi) phi=phi-twopi        
 | 
					 | 
				
			||||||
        cx0(i)=cx(i)*cmplx(cos(phi),-sin(phi))
 | 
					 | 
				
			||||||
        pha=atan2(aimag(cx0(i)),real(cx0(i)))
 | 
					 | 
				
			||||||
!        write(18,1060) i,cx0(i),pha
 | 
					 | 
				
			||||||
!1060    format(i6,5f12.3)
 | 
					 | 
				
			||||||
        j=mod(i-1,24) + 1
 | 
					 | 
				
			||||||
!        p(j)=p(j)+abs(cx0(i))
 | 
					 | 
				
			||||||
        p(j)=p(j) + real(cx0(i))**2 + aimag(cx0(i))**2
 | 
					 | 
				
			||||||
        nsum(j)=nsum(j)+1
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     do i=1,24
 | 
					 | 
				
			||||||
        p(i)=p(i)/nsum(i)
 | 
					 | 
				
			||||||
        write(20,1070) i,p(i)
 | 
					 | 
				
			||||||
1070    format(i6,f12.3)
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     do i=19,nfft,24
 | 
					 | 
				
			||||||
        amp=abs(cx0(i))
 | 
					 | 
				
			||||||
        pha=atan2(aimag(cx0(i)),real(cx0(i)))
 | 
					 | 
				
			||||||
        j=(i+23)/24
 | 
					 | 
				
			||||||
        write(21,1060) j,cx0(i),pha,pha+twopi,amp
 | 
					 | 
				
			||||||
1060    format(i6,5f12.3)
 | 
					 | 
				
			||||||
        softsym(j)=real(cx0(i))
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
!     do iter=1,5
 | 
					 | 
				
			||||||
     rsent=cshift(rsent,86)
 | 
					 | 
				
			||||||
     lagmax=nfft/24 - 258
 | 
					 | 
				
			||||||
     do lag=0,lagmax
 | 
					 | 
				
			||||||
        sum=dot_product(rsent,softsym(lag+1:lag+258))
 | 
					 | 
				
			||||||
        if(abs(sum).gt.smax) then
 | 
					 | 
				
			||||||
           smax=abs(sum)
 | 
					 | 
				
			||||||
           lagpk=lag
 | 
					 | 
				
			||||||
        endif
 | 
					 | 
				
			||||||
        write(22,1080) lag,sum
 | 
					 | 
				
			||||||
1080    format(i3,f12.3)
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
!     rsent=cshift(rsent,43)
 | 
					 | 
				
			||||||
!     enddo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     do i=1,258
 | 
					 | 
				
			||||||
        j=mod(i-1+2580,258) + 1
 | 
					 | 
				
			||||||
        prod=rsent(j)*softsym(lagpk+i)
 | 
					 | 
				
			||||||
        nchsym=nint(0.5*(rsent(j)+1.0))
 | 
					 | 
				
			||||||
        write(23,1090) i,prod,rsent(j),softsym(lagpk+i),j,nchsym,lagpk+i
 | 
					 | 
				
			||||||
1090    format(i5,3f10.3,3i5)
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
     
 | 
					 | 
				
			||||||
     sym2=softsym(lagpk+1:lagpk+258)
 | 
					 | 
				
			||||||
     sym2=cshift(sym2,-86)
 | 
					 | 
				
			||||||
     do i=1,258
 | 
					 | 
				
			||||||
        i4=128 + nint(6.0*sym2(i))
 | 
					 | 
				
			||||||
        if(i4.lt.0) i4=0
 | 
					 | 
				
			||||||
        if(i4.gt.255) i4=255
 | 
					 | 
				
			||||||
        chansym1(i)=i1
 | 
					 | 
				
			||||||
        write(24,2001) i,sym2(i),i4,chansym1(i)
 | 
					 | 
				
			||||||
2001    format(i6,f8.3,2i6)
 | 
					 | 
				
			||||||
     enddo
 | 
					 | 
				
			||||||
  endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
end subroutine specjtms
 | 
					end subroutine specjtms
 | 
				
			||||||
 | 
				
			|||||||
@ -392,6 +392,7 @@ void MainWindow::dataSink(int k)
 | 
				
			|||||||
  static int nwrite=0;
 | 
					  static int nwrite=0;
 | 
				
			||||||
  static int k0=99999999;
 | 
					  static int k0=99999999;
 | 
				
			||||||
  static float px=0.0;
 | 
					  static float px=0.0;
 | 
				
			||||||
 | 
					  static float pxsmo,spk0,f0;
 | 
				
			||||||
  static float sqave=0.0;
 | 
					  static float sqave=0.0;
 | 
				
			||||||
  static float green[704];
 | 
					  static float green[704];
 | 
				
			||||||
  static int ig=0;
 | 
					  static int ig=0;
 | 
				
			||||||
@ -418,7 +419,8 @@ void MainWindow::dataSink(int k)
 | 
				
			|||||||
  sqave=0.95*sqave + 0.05*sq;
 | 
					  sqave=0.95*sqave + 0.05*sq;
 | 
				
			||||||
  float pxave=10.0*log10(sqave/2048.0) - 23.0;
 | 
					  float pxave=10.0*log10(sqave/2048.0) - 23.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//  specjtms_(&k,&px);
 | 
					  specjtms_(&k,&px,&pxsmo,&spk0,&f0);
 | 
				
			||||||
 | 
					  if(spk0 > 3.0) qDebug() << (k-2048.0)/48000.0 << spk0 << f0;
 | 
				
			||||||
  QString t;
 | 
					  QString t;
 | 
				
			||||||
  t.sprintf(" Rx noise: %5.1f ",pxave);
 | 
					  t.sprintf(" Rx noise: %5.1f ",pxave);
 | 
				
			||||||
  lab2->setText(t);
 | 
					  lab2->setText(t);
 | 
				
			||||||
 | 
				
			|||||||
@ -235,10 +235,8 @@ extern void getDev(int* numDevices,char hostAPI_DeviceName[][50],
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
//----------------------------------------------------- C and Fortran routines
 | 
					//----------------------------------------------------- C and Fortran routines
 | 
				
			||||||
  void specjtms_(int* k, float* px);
 | 
					  void specjtms_(int* k, float* px, float* pxsmo, float* spk0, float* f0);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  void genjtms3_(char* message, short iwave[], int* nwave, int len1);
 | 
					  void genjtms3_(char* message, short iwave[], int* nwave, int len1);
 | 
				
			||||||
 | 
					 | 
				
			||||||
  void makepings_(short iwave[], int* nwave);
 | 
					  void makepings_(short iwave[], int* nwave);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void gen65_(char* msg, int* mode65, double* samfac, int* nsendingsh,
 | 
					  void gen65_(char* msg, int* mode65, double* samfac, int* nsendingsh,
 | 
				
			||||||
 | 
				
			|||||||
@ -134,7 +134,7 @@ void CPlotter::draw(float green[], int ig)                       //draw()
 | 
				
			|||||||
  for(i=0; i<ig; i++) {
 | 
					  for(i=0; i<ig; i++) {
 | 
				
			||||||
    y = green[i];
 | 
					    y = green[i];
 | 
				
			||||||
    painter1.drawPoint(i,0);
 | 
					    painter1.drawPoint(i,0);
 | 
				
			||||||
    int y2 = 7*(y-m_plotZero);
 | 
					    int y2 = 4*(y-m_plotZero);
 | 
				
			||||||
    if (y2<0) y2=0;
 | 
					    if (y2<0) y2=0;
 | 
				
			||||||
    if (y2>254) y2=254;
 | 
					    if (y2>254) y2=254;
 | 
				
			||||||
    LineBuf[j].setX(i);
 | 
					    LineBuf[j].setX(i);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user