double spread_complex(ref fft_results_rec this_fft_result, int analysis_number) { double sc_y = 0.0, sc_x; int sc_i = analysis_recs[analysis_number].lo_bins - 1; fft_result[sc_i] = Math.Sqrt(fastsqr(fft_array[sc_i * 2]) + fastsqr(fft_array[sc_i * 2 + 1])) * analysis_recs[analysis_number].skewing_function[sc_i]; for (sc_i = analysis_recs[analysis_number].lo_bins; sc_i <= analysis_recs[analysis_number].hi_bins; sc_i++) { sc_x = Math.Sqrt(fastsqr(fft_array[sc_i * 2]) + fastsqr(fft_array[sc_i * 2 + 1])) * analysis_recs[analysis_number].skewing_function[sc_i]; sc_y += sc_x; fft_result[sc_i] = sc_x; } sc_i = analysis_recs[analysis_number].hi_bins + 1; sc_x = Math.Sqrt(fastsqr(fft_array[sc_i * 2]) + fastsqr(fft_array[sc_i * 2 + 1])) * analysis_recs[analysis_number].skewing_function[sc_i]; //sc_y += sc_x; fft_result[sc_i] = sc_x; double snr_value_exp = Math.Pow(2, snr_value / lg2x20); double noise_threshold_shift_exp = Math.Pow(2, noise_threshold_shift / lg2x20); this_fft_result.savebin = (float)(sc_y / analysis_recs[analysis_number].num_bins * snr_value_exp); sc_y = 5623413251903.490803949510; // MaxDb { 10^(255/20) } for (sc_i = analysis_recs[analysis_number].lo_bins; sc_i <= analysis_recs[analysis_number].max_bins; sc_i++) { double sc_z = ((fft_result[sc_i - 1] + fft_result[sc_i + 1]) * analysis_recs[analysis_number].spreading_averages_rem[sc_i] + fft_result[sc_i]) * analysis_recs[analysis_number].spreading_averages_rec[sc_i]; sc_y = Math.Min(sc_y, sc_z); } this_fft_result.sminbin = (float)(sc_y * noise_threshold_shift_exp); return(lg2x20 * fastlog2(Math.Min(this_fft_result.savebin, this_fft_result.sminbin))); }
double spread_complex(ref fft_results_rec this_fft_result, int analysis_number) { double sc_y = 0.0, sc_x; int sc_i = analysis_recs[analysis_number].lo_bins - 1; fft_result[sc_i] = Math.Sqrt(fastsqr(fft_array[sc_i * 2]) + fastsqr(fft_array[sc_i * 2 + 1])) * analysis_recs[analysis_number].skewing_function[sc_i]; for (sc_i = analysis_recs[analysis_number].lo_bins; sc_i <= analysis_recs[analysis_number].hi_bins; sc_i++) { sc_x = Math.Sqrt(fastsqr(fft_array[sc_i * 2]) + fastsqr(fft_array[sc_i * 2 + 1])) * analysis_recs[analysis_number].skewing_function[sc_i]; sc_y += sc_x; fft_result[sc_i] = sc_x; } sc_i = analysis_recs[analysis_number].hi_bins + 1; sc_x = Math.Sqrt(fastsqr(fft_array[sc_i * 2]) + fastsqr(fft_array[sc_i * 2 + 1])) * analysis_recs[analysis_number].skewing_function[sc_i]; //sc_y += sc_x; fft_result[sc_i] = sc_x; double snr_value_exp = Math.Pow(2, snr_value / lg2x20); double noise_threshold_shift_exp = Math.Pow(2, noise_threshold_shift / lg2x20); this_fft_result.savebin = (float)(sc_y / analysis_recs[analysis_number].num_bins * snr_value_exp); sc_y = 5623413251903.490803949510; // MaxDb { 10^(255/20) } for (sc_i = analysis_recs[analysis_number].lo_bins; sc_i <= analysis_recs[analysis_number].max_bins; sc_i++) { double sc_z = ((fft_result[sc_i - 1] + fft_result[sc_i + 1]) * analysis_recs[analysis_number].spreading_averages_rem[sc_i] + fft_result[sc_i]) * analysis_recs[analysis_number].spreading_averages_rec[sc_i]; sc_y = Math.Min(sc_y, sc_z); } this_fft_result.sminbin = (float)(sc_y * noise_threshold_shift_exp); return lg2x20 * fastlog2(Math.Min(this_fft_result.savebin, this_fft_result.sminbin)); }