#include #include "globdef.h" #include "uidef.h" #include "seldef.h" #include "fft2def.h" #include "fft1def.h" #include "screendef.h" #include "sigdef.h" #include "thrdef.h" void fft2mmx_a2_nowin(void); void fft2mmx_a2_win(void); void fft2mmx_a1_nowin(void); void fft2mmx_a1_win(void); void fft2_mmx_b1hi(void); void fft2_mmx_b2hi(void); void fft2_mmx_b1med(void); void fft2_mmx_b2med(void); void fft2_mmx_b1low(void); void fft2_mmx_b2low(void); void fft2_mmx_c1(void); void fft2_mmx_c2(void); void update_wg_waterf(void); void make_fft2(void) { int y, yval; int ja, jb, jc, jd; int i, m, ix, mm; float t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12; float r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12; float a1,a2,a3,a4; float b1,b2,b3,b4; float c1,c2,c3,c4; float d1,d2,d3,d4; float der; int ia, ib, ic, id, itab; int inc,j,k,n,n1,n2; int m2, siz,siz_d4,siz_m4,siz_m2,siz_d2; float u0,u1,u2,u3,u4,u5,u6,u7; float w0,w1,w2,w3,w4,w5,w6,w7; float x0,x1,x2,x3,x4,x5,x6,x7; float y8,y9,y2,y3,y4,y5,y6,y7; float ss1,ss2,cs1,cs2; float *z,*fftxy, *fftab, *pwra, *pwrb, *pwrc; TWOCHAN_POWER *ya, *yb; int p0, mask; short int *zxy; // The second fft may be very large. To produce optimum sensitivity // bandwidths below 1Hz may be desireable. // Every time this routine is called it will do just a fraction of // the complete transform as indicated by make_fft2_status. siz=fft2_size; fftxy=&fft2_float[fft2_pa]; z=(void*)(fftxy); if(sw_onechan) { switch (make_fft2_status) { case FFT2_NOT_ACTIVE: mask=timf2_mask; if(FFT2_CURMODE == 15) { mask=timf2_mask; p0=timf2_px; if(genparm[SECOND_FFT_SINPOW] != 0) { if(swfloat) { for(i=0; i= fft2_n-2) { n2=fft2_n-2; make_fft2_status=FFT2_MMXC; } fft2_chunk_counter=n2; for(n=n1; n 0) { fftx_na=fft2_na; eliminate_spurs(); } // Make summed power spectrum. zxy=&fft2_short_int[fft2_pa]; pwra=&fft2_power_float[fft2_na*siz]; if(ampinfo_flag != 0) { for(i=0; i fft2_maxamp[0])fft2_maxamp[0]=k; k=zxy[2*i+1]; k=abs(k); if(k > fft2_maxamp[0])fft2_maxamp[0]=k; } } if(wg_waterf_sum_counter == 0) { for(i=0; i= fft2_n-2) { n2=fft2_n-2; make_fft2_status=FFT2_C; } fft2_chunk_counter=n2; for(n=n1; n 0) { fftx_na=fft2_na; eliminate_spurs(); } // Make summed power spectrum. pwra=&fft2_power_float[fft2_na*siz]; if(wg_waterf_sum_counter == 0) { for(i=0; i0) { a2=wg.xpoints_per_pixel; } else { a2=1./wg.pixels_per_xpoint; } a3=wg.first_xpoint+0.5*a2; if(hgwat_xpoints_per_pixel == 1 || hgwat_pixels_per_xpoint == 1) { i=hgwat_first_xpoint; for(ix=0; ix < wg_xpixels; ix++) { itab=a3; a3+=a2; y=100.*log10(fft2_powersum_float[i]*wg_waterf_yfac[itab]); if(y < -32767)y=-32767; if(y>32767)y=32767; wg_waterf[wg_waterf_ptr+ix]=y; i++; } } else { if(hgwat_xpoints_per_pixel == 0) { // There are more pixels than data points so we must interpolate. i=hgwat_first_xpoint; itab=a3; a3+=a2; y=100.*log10(fft2_powersum_float[i]*wg_waterf_yfac[itab]); yval=y; if(y < -32767)y=-32767; if(y>32767)y=32767; wg_waterf[wg_waterf_ptr]=y; i=hgwat_first_xpoint+1; m=wg_xpixels-hgwat_pixels_per_xpoint; for(ix=0; ix32767)y=32767; wg_waterf[wg_waterf_ptr+k]=y; } yval=r1; i++; } } else { // There is more than one data point for each pixel. // Make a region ia to ib for the points behind each pixel. // find the largest value for each region. ia=hgwat_first_xpoint; ib=ia+hgwat_xpoints_per_pixel; yb=&fft2_xysum[siz]; for(ix=0; ix r2)r2=r1; } itab=a3; a3+=a2; a1=wg_waterf_yfac[itab]; y=100.*log10(a1*r2); if(y < -32767)y=-32767; if(y>32767)y=32767; wg_waterf[wg_waterf_ptr+ix]=y; ia=ib; ib+=hgwat_xpoints_per_pixel; if(ib >= siz)ib=siz; } } } update_wg_waterf(); make_fft2_status=FFT2_COMPUTE_GRAPH; fft2_update_liminfo(); return; case FFT2_COMPUTE_GRAPH: // Place high resolution spectra on the screen in case a frequency is // selected. if(mix1_selfreq[0]>0 && new_baseb_flag >= 0) { id=hg_last_point; pwra=&fft2_power_float[fft2_na*siz]; if(hg.spek_avgnum == 1) { k=0; for(i=hg_first_point; i=id) { ic=id; hg_recalc_pointer=hg_first_point; } // Make the sum the easy way for some points for(i=hg_first_point; i= hg.spek_avgnum/4) { hg_redraw_counter=0; sc[SC_SHOW_FFT2]++; lir_sem_post(SEM_SCREEN); } break; default: break; } } } else { switch (make_fft2_status) { case FFT2_NOT_ACTIVE: mask=timf2_mask; if(FFT2_CURMODE == 15) { ya=&fft2_xypower[fft2_na*siz]; mask=timf2_mask; mm=twice_rxchan; for(j=0; j=0; i--) { fftxy[4*i+3]=fftab[2*i+1]; fftxy[4*i+2]=fftab[2*i ]; fftxy[4*i+1]=fftxy[2*i+1]; fftxy[4*i ]=fftxy[2*i ]; } make_fft2_status=FFT2_ELIMINATE_SPURS; return; } fft2_chunk_counter=2; fft2_inc=siz/16; fft2_m1=64; fft2_m2=16; if(FFT2_CURMODE == 16) { make_fft2_status=FFT2_B; } else { // Use MMX routines if(genparm[SECOND_FFT_SINPOW] == 0) { fft2mmx_a2_nowin(); } else { fft2mmx_a2_win(); } make_fft2_status=FFT2_MMXB; return; } p0=timf2_px; if(genparm[SECOND_FFT_SINPOW] == 0) { if(swfloat) { for(j=0; j= fft2_n-2) { n2=fft2_n-2; make_fft2_status=FFT2_MMXC; } fft2_chunk_counter=n2; for(n=n1; n 0) { fftx_na=fft2_na; eliminate_spurs(); } // Make summed power spectrum. zxy=&fft2_short_int[fft2_pa]; ya=&fft2_xypower[fft2_na*siz]; if(ampinfo_flag != 0) { for(i=0; i fft2_maxamp[0])fft2_maxamp[0]=k; k=zxy[4*i+1]; k=abs(k); if(k > fft2_maxamp[0])fft2_maxamp[0]=k; k=zxy[4*i+2]; k=abs(k); if(k > fft2_maxamp[1])fft2_maxamp[1]=k; k=zxy[4*i+3]; k=abs(k); if(k > fft2_maxamp[1])fft2_maxamp[1]=k; } } // Make summed power spectrum and channel correlations. if(wg_waterf_sum_counter == 0) { for(i=0; i= fft2_n-2) { n2=fft2_n-2; make_fft2_status=FFT2_C; } fft2_chunk_counter=n2; for(n=n1; n 0) { fftx_na=fft2_na; eliminate_spurs(); } ya=&fft2_xypower[fft2_na*siz]; // Make summed power spectrum and channel correlations. if(wg_waterf_sum_counter == 0) { for(i=0; i0) { a2=wg.xpoints_per_pixel; } else { a2=1./wg.pixels_per_xpoint; } a3=wg.first_xpoint+0.5*a2; if(hgwat_xpoints_per_pixel == 1 || hgwat_pixels_per_xpoint == 1) { i=hgwat_first_xpoint; for(ix=0; ix < wg_xpixels; ix++) { t1=ya[i].x2+ya[i].y2; itab=a3; a3+=a2; y=100.*log10((t1+2*(ya[i].re_xy*ya[i].re_xy+ya[i].im_xy*ya[i].im_xy- ya[i].x2*ya[i].y2)/t1)*wg_waterf_yfac[itab]); if(y < -32767)y=-32767; if(y>32767)y=32767; wg_waterf[wg_waterf_ptr+ix]=y; i++; } } else { if(hgwat_xpoints_per_pixel == 0) { // There are more pixels than data points so we must interpolate. i=hgwat_first_xpoint; t1=ya[i].x2+ya[i].y2; itab=a3; a3+=a2; y=100.*log10((t1+2*(ya[i].re_xy*ya[i].re_xy+ya[i].im_xy*ya[i].im_xy- ya[i].x2*ya[i].y2)/t1)*wg_waterf_yfac[itab]); yval=y; if(y < -32767)y=-32767; if(y>32767)y=32767; wg_waterf[wg_waterf_ptr]=y; i=hgwat_first_xpoint+1; m=wg_xpixels-hgwat_pixels_per_xpoint; for(ix=0; ix32767)y=32767; wg_waterf[wg_waterf_ptr+k]=y; } yval=r1; i++; } } else { // There is more than one data point for each pixel. // Make a region ia to ib for the points behind each pixel. // find the largest value for each region. ia=hgwat_first_xpoint; ib=ia+hgwat_xpoints_per_pixel; yb=&fft2_xysum[siz]; for(ix=0; ix r2)r2=r1; } itab=a3; a3+=a2; a1=wg_waterf_yfac[itab]; y=100.*log10(a1*r2); if(y < -32767)y=-32767; if(y>32767)y=32767; wg_waterf[wg_waterf_ptr+ix]=y; ia=ib; ib+=hgwat_xpoints_per_pixel; if(ib >= siz)ib=siz; } } } update_wg_waterf(); make_fft2_status=FFT2_COMPUTE_GRAPH; fft2_update_liminfo(); return; case FFT2_COMPUTE_GRAPH: // Place high resolution spectra on the screen in case a frequency is // selected. if(mix1_selfreq[0]>0 && new_baseb_flag >=0) { if(fft_cntrl[FFT2_CURMODE].mmx == 0) { // Transform the polarisation and get power id=hg_last_point; pwra=&hg_fft2_pwr[2*fft2_na*hg_size]; if(hg.spek_avgnum == 1) { k=0; for(i=hg_first_point; i=id) { ic=id; hg_recalc_pointer=hg_first_point; } // Make the sum the easy way for some points for(i=hg_first_point; i=id) { ic=id; hg_recalc_pointer=hg_first_point; } // Make the sum the easy way for some points for(i=hg_first_point; i= hg.spek_avgnum/4) { hg_redraw_counter=0; sc[SC_SHOW_FFT2]++; lir_sem_post(SEM_SCREEN); } break; default: break; } } make_fft2_status=FFT2_COMPLETE; timf2_px=(timf2_px+timf2_output_block)&timf2_mask; if(genparm[AFC_ENABLE] != 0) { for(i=0; i