mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
	
	
		
			125 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			FortranFixed
		
	
	
	
	
	
		
		
			
		
	
	
			125 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			FortranFixed
		
	
	
	
	
	
| 
								 | 
							
									subroutine spec2d(data,jz,nstep,s2,nchan,nz,psavg0,sigma)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Computes 2d spectrogram for FSK441 single-tone search and waterfall
							 | 
						||
| 
								 | 
							
								C  display.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									parameter (NFFT=256)
							 | 
						||
| 
								 | 
							
									parameter (NR=NFFT+2)
							 | 
						||
| 
								 | 
							
									parameter (NH=NFFT/2)
							 | 
						||
| 
								 | 
							
									parameter (NQ=NFFT/4)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real data(jz)
							 | 
						||
| 
								 | 
							
									real s2(nchan,nz)
							 | 
						||
| 
								 | 
							
									real x(NR)
							 | 
						||
| 
								 | 
							
									real w1(7),w2(7)
							 | 
						||
| 
								 | 
							
									real psavg(128)
							 | 
						||
| 
								 | 
							
									real psavg0(128)
							 | 
						||
| 
								 | 
							
									real ps2(128)
							 | 
						||
| 
								 | 
							
									complex c(0:NH)
							 | 
						||
| 
								 | 
							
									common/acom/a1,a2,a3,a4
							 | 
						||
| 
								 | 
							
									common/fcom/s(3100),indx(3100)
							 | 
						||
| 
								 | 
							
									equivalence (x,c)
							 | 
						||
| 
								 | 
							
									save
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									df=11025.0/NFFT
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Compute the 2d spectrogram s2(nchan,nz).  Note that in s2 the frequency
							 | 
						||
| 
								 | 
							
								C  bins are shifted down 5 bins from their natural positions.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									call set(0.0,psavg,NH)
							 | 
						||
| 
								 | 
							
									do n=1,nz
							 | 
						||
| 
								 | 
							
									   j=1 + (n-1)*nstep
							 | 
						||
| 
								 | 
							
									   call move(data(j),x,NFFT)
							 | 
						||
| 
								 | 
							
									   call xfft(x,NFFT)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									   sum=0.
							 | 
						||
| 
								 | 
							
									   do i=1,NQ
							 | 
						||
| 
								 | 
							
									      s2(i,n)=real(c(5+i))**2 + imag(c(5+i))**2
							 | 
						||
| 
								 | 
							
									      sum=sum+s2(i,n)
							 | 
						||
| 
								 | 
							
									   enddo
							 | 
						||
| 
								 | 
							
									   s(n)=sum/NQ
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Accumulate average spectrum for the whole file.
							 | 
						||
| 
								 | 
							
									   do i=1,nh
							 | 
						||
| 
								 | 
							
									      psavg0(i) = psavg0(i)+ real(c(i))**2 + imag(c(i))**2
							 | 
						||
| 
								 | 
							
									   enddo
							 | 
						||
| 
								 | 
							
									enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Normalize and save a copy of psavg0 for plotting.  Roll off the
							 | 
						||
| 
								 | 
							
								C  spectrum at 300 and 3000 Hz.
							 | 
						||
| 
								 | 
							
									do i=1,nh
							 | 
						||
| 
								 | 
							
									   psavg0(i)=3.e-5*psavg0(i)/nz
							 | 
						||
| 
								 | 
							
									   f=df*i
							 | 
						||
| 
								 | 
							
									   fac=1.0
							 | 
						||
| 
								 | 
							
									   if(f.lt.300.0) fac=f/300.0
							 | 
						||
| 
								 | 
							
									   if(f.gt.3000.0) fac=max(0.00333,(3300.0-f)/300.0)
							 | 
						||
| 
								 | 
							
									   psavg0(i)=(fac**2)*psavg0(i)
							 | 
						||
| 
								 | 
							
									enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Compute an average spectrum from the weakest 25% of time slices.
							 | 
						||
| 
								 | 
							
									call indexx(nz,s,indx)
							 | 
						||
| 
								 | 
							
									call zero(ps2,NQ)
							 | 
						||
| 
								 | 
							
									do j=1,nz/4
							 | 
						||
