#include "globdef.h" #include "uidef.h" #include "fft1def.h" #include "fft2def.h" #include "fft3def.h" #include "seldef.h" #include "sigdef.h" #include "screendef.h" void clear_wide_maxamps(void) { int i; for(i=0; i<2*MAX_RX_CHANNELS; i++) { fft1_maxamp[i]=0; timf2_maxamp[i]=0; } for(i=0; i= 2)return; ad_wts=(timf1p_pa-timf1p_px+timf1_bytes)&timf1_bytemask; ad_wts/=bytes_per_fragment; ad_wttim=(float)(ad_wts)/ui.rx_ad_speed; } void make_fft2_wttim(void) { // *********************************************** // In case second fft is enabled we have: // timf2_wtb back transformed fft1 blocks waiting in timf2 and // fft2_wtb completed fft2 transforms waiting to be back transformed // fft2_wtb should be small or zero unless AFC is operating on delayed signal. // Back transformed fft1 transforms waiting in timf2. timf2_wtb=(float)((timf2_pa-timf2_px+timf2_mask+1)&timf2_mask) /timf2_input_block; timf2_wttim=timf2_wtb*fft1_blocktime; // fft2 transforms waiting for back transformation. fft2_wtb=(fft2_na-fft2_nx+max_fft2n)&fft2n_mask; fft2_wttim=fft2_wtb*fft2_blocktime; } void make_timing_info(void) { make_ad_wttim(); total_wttim=ad_wttim; if( genparm[SECOND_FFT_ENABLE] != 0 ) { // *********************************************** // fft1_wtb completed fft1 transforms waiting to be back transformed // to the time domain. // This number should be small or zero unless AFC is operating without // second fft on delayed signal. fft1_wtb=(float)((fft1_pa-fft1_px+fft1_mask+1)&fft1_mask)/fft1_block; fft1_wttim=fft1_wtb*fft1_blocktime; total_wttim+=fft1_wttim; if(mix1_selfreq[0] >=0 ) { make_fft2_wttim(); total_wttim+=timf2_wttim; total_wttim+=fft2_wttim; } else { timf2_wttim=0; fft2_wttim=0; } } else { if(mix1_selfreq[0] >=0 ) { // *********************************************** // fft1_wtb completed fft1 transforms waiting to be // transformed to the baseband by mix1. if(genparm[AFC_ENABLE] == 0) { fft1_wtb=(float)((fft1_pa-fft1_px+fft1_mask+1)&fft1_mask)/fft1_block; } else { fft1_wtb=(fft1_na-fft1_nx+max_fft1n)&fft1n_mask; } fft1_wttim=fft1_wtb*fft1_blocktime; total_wttim+=fft1_wttim; } else { fft1_wttim=0; } } // ************************************************ // If a frequency is selected for audio output: if(mix1_selfreq[0] >=0 ) { // Samples waiting in timf3. timf3_wts=((timf3_pa-timf3_px+timf3_size)&timf3_mask)/twice_rxchan; timf3_wttim=timf3_wts/timf3_sampling_speed; total_wttim+=timf3_wttim; // Blocks waiting as finished transforms. fft3_wtb=(fft3_pa-fft3_px+fft3_totsiz)&fft3_mask; fft3_wtb/=fft3_block; // We get fft3_size/2 points from each block fft3_wttim=0.5*fft3_wtb*fft3_size/timf3_sampling_speed; total_wttim+=fft3_wttim; // Samples waiting in the baseband baseb_wttim=baseb_wts/baseband_sampling_speed; total_wttim+=baseb_wttim; // Data waiting for output db_wts=(daout_pa-daout_px+daout_bufmask+1)&daout_bufmask; db_wts/=(rx_daout_channels*rx_daout_bytes); db_wttim=(float)(db_wts)/genparm[DA_OUTPUT_SPEED]; total_wttim+=db_wttim; if(rx_audio_out != -1) { da_wts=make_da_wts(); if(kill_all_flag) return; da_wttim=(float)(da_wts)/genparm[DA_OUTPUT_SPEED]; total_wttim+=da_wttim; } else { da_wts=0; da_wttim=0; rx_da_maxbytes=0; } } else { db_wts=0; db_wttim=0; da_wts=0; da_wttim=0; } /* fprintf(dmp, "\nAD %.1f ft1 %.1f tf2 %.1f ft2 %.1f tf3 %.1f ft3 %.1f bas %.1f db %.1f da %.1f", ad_wttim,fft1_wttim,timf2_wttim,fft2_wttim,timf3_wttim, fft3_wttim,baseb_wttim,db_wttim,da_wttim); */ } void show_amp_info(void) { char s[80]; int line, i, k, n; float t1; k=(screen_last_line+1)*text_height; n=k-8*text_height; hide_mouse(0,28*text_width,n,k); line=screen_last_line; sprintf(s,"%6.2f ",sqrt(fft1_noise_floor)); lir_text(20,line,s); line--; k=5; for(i=0; i ui.rx_ad_speed*1.01 || measured_ad_speed < ui.rx_ad_speed*0.99) { if( measured_ad_speed > 0) { sprintf(s,"A/D SPEED ERROR: %dHz (nominal %dHz)", (int)(measured_ad_speed),ui.rx_ad_speed); wg_error(s,2); } } make_timing_info(); // // ******* 1 ********** line=screen_last_line; sprintf(s,"%1.3f ",total_wttim); lir_text(19,line,s); // // ******* 2 ********** line--; sprintf(s,"%1.3f ",ad_wttim); s[5]=0; lir_text(6,line,s); sprintf(s,"%1.3f",fft1_wttim); s[5]=0; lir_text(19,line,s); // // ******* 3 ********** if( genparm[SECOND_FFT_ENABLE] != 0 ) { line--; sprintf(s,"%1.3f ",timf2_wttim); s[5]=0; lir_text(6,line,s); sprintf(s,"%1.3f ",fft2_wttim); lir_text(19,line,s); } // // ******* 4 ********** line--; sprintf(s,"%1.3f ",timf3_wttim); s[5]=0; lir_text(6,line,s); sprintf(s,"%1.3f ",fft3_wttim); s[5]=0; lir_text(19,line,s); // // ******* 5 ********** line--; sprintf(s,"%1.3f ",baseb_wttim); s[5]=0; lir_text(6,line,s); // Write buf, how much time the data in daout[] corresponds to sprintf(s,"%1.3f ",db_wttim); s[5]=0; lir_text(19,line,s); // // ******* 6 ********** line--; // Write D/A, time of data in output buffer (already written to device) sprintf(s,"%1.3f ",da_wttim); s[5]=0; lir_text(6,line,s); // Write MIN, the minimum time margin in the output buffer. t1=rx_da_totbytes-rx_da_maxbytes; if(t1<0)t1=0; t1/=rx_daout_channels*rx_daout_bytes*genparm[DA_OUTPUT_SPEED]; sprintf(s,"%1.3f ",t1); s[5]=0; lir_text(19,line,s); if(measured_da_speed > 0) { sprintf(s,"D/A:%dHz ",(int)(measured_da_speed)); lir_text(14,screen_last_line-7,s); } sprintf(s,"A/D:%dHz ",(int)(measured_ad_speed)); lir_text(0,screen_last_line-7,s); } void timing_info_texts(void) { int line; clear_timinfo_lines(); if(ampinfo_flag)clear_ampinfo_lines(); ampinfo_flag=0; if(timinfo_flag == 0)return; // // ******* 1 ********** line=screen_last_line; lir_text(14,line,"Tot"); // // ******* 2 ********** line--; lir_text(2,line,"Raw"); lir_text(13,line,"fft1"); if( genparm[SECOND_FFT_ENABLE] != 0 ) { // // ******* 3 ********** line--; lir_text(0,line,"timf2"); lir_text(13,line,"fft2"); } // // ******* 4 ********** line--; lir_text(0,line,"timf3"); lir_text(13,line,"fft3"); // // ******* 5 ********** line--; lir_text(0,line,"baseb"); lir_text(14,line,"buf"); // // ******* 6 ********** line--; lir_text(0,line,"D/A"); lir_text(14,line,"MIN"); // // ******* 7 ********** line--; lir_text(6,line,"Delay times"); }