#include "globdef.h" #include "uidef.h" #include "seldef.h" #include "fft3def.h" #include "screendef.h" #include "sigdef.h" #include "thrdef.h" void update_bg_waterf(void) { int i,k,m,ix; float der,t1,y,yval; // A new summed power spectrum has arrived. // Convert it from linear power scale to log in units of 0.1dB. // Expand or contract so we get the number of pixels that // will fit on the screen. // Store at the pos of our current line in waterfall if(bg.pixels_per_point == 1) { for(ix=0; ix < bg_xpixels; ix++) { y=100*log10(bg_waterf_sum[ix]*bg_waterf_yfac); if(y < -32767)y=-32767; if(y>32767)y=32767; bg_waterf[bg_waterf_ptr+ix]=y; } } else { // There are more pixels than data points so we must interpolate. y=100*log10(bg_waterf_sum[0]*bg_waterf_yfac); yval=y; if(y < -32767)y=-32767; if(y>32767)y=32767; bg_waterf[bg_waterf_ptr]=y; i=1; m=bg_xpixels-bg.pixels_per_point; for(ix=0; ix32767)y=32767; bg_waterf[bg_waterf_ptr+k]=y; } yval=t1; i++; } } for(i=0; i < bg_xpoints; i++) { bg_waterf_sum[i]=0; } bg_waterf_ptr-=bg_xpixels; if(bg_waterf_ptr < 0)bg_waterf_ptr+=bg_waterf_size; bg_waterf_sum_counter=0; if( bg_waterf_lines != -1)lir_sem_post(SEM_SCREEN); } void make_fft3_all(void) { int ja,jb; int i,iw,j,k,m,p0,ss,poffs; int mm, ia, ib, ic, jr, pa, pb, pc; float t1,t2,t3,t4,x1,x2; float r1,r2,r3,r4; float *z; mm=twice_rxchan; for(ss=0; ss= 0) { // Frequency no ss is selected. if(sw_onechan) { pa=timf3_px; pb=(pa+fft3_size)&timf3_mask; ib=fft3_size-2; for( ia=0; ia bg.fft_avgnum)fft3_slowsum_cnt=bg.fft_avgnum; if(sw_onechan) { k=bg_show_pa; iw=0; i=bg_first_xpoint<<1; for(j=0; j>1]; i+=2; bg_waterf_sum[iw]+=fft3_power[k]; iw++; fft3_slowsum[j]+=fft3_power[k]; if(fft3_slowsum[j]<0)fft3_slowsum[j]=0; k++; } jr=fft3_slowsum_recalc+bg_xpoints/bg.fft_avgnum+1; if(jr > bg_xpoints)jr=bg_xpoints; for(j=fft3_slowsum_recalc; j>1]; i+=2; bg_waterf_sum[iw]+=fft3_power[k]; iw++; p0=k-bg_show_pa; fft3_slowsum[j]=fft3_power[p0]; for(m=1; m>1]; i+=2; bg_waterf_sum[iw]+=fft3_power[k]; iw++; fft3_slowsum[j]+=fft3_power[k]; if(fft3_slowsum[j]<0)fft3_slowsum[j]=0; k++; } } else { k=bg_show_pa; iw=0; i=4*bg_first_xpoint; jb=2*fft3_slowsum_recalc; for(j=0; j>2]; fft3_power[k+1]=(t3*t3+t4*t4)*fft3_fqwin_inv[i>>2]; i+=4; bg_waterf_sum[iw]+=fft3_power[k]; if(bg_twopol !=0)bg_waterf_sum[iw]+=fft3_power[k+1]; iw++; fft3_slowsum[j ]+=fft3_power[k ]; fft3_slowsum[j+1]+=fft3_power[k+1]; if(fft3_slowsum[j ]<0.00001)fft3_slowsum[j ]=0.00001; if(fft3_slowsum[j+1]<0.00001)fft3_slowsum[j+1]=0.00001; k+=2; } jr=fft3_slowsum_recalc+bg_xpoints/bg.fft_avgnum+1; if(jr > bg_xpoints)jr=bg_xpoints; ja=jb; jb=2*jr; for(j=ja; j>2]; fft3_power[k+1]=(t3*t3+t4*t4)*fft3_fqwin_inv[i>>2]; i+=4; bg_waterf_sum[iw]+=fft3_power[k]; if(bg_twopol !=0)bg_waterf_sum[iw]+=fft3_power[k+1]; iw++; p0=k-bg_show_pa; fft3_slowsum[j ]=fft3_power[p0 ]; fft3_slowsum[j+1]=fft3_power[p0+1]; for(m=1; m>2]; fft3_power[k+1]=(t3*t3+t4*t4)*fft3_fqwin_inv[i>>2]; i+=4; bg_waterf_sum[iw]+=fft3_power[k]; if(bg_twopol !=0)bg_waterf_sum[iw]+=fft3_power[k+1]; iw++; fft3_slowsum[j ]+=fft3_power[k ]; fft3_slowsum[j+1]+=fft3_power[k+1]; if(fft3_slowsum[j ]<0.00001)fft3_slowsum[j ]=0.00001; if(fft3_slowsum[j+1]<0.00001)fft3_slowsum[j+1]=0.00001; k+=2; } } if(jr != bg_xpoints) { fft3_slowsum_recalc=jr; } else { fft3_slowsum_recalc=0; } // Interleave factor is 2 for sin square window timf3_px=(timf3_px+ui.rx_rf_channels*fft3_size)&timf3_mask; bg_show_pa+=ui.rx_rf_channels*bg_xpoints; if(bg_show_pa+ui.rx_rf_channels*bg_xpoints >= fft3_show_size)bg_show_pa=0; bg_avg_counter++; // avgnum refresh interval // 1-7 1 // 8-23 2 // 24-39 3 // 40-55 4 // Large when 12.5% of the data is new. if(bg_avg_counter > ((bg.fft_avgnum+8)>>4)+1) { bg_avg_counter=0; sc[SC_SHOW_FFT3]++; lir_sem_post(SEM_SCREEN); } bg_waterf_sum_counter++; if(bg_waterf_sum_counter >= bg.waterfall_avgnum) { update_bg_waterf(); } mix0_absent:; fft3_pa=(fft3_pa+fft3_block)&fft3_mask; }