Example #1
0
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++;
	}
}
Example #3
0
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());
} 
Example #4
0
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);
	// -----------------------------------------------------------
}