mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
	
	
		
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
| 
								 | 
							
								subroutine wspr_downsample(id2,k)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Input:
							 | 
						||
| 
								 | 
							
								!  id2       raw 16-bit integer data, 12000 Hz sample rate
							 | 
						||
| 
								 | 
							
								!  k         pointer to the most recent new data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Output (in common/c0com)
							 | 
						||
| 
								 | 
							
								!  c0        complex data downsampled to 1500 Hz
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  parameter (NMAX=120*12000)         !Total sample intervals per 30 minutes
							 | 
						||
| 
								 | 
							
								  parameter (NDMAX=120*1500)         !Sample intervals at 1500 Hz rate
							 | 
						||
| 
								 | 
							
								  parameter (NSMAX=1366)             !Max length of saved spectra
							 | 
						||
| 
								 | 
							
								  parameter (NFFT1=1024)
							 | 
						||
| 
								 | 
							
								  parameter (MAXFFT3=32768)
							 | 
						||
| 
								 | 
							
								  real*4 w3(MAXFFT3)
							 | 
						||
| 
								 | 
							
								  real*4 x0(NFFT1),x1(NFFT1)
							 | 
						||
| 
								 | 
							
								  real*4 x2(NFFT1+105)
							 | 
						||
| 
								 | 
							
								  real*4 ssum(NSMAX)
							 | 
						||
| 
								 | 
							
								  logical*1 lstrong(0:1023)               !Should be (0:512)
							 | 
						||
| 
								 | 
							
								  integer*2 id2(NMAX)
							 | 
						||
| 
								 | 
							
								  complex c0
							 | 
						||
| 
								 | 
							
								  common/c0com/c0(NDMAX)
							 | 
						||
| 
								 | 
							
								  data rms/999.0/,k0/99999999/,nfft3z/0/,nsps/8192/,nbfo/1500/
							 | 
						||
| 
								 | 
							
								  save
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  nfft3=nsps/4
							 | 
						||
| 
								 | 
							
								  jstep=nsps/16
							 | 
						||
| 
								 | 
							
								  if(k.gt.NMAX) go to 999
							 | 
						||
| 
								 | 
							
								  if(k.lt.nfft3) go to 999                   !Wait for enough samples to start
							 | 
						||
| 
								 | 
							
								  if(nfft3.ne.nfft3z) then
							 | 
						||
| 
								 | 
							
								     pi=4.0*atan(1.0)
							 | 
						||
| 
								 | 
							
								     do i=1,nfft3
							 | 
						||
| 
								 | 
							
								        w3(i)=2.0*(sin(i*pi/nfft3))**2             !Window for nfft3
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								     nfft3z=nfft3
							 | 
						||
| 
								 | 
							
								  endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if(k.lt.k0) then
							 | 
						||
| 
								 | 
							
								     ja=0
							 | 
						||
| 
								 | 
							
								     ssum=0.
							 | 
						||
| 
								 | 
							
								     k1=0
							 | 
						||
| 
								 | 
							
								     k8=0
							 | 
						||
| 
								 | 
							
								     x2=0.
							 | 
						||
| 
								 | 
							
								!     if(ndiskdat.eq.0) then
							 | 
						||
| 
								 | 
							
								!        id2(k+1:)=0
							 | 
						||
| 
								 | 
							
								!        c0=0.          !This is necessary to prevent "ghosts".  Not sure why.
							 | 
						||
| 
								 | 
							
								!     endif
							 | 
						||
| 
								 | 
							
								  endif
							 | 
						||
| 
								 | 
							
								  k0=k
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								  nzap=0
							 | 
						||
| 
								 | 
							
								  nbslider=0
							 | 
						||
| 
								 | 
							
								  sigmas=1.0*(10.0**(0.01*nbslider)) + 0.7
							 | 
						||
| 
								 | 
							
								  peaklimit=sigmas*max(10.0,rms)
							 | 
						||
| 
								 | 
							
								  px=0.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  nwindow=2
							 | 
						||
| 
								 | 
							
								  kstep1=NFFT1
							 | 
						||
| 
								 | 
							
								  if(nwindow.ne.0) kstep1=NFFT1/2
							 | 
						||
| 
								 | 
							
								  fac=2.0/NFFT1
							 | 
						||
| 
								 | 
							
								  nblks=(k-k1)/kstep1
							 | 
						||
| 
								 | 
							
								  gain=1.0
							 | 
						||
| 
								 | 
							
								  do nblk=1,nblks
							 | 
						||
| 
								 | 
							
								     do i=1,NFFT1
							 | 
						||
| 
								 | 
							
								        x0(i)=gain*id2(k1+i)
							 | 
						||
| 
								 | 
							
								     enddo
							 | 
						||
| 
								 | 
							
								     call timf2(x0,k,NFFT1,nwindow,nb,peaklimit,x1,   &
							 | 
						||
| 
								 | 
							
								          slimit,lstrong,px,nzap)
							 | 
						||
| 
								 | 
							
								! Mix at nbfo Hz, lowpass at +/-750 Hz, and downsample to 1500 Hz complex.
							 | 
						||
| 
								 | 
							
								     call mixlpf(x1,nbfo,c0(k8+1))
							 | 
						||
| 
								 | 
							
								     k1=k1+kstep1
							 | 
						||
| 
								 | 
							
								     k8=k8+kstep1/8
							 | 
						||
| 
								 | 
							
								  enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								999 return
							 | 
						||
| 
								 | 
							
								end subroutine wspr_downsample
							 |