| 
								 | 
							
									   k=indx(j)
							 | 
						||
| 
								 | 
							
									   do i=1,NQ
							 | 
						||
| 
								 | 
							
									      ps2(i+5)=ps2(i+5)+s2(i,k)
							 | 
						||
| 
								 | 
							
									   enddo
							 | 
						||
| 
								 | 
							
									enddo
							 | 
						||
| 
								 | 
							
									ps2(1)=ps2(5)
							 | 
						||
| 
								 | 
							
									ps2(2)=ps2(5)
							 | 
						||
| 
								 | 
							
									ps2(3)=ps2(5)
							 | 
						||
| 
								 | 
							
									ps2(4)=ps2(5)
							 | 
						||
| 
								 | 
							
									sum=0.
							 | 
						||
| 
								 | 
							
									do i=6,59
							 | 
						||
| 
								 | 
							
									   sum=sum+ps2(i)
							 | 
						||
| 
								 | 
							
									enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Compute a smoothed spectrum without local peaks, and find its max.
							 | 
						||
| 
								 | 
							
									smaxx=0.
							 | 
						||
| 
								 | 
							
									do i=4,NQ
							 | 
						||
| 
								 | 
							
									   sum=0.
							 | 
						||
| 
								 | 
							
									   do k=1,7
							 | 
						||
| 
								 | 
							
									      w1(k)=ps2(i+k-4)
							 | 
						||
| 
								 | 
							
									      sum=sum+w1(k)
							 | 
						||
| 
								 | 
							
									   enddo
							 | 
						||
| 
								 | 
							
									   ave=sum/7.0
							 | 
						||
| 
								 | 
							
									   if(i.ge.14 .and. i.le.58) then
							 | 
						||
| 
								 | 
							
									      call pctile(w1,w2,7,50,base)
							 | 
						||
| 
								 | 
							
									      ave=0.25*(w2(1)+w2(2)+w2(3)+w2(4))
							 | 
						||
| 
								 | 
							
									   endif
							 | 
						||
| 
								 | 
							
									   psavg(i)=ave
							 | 
						||
| 
								 | 
							
									   smaxx=max(psavg(i),smaxx)
							 | 
						||
| 
								 | 
							
									enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Save scale factors for flattening spectra of pings.
							 | 
						||
| 
								 | 
							
									a1=1.0
							 | 
						||
| 
								 | 
							
									a2=psavg(nint(2*441/df))/psavg(nint(3*441/df))
							 | 
						||
| 
								 | 
							
									a3=psavg(nint(2*441/df))/psavg(nint(4*441/df))
							 | 
						||
| 
								 | 
							
									a4=psavg(nint(2*441/df))/psavg(nint(5*441/df))
							 | 
						||
| 
								 | 
							
									afac=4.0/(a1+a2+a3+a4)
							 | 
						||
| 
								 | 
							
									a1=afac*a1
							 | 
						||
| 
								 | 
							
									a2=afac*a2
							 | 
						||
| 
								 | 
							
									a3=afac*a3
							 | 
						||
| 
								 | 
							
									a4=afac*a4
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Normalize 2D spectrum by the average based on weakest 25% of time
							 | 
						||
| 
								 | 
							
								C  slices, smoothed, and with local peaks removed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									do i=1,NQ
							 | 
						||
| 
								 | 
							
									   do j=1,nz
							 | 
						||
| 
								 | 
							
									      s2(i,j)=s2(i,j)/max(psavg(i+5),0.01*smaxx)
							 | 
						||
| 
								 | 
							
									   enddo
							 | 
						||
| 
								 | 
							
									enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Find average of active spectral region, over the whole file.
							 | 
						||
| 
								 | 
							
									sum=0.
							 | 
						||
| 
								 | 
							
									do i=9,52
							 | 
						||
| 
								 | 
							
									   do j=1,nz
							 | 
						||
| 
								 | 
							
									      sum=sum+s2(i,j)
							 | 
						||
| 
								 | 
							
									   enddo
							 | 
						||
| 
								 | 
							
									enddo
							 | 
						||
| 
								 | 
							
									sigma=sum/(44*nz)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 	return
							 | 
						||
| 
								 | 
							
									end
							 |