mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
	
	
		
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			FortranFixed
		
	
	
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			FortranFixed
		
	
	
	
	
	
| 
								 | 
							
								      subroutine flatten(s2,nbins,jz,psa,ref,birdie,variance)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Examines the 2-d spectrum s2(nbins,jz) and makes a reference spectrum
							 | 
						||
| 
								 | 
							
								C  from the jz/2 spectra below the 50th percentile in total power.  Uses
							 | 
						||
| 
								 | 
							
								C  reference spectrum (with birdies removed) to flatten the passband.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      real s2(nbins,jz)               !2d spectrum
							 | 
						||
| 
								 | 
							
								      real psa(nbins)                 !Grand average spectrum
							 | 
						||
| 
								 | 
							
								      real ref(nbins)                 !Ref spect: smoothed ave of lower half
							 | 
						||
| 
								 | 
							
								      real birdie(nbins)              !Spec (with birdies) for plot, in dB
							 | 
						||
| 
								 | 
							
								      real variance(nbins)
							 | 
						||
| 
								 | 
							
								      real ref2(750)                  !Work array
							 | 
						||
| 
								 | 
							
								      real power(300)
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								C  Find power in each time block, then get median
							 | 
						||
| 
								 | 
							
								      do j=1,jz
							 | 
						||
| 
								 | 
							
								         s=0.
							 | 
						||
| 
								 | 
							
								         do i=1,nbins
							 | 
						||
| 
								 | 
							
								            s=s+s2(i,j)
							 | 
						||
| 
								 | 
							
								         enddo
							 | 
						||
| 
								 | 
							
								         power(j)=s
							 | 
						||
| 
								 | 
							
								      enddo
							 | 
						||
| 
								 | 
							
								      call pctile(power,ref2,jz,50,xmedian)
							 | 
						||
| 
								 | 
							
								      if(jz.lt.5) go to 900
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Get variance in each freq channel, using only those spectra with
							 | 
						||
| 
								 | 
							
								C  power below the median.
							 | 
						||
| 
								 | 
							
								      do i=1,nbins                        
							 | 
						||
| 
								 | 
							
								         s=0.
							 | 
						||
| 
								 | 
							
								         nsum=0
							 | 
						||
| 
								 | 
							
								         do j=1,jz
							 | 
						||
| 
								 | 
							
								            if(power(j).le.xmedian) then
							 | 
						||
| 
								 | 
							
								               s=s+s2(i,j)
							 | 
						||
| 
								 | 
							
								               nsum=nsum+1
							 | 
						||
| 
								 | 
							
								            endif
							 | 
						||
| 
								 | 
							
								         enddo
							 | 
						||
| 
								 | 
							
								         s=s/nsum
							 | 
						||
| 
								 | 
							
								         sq=0.
							 | 
						||
| 
								 | 
							
								         do j=1,jz
							 | 
						||
| 
								 | 
							
								            if(power(j).le.xmedian) sq=sq + (s2(i,j)/s-1.0)**2
							 | 
						||
| 
								 | 
							
								         enddo
							 | 
						||
| 
								 | 
							
								         variance(i)=sq/nsum
							 | 
						||
| 
								 | 
							
								      enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Get grand average, and average of spectra with power below median.
							 | 
						||
| 
								 | 
							
								      call zero(psa,nbins)
							 | 
						||
| 
								 | 
							
								      call zero(ref,nbins)
							 | 
						||
| 
								 | 
							
								      nsum=0
							 | 
						||
| 
								 | 
							
								      do j=1,jz
							 | 
						||
| 
								 | 
							
								         call add(psa,s2(1,j),psa,nbins)
							 | 
						||
| 
								 | 
							
								         if(power(j).le.xmedian) then
							 | 
						||
| 
								 | 
							
								            call add(ref,s2(1,j),ref,nbins)
							 | 
						||
| 
								 | 
							
								            nsum=nsum+1
							 | 
						||
| 
								 | 
							
								         endif
							 | 
						||
| 
								 | 
							
								      enddo
							 | 
						||
| 
								 | 
							
								      do i=1,nbins                          !Normalize the averages
							 | 
						||
| 
								 | 
							
								         psa(i)=psa(i)/jz
							 | 
						||
| 
								 | 
							
								         ref(i)=ref(i)/nsum
							 | 
						||
| 
								 | 
							
								         birdie(i)=ref(i)                   !Copy ref into birdie
							 | 
						||
| 
								 | 
							
								      enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Compute smoothed reference spectrum with narrow lines (birdies) removed
							 | 
						||
| 
								 | 
							
								      do i=4,nbins-3
							 | 
						||
| 
								 | 
							
								         rmax=-1.e10
							 | 
						||
| 
								 | 
							
								         do k=i-3,i+3                  !Get highest point within +/- 3 bins
							 | 
						||
| 
								 | 
							
								            if(ref(k).gt.rmax) then
							 | 
						||
| 
								 | 
							
								               rmax=ref(k)
							 | 
						||
| 
								 | 
							
								               kpk=k
							 | 
						||
| 
								 | 
							
								            endif
							 | 
						||
| 
								 | 
							
								         enddo
							 | 
						||
| 
								 | 
							
								         sum=0.
							 | 
						||
| 
								 | 
							
								         nsum=0
							 | 
						||
| 
								 | 
							
								         do k=i-3,i+3
							 | 
						||
| 
								 | 
							
								            if(abs(k-kpk).gt.1) then
							 | 
						||
| 
								 | 
							
								               sum=sum+ref(k)
							 | 
						||
| 
								 | 
							
								               nsum=nsum+1
							 | 
						||
| 
								 | 
							
								            endif
							 | 
						||
| 
								 | 
							
								         enddo
							 | 
						||
| 
								 | 
							
								         ref2(i)=sum/nsum
							 | 
						||
| 
								 | 
							
								      enddo
							 | 
						||
| 
								 | 
							
								      call move(ref2(4),ref(4),nbins-6)     !Copy smoothed ref back into ref
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      call pctile(ref(4),ref2,nbins-6,50,xmedian)  !Get median in-band level
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C  Fix ends of reference spectrum
							 | 
						||
| 
								 | 
							
								      do i=1,3
							 | 
						||
| 
								 | 
							
								         ref(i)=ref(4)
							 | 
						||
| 
								 | 
							
								         ref(nbins+1-i)=ref(nbins-3)
							 | 
						||
| 
								 | 
							
								      enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      facmax=30.0/xmedian
							 | 
						||
| 
								 | 
							
								      do i=1,nbins                          !Flatten the 2d spectrum
							 | 
						||
| 
								 | 
							
								         fac=xmedian/ref(i)
							 | 
						||
| 
								 | 
							
								         fac=min(fac,facmax)
							 | 
						||
| 
								 | 
							
								         do j=1,jz
							 | 
						||
| 
								 | 
							
								            s2(i,j)=fac*s2(i,j)
							 | 
						||
| 
								 | 
							
								         enddo
							 | 
						||
| 
								 | 
							
								         psa(i)=dB(psa(i)) + 25.
							 | 
						||
| 
								 | 
							
								         ref(i)=dB(ref(i)) + 25.
							 | 
						||
| 
								 | 
							
								         birdie(i)=db(birdie(i)) + 25.
							 | 
						||
| 
								 | 
							
								      enddo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								900   continue
							 | 
						||
| 
								 | 
							
								      return
							 | 
						||
| 
								 | 
							
								      end
							 |