diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.cc index 15b897e4d..bcfdc6859 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.cc @@ -75,9 +75,9 @@ pcps_acquisition_cc::pcps_acquisition_cc( d_mag = 0; d_input_power = 0.0; - d_sine_if = new gr_complex[d_fft_size]; - - d_fft_codes = (gr_complex*)malloc(sizeof(gr_complex) * d_fft_size); + //todo: do something if posix_memalign fails + if (posix_memalign((void**)&d_carrier, 16, d_fft_size * sizeof(gr_complex)) == 0){}; + if (posix_memalign((void**)&d_fft_codes, 16, d_fft_size * sizeof(gr_complex)) == 0){}; // Direct FFT d_fft_if = new gri_fft_complex(d_fft_size, true); @@ -92,8 +92,8 @@ pcps_acquisition_cc::pcps_acquisition_cc( pcps_acquisition_cc::~pcps_acquisition_cc() { - delete[] d_sine_if; - delete[] d_fft_codes; + free(d_carrier); + free(d_fft_codes); delete d_ifft; delete d_fft_if; @@ -175,7 +175,6 @@ int pcps_acquisition_cc::general_work(int noutput_items, int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL //aux vars - unsigned int i; float fft_normalization_factor; @@ -199,20 +198,18 @@ int pcps_acquisition_cc::general_work(int noutput_items, { //doppler search steps //Perform the carrier wipe-off - complex_exp_gen(d_sine_if, d_freq + doppler, d_fs_in, d_fft_size); - for (i = 0; i < d_fft_size; i++) - { - d_fft_if->get_inbuf()[i] = in[i] * d_sine_if[i]; - } + complex_exp_gen(d_carrier, d_freq + doppler, d_fs_in, d_fft_size); + + if (is_unaligned()==true) + { + volk_32fc_x2_multiply_32fc_u(d_fft_if->get_inbuf(), in, d_carrier, d_fft_size); + }else{ + //use directly the input vector + volk_32fc_x2_multiply_32fc_a(d_fft_if->get_inbuf(), in, d_carrier, d_fft_size); + } //3- Perform the FFT-based circular convolution (parallel time search) d_fft_if->execute(); - // Using plain C++ operations -// for (i = 0; i < d_fft_size; i++) -// { -// d_ifft->get_inbuf()[i] = (d_fft_if->get_outbuf()[i] -// * d_fft_codes[i]) / (float)d_fft_size; -// } // Using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc_a(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.h index 01cc91e3d..dac3e7f4d 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_cc.h @@ -101,7 +101,7 @@ private: unsigned int d_sampled_ms; unsigned int d_fft_size; unsigned long int d_sample_counter; - gr_complex* d_sine_if; + gr_complex* d_carrier; gr_complex* d_fft_codes; diff --git a/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample_32bits.m b/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample_32bits.m new file mode 100644 index 000000000..f1f02338f --- /dev/null +++ b/src/utils/matlab/galileo_e1_dll_pll_veml_plot_sample_32bits.m @@ -0,0 +1,93 @@ +% /*! +% * \file galileo_l1_ca_dll_pll_vml_plot_sample_64bits.m +% * \brief Read GNSS-SDR Tracking dump binary file using the provided +% function and plot some internal variables +% * \author Javier Arribas, 2011. jarribas(at)cttc.es +% * ------------------------------------------------------------------------- +% * +% * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) +% * +% * GNSS-SDR is a software defined Global Navigation +% * Satellite Systems receiver +% * +% * This file is part of GNSS-SDR. +% * +% * GNSS-SDR is free software: you can redistribute it and/or modify +% * it under the terms of the GNU General Public License as published by +% * the Free Software Foundation, either version 3 of the License, or +% * at your option) any later version. +% * +% * GNSS-SDR is distributed in the hope that it will be useful, +% * but WITHOUT ANY WARRANTY; without even the implied warranty of +% * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% * GNU General Public License for more details. +% * +% * You should have received a copy of the GNU General Public License +% * along with GNSS-SDR. If not, see . +% * +% * ------------------------------------------------------------------------- +% */ +close all; +clear all; +samplingFreq = 64e6/8; %[Hz] +channels=2; +%path='/home/javier/workspace/gnss-sdr/trunk/install/'; +path='/home/javier/workspace/gnss-sdr/trunk/data/'; +clear PRN_absolute_sample_start; +for N=1:1:channels + tracking_log_path=[path 'veml_tracking_ch_' num2str(N-1) '.dat']; + GNSS_tracking(N)= galileo_e1_dll_pll_veml_read_tracking_dump_32bits(tracking_log_path); +end + +% GNSS-SDR format conversion to MATLAB GPS receiver + +for N=1:1:channels + trackResults(N).status='T'; %fake track + trackResults(N).codeFreq=GNSS_tracking(N).code_freq_hz.'; + trackResults(N).carrFreq=GNSS_tracking(N).carrier_doppler_hz.'; + trackResults(N).dllDiscr = GNSS_tracking(N).code_error.'; + trackResults(N).dllDiscrFilt = GNSS_tracking(N).code_nco.'; + trackResults(N).pllDiscr = GNSS_tracking(N).carr_error.'; + trackResults(N).pllDiscrFilt = GNSS_tracking(N).carr_nco.'; + + trackResults(N).I_P=GNSS_tracking(N).prompt_I.'; + trackResults(N).Q_P=GNSS_tracking(N).prompt_Q.'; + + trackResults(N).I_VE= GNSS_tracking(N).VE.'; + trackResults(N).I_E= GNSS_tracking(N).E.'; + trackResults(N).I_L = GNSS_tracking(N).L.'; + trackResults(N).I_VL = GNSS_tracking(N).VL.'; + trackResults(N).Q_VE = zeros(1,length(GNSS_tracking(N).VE)); + trackResults(N).Q_E = zeros(1,length(GNSS_tracking(N).E)); + trackResults(N).Q_L =zeros(1,length(GNSS_tracking(N).L)); + trackResults(N).Q_VL =zeros(1,length(GNSS_tracking(N).VL)); + trackResults(N).PRN=N; %fake PRN + + % Use original MATLAB tracking plot function + settings.numberOfChannels=channels; + settings.msToProcess=length(GNSS_tracking(N).E)*4; + plotVEMLTracking(N,trackResults,settings) +end + +% for N=1:1:channels +% % figure; +% % plot([GNSS_tracking(N).E,GNSS_tracking(N).P,GNSS_tracking(N).L],'-*'); +% % title(['Early, Prompt, and Late correlator absolute value output for channel ' num2str(N)']); +% % figure; +% % plot(GNSS_tracking(N).prompt_I,GNSS_tracking(N).prompt_Q,'+'); +% % title(['Navigation constellation plot for channel ' num2str(N)]); +% % figure; +% % +% % plot(GNSS_tracking(N).prompt_Q,'r'); +% % hold on; +% % plot(GNSS_tracking(N).prompt_I); +% % title(['Navigation symbols I(red) Q(blue) for channel ' num2str(N)]); +% % +% figure; +% t=0:4:length(GNSS_tracking(N).carrier_doppler_hz)*4-1; +% t=t/1000; +% plot(t,GNSS_tracking(N).carrier_doppler_hz/1000); +% xlabel('Time(s)');ylabel('Doppler(KHz)');title(['Doppler frequency channel ' num2str(N)]); +% end + +