diff --git a/src/algorithms/libs/conjugate_cc.cc b/src/algorithms/libs/conjugate_cc.cc
index 60063473a..c216d3ece 100644
--- a/src/algorithms/libs/conjugate_cc.cc
+++ b/src/algorithms/libs/conjugate_cc.cc
@@ -1,3 +1,33 @@
+/*!
+ * \file conjugate_cc.cc
+ * \brief Conjugate a stream of gr_complex
+ * \author Carles Fernandez Prades, cfernandez(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2017 (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 .
+ *
+ * -------------------------------------------------------------------------
+ */
+
#include "conjugate_cc.h"
#include
#include
diff --git a/src/algorithms/libs/conjugate_cc.h b/src/algorithms/libs/conjugate_cc.h
index 556f79c6d..55466a0d1 100644
--- a/src/algorithms/libs/conjugate_cc.h
+++ b/src/algorithms/libs/conjugate_cc.h
@@ -1,6 +1,6 @@
/*!
* \file conjugate_cc.h
- * \brief Conjugate
+ * \brief Conjugate a stream of gr_complex
* \author Carles Fernandez Prades, cfernandez(at)cttc.es
*
* -------------------------------------------------------------------------
diff --git a/src/algorithms/libs/conjugate_ic.cc b/src/algorithms/libs/conjugate_ic.cc
index b1f85e39f..29fa1744e 100644
--- a/src/algorithms/libs/conjugate_ic.cc
+++ b/src/algorithms/libs/conjugate_ic.cc
@@ -1,3 +1,33 @@
+/*!
+ * \file conjugate_ic.cc
+ * \brief Conjugate a stream of lv_8sc_t ( std::complex )
+ * \author Carles Fernandez Prades, cfernandez(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2017 (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 .
+ *
+ * -------------------------------------------------------------------------
+ */
+
#include "conjugate_ic.h"
#include
#include
diff --git a/src/algorithms/libs/conjugate_ic.h b/src/algorithms/libs/conjugate_ic.h
index 38eb21a35..efec8e2f8 100644
--- a/src/algorithms/libs/conjugate_ic.h
+++ b/src/algorithms/libs/conjugate_ic.h
@@ -1,6 +1,6 @@
/*!
* \file conjugate_ic.h
- * \brief Adapts a std::complex stream into two float streams
+ * \brief Conjugate a stream of lv_8sc_t ( std::complex )
* \author Carles Fernandez Prades, cfernandez(at)cttc.es
*
* -------------------------------------------------------------------------
diff --git a/src/algorithms/libs/conjugate_sc.cc b/src/algorithms/libs/conjugate_sc.cc
index ac22d7723..2ea5aeef7 100644
--- a/src/algorithms/libs/conjugate_sc.cc
+++ b/src/algorithms/libs/conjugate_sc.cc
@@ -1,3 +1,33 @@
+/*!
+ * \file conjugate_sc.h
+ * \brief Conjugate a stream of lv_16sc_t ( std::complex )
+ * \author Carles Fernandez Prades, cfernandez(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2017 (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 .
+ *
+ * -------------------------------------------------------------------------
+ */
+
#include "conjugate_sc.h"
#include
#include
diff --git a/src/algorithms/libs/conjugate_sc.h b/src/algorithms/libs/conjugate_sc.h
index b26a66c79..3b424f4cc 100644
--- a/src/algorithms/libs/conjugate_sc.h
+++ b/src/algorithms/libs/conjugate_sc.h
@@ -1,6 +1,6 @@
/*!
* \file conjugate_sc.h
- * \brief Adapts a std::complex stream into two float streams
+ * \brief Conjugate a stream of lv_16sc_t ( std::complex )
* \author Carles Fernandez Prades, cfernandez(at)cttc.es
*
* -------------------------------------------------------------------------
diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h
index 0a8674893..e8831a97f 100644
--- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h
+++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h
@@ -74,7 +74,7 @@
#include
#include
#include
-#include
+//#include
#ifdef LV_HAVE_GENERIC
diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc
index cc9a1687b..d6569fb81 100644
--- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc
@@ -45,6 +45,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -274,7 +275,6 @@ void glonass_l1_ca_dll_pll_c_aid_tracking_cc::start_tracking()
d_carrier_phase_step_rad = GLONASS_TWO_PI * d_carrier_frequency_hz / static_cast(d_fs_in);
-
// DLL/PLL filter initialization
d_carrier_loop_filter.initialize(d_acq_carrier_doppler_hz); // The carrier loop filter implements the Doppler accumulator
d_code_loop_filter.initialize(); // initialize the code filter
@@ -334,7 +334,7 @@ glonass_l1_ca_dll_pll_c_aid_tracking_cc::~glonass_l1_ca_dll_pll_c_aid_tracking_c
{
std::cout << "Writing .mat files ...";
}
- //gps_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile();
+ glonass_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile();
if(d_channel == 0)
{
std::cout << " done." << std::endl;
@@ -356,6 +356,212 @@ glonass_l1_ca_dll_pll_c_aid_tracking_cc::~glonass_l1_ca_dll_pll_c_aid_tracking_c
}
+int glonass_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile()
+{
+ // READ DUMP FILE
+ std::ifstream::pos_type size;
+ int number_of_double_vars = 11;
+ int number_of_float_vars = 5;
+ int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
+ sizeof(float) * number_of_float_vars + sizeof(unsigned int);
+ std::ifstream dump_file;
+ dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
+ try
+ {
+ dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
+ }
+ catch(const std::ifstream::failure &e)
+ {
+ std::cerr << "Problem opening dump file:" << e.what() << std::endl;
+ return 1;
+ }
+ // count number of epochs and rewind
+ long int num_epoch = 0;
+ if (dump_file.is_open())
+ {
+ size = dump_file.tellg();
+ num_epoch = static_cast(size) / static_cast(epoch_size_bytes);
+ dump_file.seekg(0, std::ios::beg);
+ }
+ else
+ {
+ return 1;
+ }
+ float * abs_E = new float [num_epoch];
+ float * abs_P = new float [num_epoch];
+ float * abs_L = new float [num_epoch];
+ float * Prompt_I = new float [num_epoch];
+ float * Prompt_Q = new float [num_epoch];
+ unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
+ double * acc_carrier_phase_rad = new double [num_epoch];
+ double * carrier_doppler_hz = new double [num_epoch];
+ double * code_freq_chips = new double [num_epoch];
+ double * carr_error_hz = new double [num_epoch];
+ double * carr_error_filt_hz = new double [num_epoch];
+ double * code_error_chips = new double [num_epoch];
+ double * code_error_filt_chips = new double [num_epoch];
+ double * CN0_SNV_dB_Hz = new double [num_epoch];
+ double * carrier_lock_test = new double [num_epoch];
+ double * aux1 = new double [num_epoch];
+ double * aux2 = new double [num_epoch];
+ unsigned int * PRN = new unsigned int [num_epoch];
+
+ try
+ {
+ if (dump_file.is_open())
+ {
+ for(long int i = 0; i < num_epoch; i++)
+ {
+ dump_file.read(reinterpret_cast(&abs_E[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&abs_P[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&abs_L[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&Prompt_I[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&Prompt_Q[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&PRN_start_sample_count[i]), sizeof(unsigned long int));
+ dump_file.read(reinterpret_cast(&acc_carrier_phase_rad[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carrier_doppler_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_freq_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carr_error_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carr_error_filt_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_error_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_error_filt_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&CN0_SNV_dB_Hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carrier_lock_test[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&aux1[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&aux2[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&PRN[i]), sizeof(unsigned int));
+ }
+ }
+ dump_file.close();
+ }
+ catch (const std::ifstream::failure &e)
+ {
+ std::cerr << "Problem reading dump file:" << e.what() << std::endl;
+ delete[] abs_E;
+ delete[] abs_P;
+ delete[] abs_L;
+ delete[] Prompt_I;
+ delete[] Prompt_Q;
+ delete[] PRN_start_sample_count;
+ delete[] acc_carrier_phase_rad;
+ delete[] carrier_doppler_hz;
+ delete[] code_freq_chips;
+ delete[] carr_error_hz;
+ delete[] carr_error_filt_hz;
+ delete[] code_error_chips;
+ delete[] code_error_filt_chips;
+ delete[] CN0_SNV_dB_Hz;
+ delete[] carrier_lock_test;
+ delete[] aux1;
+ delete[] aux2;
+ delete[] PRN;
+ return 1;
+ }
+
+ // WRITE MAT FILE
+ mat_t *matfp;
+ matvar_t *matvar;
+ std::string filename = d_dump_filename;
+ filename.erase(filename.length() - 4, 4);
+ filename.append(".mat");
+ matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
+ if(reinterpret_cast(matfp) != NULL)
+ {
+ size_t dims[2] = {1, static_cast(num_epoch)};
+ matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+ }
+ Mat_Close(matfp);
+ delete[] abs_E;
+ delete[] abs_P;
+ delete[] abs_L;
+ delete[] Prompt_I;
+ delete[] Prompt_Q;
+ delete[] PRN_start_sample_count;
+ delete[] acc_carrier_phase_rad;
+ delete[] carrier_doppler_hz;
+ delete[] code_freq_chips;
+ delete[] carr_error_hz;
+ delete[] carr_error_filt_hz;
+ delete[] code_error_chips;
+ delete[] code_error_filt_chips;
+ delete[] CN0_SNV_dB_Hz;
+ delete[] carrier_lock_test;
+ delete[] aux1;
+ delete[] aux2;
+ delete[] PRN;
+ return 0;
+}
+
int glonass_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)),
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.h
index 17d7eabd0..1aa7b72bd 100644
--- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.h
+++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.h
@@ -202,6 +202,8 @@ private:
std::map systemName;
std::string sys;
+
+ int save_matfile();
};
#endif //GNSS_SDR_GLONASS_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H
diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc
index 147a5642c..197e46379 100644
--- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc
@@ -45,6 +45,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -310,9 +311,239 @@ void glonass_l1_ca_dll_pll_c_aid_tracking_sc::start_tracking()
}
+int glonass_l1_ca_dll_pll_c_aid_tracking_sc::save_matfile()
+{
+ // READ DUMP FILE
+ std::ifstream::pos_type size;
+ int number_of_double_vars = 11;
+ int number_of_float_vars = 5;
+ int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
+ sizeof(float) * number_of_float_vars + sizeof(unsigned int);
+ std::ifstream dump_file;
+ dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
+ try
+ {
+ dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
+ }
+ catch(const std::ifstream::failure &e)
+ {
+ std::cerr << "Problem opening dump file:" << e.what() << std::endl;
+ return 1;
+ }
+ // count number of epochs and rewind
+ long int num_epoch = 0;
+ if (dump_file.is_open())
+ {
+ size = dump_file.tellg();
+ num_epoch = static_cast(size) / static_cast(epoch_size_bytes);
+ dump_file.seekg(0, std::ios::beg);
+ }
+ else
+ {
+ return 1;
+ }
+ float * abs_E = new float [num_epoch];
+ float * abs_P = new float [num_epoch];
+ float * abs_L = new float [num_epoch];
+ float * Prompt_I = new float [num_epoch];
+ float * Prompt_Q = new float [num_epoch];
+ unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
+ double * acc_carrier_phase_rad = new double [num_epoch];
+ double * carrier_doppler_hz = new double [num_epoch];
+ double * code_freq_chips = new double [num_epoch];
+ double * carr_error_hz = new double [num_epoch];
+ double * carr_error_filt_hz = new double [num_epoch];
+ double * code_error_chips = new double [num_epoch];
+ double * code_error_filt_chips = new double [num_epoch];
+ double * CN0_SNV_dB_Hz = new double [num_epoch];
+ double * carrier_lock_test = new double [num_epoch];
+ double * aux1 = new double [num_epoch];
+ double * aux2 = new double [num_epoch];
+ unsigned int * PRN = new unsigned int [num_epoch];
+
+ try
+ {
+ if (dump_file.is_open())
+ {
+ for(long int i = 0; i < num_epoch; i++)
+ {
+ dump_file.read(reinterpret_cast(&abs_E[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&abs_P[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&abs_L[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&Prompt_I[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&Prompt_Q[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&PRN_start_sample_count[i]), sizeof(unsigned long int));
+ dump_file.read(reinterpret_cast(&acc_carrier_phase_rad[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carrier_doppler_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_freq_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carr_error_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carr_error_filt_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_error_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_error_filt_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&CN0_SNV_dB_Hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carrier_lock_test[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&aux1[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&aux2[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&PRN[i]), sizeof(unsigned int));
+ }
+ }
+ dump_file.close();
+ }
+ catch (const std::ifstream::failure &e)
+ {
+ std::cerr << "Problem reading dump file:" << e.what() << std::endl;
+ delete[] abs_E;
+ delete[] abs_P;
+ delete[] abs_L;
+ delete[] Prompt_I;
+ delete[] Prompt_Q;
+ delete[] PRN_start_sample_count;
+ delete[] acc_carrier_phase_rad;
+ delete[] carrier_doppler_hz;
+ delete[] code_freq_chips;
+ delete[] carr_error_hz;
+ delete[] carr_error_filt_hz;
+ delete[] code_error_chips;
+ delete[] code_error_filt_chips;
+ delete[] CN0_SNV_dB_Hz;
+ delete[] carrier_lock_test;
+ delete[] aux1;
+ delete[] aux2;
+ delete[] PRN;
+ return 1;
+ }
+
+ // WRITE MAT FILE
+ mat_t *matfp;
+ matvar_t *matvar;
+ std::string filename = d_dump_filename;
+ filename.erase(filename.length() - 4, 4);
+ filename.append(".mat");
+ matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
+ if(reinterpret_cast(matfp) != NULL)
+ {
+ size_t dims[2] = {1, static_cast(num_epoch)};
+ matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+ }
+ Mat_Close(matfp);
+ delete[] abs_E;
+ delete[] abs_P;
+ delete[] abs_L;
+ delete[] Prompt_I;
+ delete[] Prompt_Q;
+ delete[] PRN_start_sample_count;
+ delete[] acc_carrier_phase_rad;
+ delete[] carrier_doppler_hz;
+ delete[] code_freq_chips;
+ delete[] carr_error_hz;
+ delete[] carr_error_filt_hz;
+ delete[] code_error_chips;
+ delete[] code_error_filt_chips;
+ delete[] CN0_SNV_dB_Hz;
+ delete[] carrier_lock_test;
+ delete[] aux1;
+ delete[] aux2;
+ delete[] PRN;
+ return 0;
+}
+
+
glonass_l1_ca_dll_pll_c_aid_tracking_sc::~glonass_l1_ca_dll_pll_c_aid_tracking_sc()
{
- d_dump_file.close();
+ if (d_dump_file.is_open())
+ {
+ try
+ {
+ d_dump_file.close();
+ }
+ catch(const std::exception & ex)
+ {
+ LOG(WARNING) << "Exception in destructor " << ex.what();
+ }
+ }
+
+ if(d_dump)
+ {
+ if(d_channel == 0)
+ {
+ std::cout << "Writing .mat files ...";
+ }
+ glonass_l1_ca_dll_pll_c_aid_tracking_sc::save_matfile();
+ if(d_channel == 0)
+ {
+ std::cout << " done." << std::endl;
+ }
+ }
volk_gnsssdr_free(d_local_code_shift_chips);
volk_gnsssdr_free(d_ca_code);
diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.h
index 0e008e04c..6f83bac0d 100644
--- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.h
+++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.h
@@ -204,6 +204,8 @@ private:
std::map systemName;
std::string sys;
+
+ int save_matfile();
};
#endif //GNSS_SDR_GLONASS_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H
diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc
index f1532ac25..89c6b5cfe 100644
--- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc
@@ -45,6 +45,7 @@
#include
#include
#include
+#include
#include
#include "glonass_l1_signal_processing.h"
#include "tracking_discriminators.h"
@@ -286,6 +287,18 @@ Glonass_L1_Ca_Dll_Pll_Tracking_cc::~Glonass_L1_Ca_Dll_Pll_Tracking_cc()
LOG(WARNING) << "Exception in destructor " << ex.what();
}
}
+ if(d_dump)
+ {
+ if(d_channel == 0)
+ {
+ std::cout << "Writing .mat files ...";
+ }
+ Glonass_L1_Ca_Dll_Pll_Tracking_cc::save_matfile();
+ if(d_channel == 0)
+ {
+ std::cout << " done." << std::endl;
+ }
+ }
try
{
volk_gnsssdr_free(d_local_code_shift_chips);
@@ -301,6 +314,212 @@ Glonass_L1_Ca_Dll_Pll_Tracking_cc::~Glonass_L1_Ca_Dll_Pll_Tracking_cc()
}
+int Glonass_L1_Ca_Dll_Pll_Tracking_cc::save_matfile()
+{
+ // READ DUMP FILE
+ std::ifstream::pos_type size;
+ int number_of_double_vars = 11;
+ int number_of_float_vars = 5;
+ int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
+ sizeof(float) * number_of_float_vars + sizeof(unsigned int);
+ std::ifstream dump_file;
+ dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
+ try
+ {
+ dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
+ }
+ catch(const std::ifstream::failure &e)
+ {
+ std::cerr << "Problem opening dump file:" << e.what() << std::endl;
+ return 1;
+ }
+ // count number of epochs and rewind
+ long int num_epoch = 0;
+ if (dump_file.is_open())
+ {
+ size = dump_file.tellg();
+ num_epoch = static_cast(size) / static_cast(epoch_size_bytes);
+ dump_file.seekg(0, std::ios::beg);
+ }
+ else
+ {
+ return 1;
+ }
+ float * abs_E = new float [num_epoch];
+ float * abs_P = new float [num_epoch];
+ float * abs_L = new float [num_epoch];
+ float * Prompt_I = new float [num_epoch];
+ float * Prompt_Q = new float [num_epoch];
+ unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
+ double * acc_carrier_phase_rad = new double [num_epoch];
+ double * carrier_doppler_hz = new double [num_epoch];
+ double * code_freq_chips = new double [num_epoch];
+ double * carr_error_hz = new double [num_epoch];
+ double * carr_error_filt_hz = new double [num_epoch];
+ double * code_error_chips = new double [num_epoch];
+ double * code_error_filt_chips = new double [num_epoch];
+ double * CN0_SNV_dB_Hz = new double [num_epoch];
+ double * carrier_lock_test = new double [num_epoch];
+ double * aux1 = new double [num_epoch];
+ double * aux2 = new double [num_epoch];
+ unsigned int * PRN = new unsigned int [num_epoch];
+
+ try
+ {
+ if (dump_file.is_open())
+ {
+ for(long int i = 0; i < num_epoch; i++)
+ {
+ dump_file.read(reinterpret_cast(&abs_E[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&abs_P[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&abs_L[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&Prompt_I[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&Prompt_Q[i]), sizeof(float));
+ dump_file.read(reinterpret_cast(&PRN_start_sample_count[i]), sizeof(unsigned long int));
+ dump_file.read(reinterpret_cast(&acc_carrier_phase_rad[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carrier_doppler_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_freq_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carr_error_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carr_error_filt_hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_error_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&code_error_filt_chips[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&CN0_SNV_dB_Hz[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&carrier_lock_test[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&aux1[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&aux2[i]), sizeof(double));
+ dump_file.read(reinterpret_cast(&PRN[i]), sizeof(unsigned int));
+ }
+ }
+ dump_file.close();
+ }
+ catch (const std::ifstream::failure &e)
+ {
+ std::cerr << "Problem reading dump file:" << e.what() << std::endl;
+ delete[] abs_E;
+ delete[] abs_P;
+ delete[] abs_L;
+ delete[] Prompt_I;
+ delete[] Prompt_Q;
+ delete[] PRN_start_sample_count;
+ delete[] acc_carrier_phase_rad;
+ delete[] carrier_doppler_hz;
+ delete[] code_freq_chips;
+ delete[] carr_error_hz;
+ delete[] carr_error_filt_hz;
+ delete[] code_error_chips;
+ delete[] code_error_filt_chips;
+ delete[] CN0_SNV_dB_Hz;
+ delete[] carrier_lock_test;
+ delete[] aux1;
+ delete[] aux2;
+ delete[] PRN;
+ return 1;
+ }
+
+ // WRITE MAT FILE
+ mat_t *matfp;
+ matvar_t *matvar;
+ std::string filename = d_dump_filename;
+ filename.erase(filename.length() - 4, 4);
+ filename.append(".mat");
+ matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
+ if(reinterpret_cast(matfp) != NULL)
+ {
+ size_t dims[2] = {1, static_cast(num_epoch)};
+ matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+
+ matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
+ Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
+ Mat_VarFree(matvar);
+ }
+ Mat_Close(matfp);
+ delete[] abs_E;
+ delete[] abs_P;
+ delete[] abs_L;
+ delete[] Prompt_I;
+ delete[] Prompt_Q;
+ delete[] PRN_start_sample_count;
+ delete[] acc_carrier_phase_rad;
+ delete[] carrier_doppler_hz;
+ delete[] code_freq_chips;
+ delete[] carr_error_hz;
+ delete[] carr_error_filt_hz;
+ delete[] code_error_chips;
+ delete[] code_error_filt_chips;
+ delete[] CN0_SNV_dB_Hz;
+ delete[] carrier_lock_test;
+ delete[] aux1;
+ delete[] aux2;
+ delete[] PRN;
+ return 0;
+}
+
int Glonass_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)),
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.h
index cf1923fb6..4e080fae2 100644
--- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.h
+++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.h
@@ -170,6 +170,8 @@ private:
std::map systemName;
std::string sys;
+
+ int save_matfile();
};
#endif //GNSS_SDR_GLONASS_L1_CA_DLL_PLL_TRACKING_CC_H