typename diagram_traits<LatticeT>::gk_type diagram_traits<LatticeT>::calc_static_bubbles(gk_type const& GF) { typename diagram_traits<LatticeT>::gk_type out(GF.grids()); const auto& fgrid = std::get<0>(GF.grids()); int knorm = GF[0].size(); for (fmatsubara_grid::point iw1 : fgrid.points()) { auto g1 = run_fft(GF[iw1], FFTW_FORWARD); out[iw1] = run_fft(g1*g1, FFTW_BACKWARD)/knorm; }; return out / (-fgrid.beta()); }
/* void main() { MakeWave(); get_fft_result(input,DATA); printf("ok\n"); while(1); } */ void get_fft_result(short int* data,short int* result) { int i; short int* pointer = data; //生成旋转因子 for ( i=0;i<sample_num;i++ ) { sin_tab[i]=sin(PI*2*i/sample_num); cos_tab[i]=cos(PI*2*i/sample_num); } //生成复数 for ( i=0;i<sample_num;i++ ) { fWaveR[i]=*pointer; pointer++; fWaveI[i]=0.0f; w[i]=0.0f; } //进行FFT计算 run_fft(fWaveR,fWaveI); //保存结果 pointer = result; for ( i=0;i<sample_num;i++ ) { *result = 10*w[i]/512; result++; } }
typename diagram_traits<LatticeT>::gk_type diagram_traits<LatticeT>::calc_bubbles(gk_type const& GF, bmatsubara_grid::point W) { if (is_float_equal(W.value(), 0)) return diagram_traits<LatticeT>::calc_static_bubbles(GF); typename diagram_traits<LatticeT>::gk_type GF_shift(GF.grids()); const auto& fgrid = std::get<0>(GF.grids()); double beta = fgrid.beta(); int Wn = BMatsubaraIndex(W.value(), beta); for (auto w : fgrid.points()) { if (FMatsubaraIndex(w, beta) + Wn >= fgrid.min_n() && FMatsubaraIndex(w, beta) + Wn < fgrid.max_n()) GF_shift[w] = GF[w.index() + Wn]; else GF_shift[w] = 0.0; } typename diagram_traits<LatticeT>::gk_type out(GF.grids()); int knorm = GF[0].size(); for (fmatsubara_grid::point iw1 : fgrid.points()) { auto g1 = run_fft(GF[iw1], FFTW_FORWARD); auto g2 = run_fft(GF_shift[iw1], FFTW_FORWARD); out[iw1] = run_fft(g1*g2, FFTW_BACKWARD)/knorm; }; return out / (-fgrid.beta()); }
void analysis() { for(int i = 0; i < num_files; i++) { // File Progress Display printf("File %i/%i...\n", i + 1, num_files); // Raw file loading sprintf(aux_path, "%s%s%06d_%06d", raw_data_path, RAW_FILE_PREFIX, curr_run, i + 1); fileStream = fopen(aux_path, "r"); if(fread(data, 1, file_lenght, fileStream) != file_lenght) { fprintf(stderr, "ERROR Reading RAW File!\n"); exit(1); } fclose(fileStream); // Parsing each frame fron the current raw file for(int j = 0; j < num_fra_p_file; j++) { // Radio data Parsing for(int k = 0; k < data_frame_size; k++) { frame[j][k] = (unsigned char)data[k + j * file_frame_size]; } // GPS data Parsing intAux = i * num_fra_p_file + j; for(int k = 0; k < 4; k++) { aux1 = ((int)data[(j + 1) * file_frame_size - EXTRA_DATA_SIZE + 0 + k]) & 0xFF; aux2 = ((int)data[(j + 1) * file_frame_size - EXTRA_DATA_SIZE + 4 + k]) & 0xFF; aux3 = ((int)data[(j + 1) * file_frame_size - EXTRA_DATA_SIZE + 8 + k]) & 0xFF; gps_pos[intAux][0] |= aux1 << 8 * k; gps_pos[intAux][1] |= aux2 << 8 * k; gps_pos[intAux][2] |= aux3 << 8 * k; } // Gain Parsing gain[j + i * num_fra_p_file] = data[(j + 1) * file_frame_size - 1]; } // Looping thru each frame of the current file loaded for(int j = 0; j < num_fra_p_file; j++) { cur_fr = j + i * num_fra_p_file; cur_gain = valid_gain_values[(int)gain[j + i * num_fra_p_file]]; // Getting complex signal cpxAux = 0; for(int k = 0; k < frame_size; k++) { in_phase[k] = ((double)frame[j][2 * k] - 128) / 128; quadrature[k] = ((double)frame[j][2 * k + 1] - 128) / 128; signal_cpx[k] = in_phase[k] / cur_gain + I * quadrature[k] / cur_gain; cpxAux += signal_cpx[k]; } // Removing DC cpxAux /= frame_size; for(int k = 0; k < frame_size; k++) { signal_cpx[k] -= cpxAux; } int k = 0; int jump = 1; for(int l = 0; l < num_col; l++) { pre_corr[l] = INT_MIN; cur_corr[l] = INT_MIN; max_corr[l] = INT_MIN; } dblAux1 = ((double)100 * (cur_fr + 1)) / ttl_n_fr; printf("Frame %05d/%05d Process Running. (%.2f%%)\n", (cur_fr + 1), ttl_n_fr, dblAux1); while(k < sld_fft_stps) { // Slicing for(int l = 0; l < pul_num_sam; l++) { fft_in[l] = signal_cpx[k + l]; } run_fft(); // Getting peak for each band of each collar and defining next jump size flag intAux = 0; for(int l = 0; l < num_col; l++) { cur_corr[l] = (double)INT_MIN; for(int m = fft_bin[l] - bin_em; m <= fft_bin[l] + bin_em; m++) if(m > -1 && m < pul_num_sam && fft_abs[m] > cur_corr[l]) { cur_corr[l] = fft_abs[m]; } if(cur_corr[l] > max_corr[l]) { max_corr[l] = cur_corr[l]; max_corr_index[l] = k; } if(cur_corr[l] > pre_corr[l]) { intAux = 1; } pre_corr[l] = cur_corr[l]; } // Defining next jump size if(intAux) { jump = floor(jump / 2); } else { jump = floor(jump * 2); } // Ensuring jump size is within limits if(jump > max_jump) { jump = max_jump; } else if(jump < min_jump) { jump = min_jump; } k += jump; } for(int l = 0; l < num_col; l++) { // Slicing for(int m = 0; m < pul_num_sam; m++) { fft_in[m] = signal_cpx[max_corr_index[l] + m]; } run_fft(); // Defining noise and singal ranges aux1 = fft_bin[l] - bin_em; aux2 = fft_bin[l] + bin_em; if(aux1 < 0) { aux1 = 0; } if(aux2 > pul_num_sam - 1) { aux2 = pul_num_sam - 1; } // Signal Power Calculation signal_pwr = INT_MIN; for(int m = aux1; m <= aux2; m++) if(fft_abs[m] > signal_pwr) { signal_pwr = fft_abs[m]; } signal_pwr = pow(signal_pwr, 2); if(signal_pwr < 0) { signal_pwr = 0; } // Noise Power Calculation noise_pwr = 0; intAux = 0; for(int m = 0; m < pul_num_sam; m++) { if(m < aux1 || m > aux2) { noise_pwr += pow(fft_abs[m], 2); intAux++; } } noise_pwr /= intAux; // SNR caculation pulse_snr[l][cur_fr] = 10 * log10(signal_pwr / noise_pwr / pul_num_sam); } } } // ----------------------------------------------------------- // Storing results // ----------------------------------------------------------- // File Path / Opening file sprintf(aux_path, "%s%06d.csv", CSV_PREFIX, curr_run); printf("%s\n", aux_path); fileStream = fopen(aux_path, "w+"); // File writing for(int i = 0; i < ttl_n_fr; i++) { for(int j = 0; j < 3; j++) { fprintf(fileStream, "%d,", gps_pos[i][j]); } fprintf(fileStream, "%d,", gain_values[(int)gain[i]]); fprintf(fileStream, "%f,", valid_gain_values[(int)gain[i]]); for(int j = 0; j < num_col - 1; j++) { fprintf(fileStream, "%d,", (int)(1000 * pulse_snr[j][i])); } fprintf(fileStream, "%d\n", (int)(1000 * pulse_snr[num_col - 1][i])); } // Closing file fclose(fileStream); // ----------------------------------------------------------- }