mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 07:13:03 +00:00 
			
		
		
		
	Use matio library in tracking blocks
This commit is contained in:
		| @@ -51,6 +51,7 @@ include_directories( | |||||||
|      ${GNURADIO_RUNTIME_INCLUDE_DIRS} |      ${GNURADIO_RUNTIME_INCLUDE_DIRS} | ||||||
|      ${VOLK_GNSSSDR_INCLUDE_DIRS} |      ${VOLK_GNSSSDR_INCLUDE_DIRS} | ||||||
|      ${OPT_TRACKING_INCLUDES} |      ${OPT_TRACKING_INCLUDES} | ||||||
|  |      ${MATIO_INCLUDE_DIRS} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| if(ENABLE_GENERIC_ARCH) | if(ENABLE_GENERIC_ARCH) | ||||||
| @@ -62,7 +63,7 @@ list(SORT TRACKING_GR_BLOCKS_HEADERS) | |||||||
| add_library(tracking_gr_blocks ${TRACKING_GR_BLOCKS_SOURCES} ${TRACKING_GR_BLOCKS_HEADERS}) | add_library(tracking_gr_blocks ${TRACKING_GR_BLOCKS_SOURCES} ${TRACKING_GR_BLOCKS_HEADERS}) | ||||||
| source_group(Headers FILES ${TRACKING_GR_BLOCKS_HEADERS}) | source_group(Headers FILES ${TRACKING_GR_BLOCKS_HEADERS}) | ||||||
|  |  | ||||||
| target_link_libraries(tracking_gr_blocks tracking_lib ${GNURADIO_RUNTIME_LIBRARIES} gnss_sp_libs ${Boost_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${OPT_TRACKING_LIBRARIES}) | target_link_libraries(tracking_gr_blocks tracking_lib ${GNURADIO_RUNTIME_LIBRARIES} gnss_sp_libs ${Boost_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${MATIO_LIBRARIES} ${OPT_TRACKING_LIBRARIES}) | ||||||
|  |  | ||||||
| if(NOT VOLK_GNSSSDR_FOUND) | if(NOT VOLK_GNSSSDR_FOUND) | ||||||
|     add_dependencies(tracking_gr_blocks volk_gnsssdr_module) |     add_dependencies(tracking_gr_blocks volk_gnsssdr_module) | ||||||
|   | |||||||
| @@ -42,6 +42,7 @@ | |||||||
| #include <boost/lexical_cast.hpp> | #include <boost/lexical_cast.hpp> | ||||||
| #include <gnuradio/io_signature.h> | #include <gnuradio/io_signature.h> | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
|  | #include <matio.h> | ||||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | #include <volk_gnsssdr/volk_gnsssdr.h> | ||||||
| #include "galileo_e1_signal_processing.h" | #include "galileo_e1_signal_processing.h" | ||||||
| #include "tracking_discriminators.h" | #include "tracking_discriminators.h" | ||||||
| @@ -262,6 +263,18 @@ galileo_e1_dll_pll_veml_tracking_cc::~galileo_e1_dll_pll_veml_tracking_cc() | |||||||
|                     LOG(WARNING) << "Exception in destructor " << ex.what(); |                     LOG(WARNING) << "Exception in destructor " << ex.what(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     if(d_dump) | ||||||
|  |         { | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "Writing .mat files ..."; | ||||||
|  |                 } | ||||||
|  |             galileo_e1_dll_pll_veml_tracking_cc::save_matfile(); | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << " done." << std::endl; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|     try |     try | ||||||
|     { |     { | ||||||
|             volk_gnsssdr_free(d_local_code_shift_chips); |             volk_gnsssdr_free(d_local_code_shift_chips); | ||||||
| @@ -509,6 +522,224 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items __attri | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int galileo_e1_dll_pll_veml_tracking_cc::save_matfile() | ||||||
|  | { | ||||||
|  |     // READ DUMP FILE | ||||||
|  |     std::ifstream::pos_type size; | ||||||
|  |     int number_of_double_vars = 1; | ||||||
|  |     int number_of_float_vars = 17; | ||||||
|  |     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<long int>(size) / static_cast<long int>(epoch_size_bytes); | ||||||
|  |             dump_file.seekg(0, std::ios::beg); | ||||||
|  |         } | ||||||
|  |     else | ||||||
|  |         { | ||||||
|  |             return 1; | ||||||
|  |         } | ||||||
|  |     float * abs_VE = new float [num_epoch]; | ||||||
|  |     float * abs_E = new float [num_epoch]; | ||||||
|  |     float * abs_P = new float [num_epoch]; | ||||||
|  |     float * abs_L = new float [num_epoch]; | ||||||
|  |     float * abs_VL = 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]; | ||||||
|  |     float * acc_carrier_phase_rad = new float [num_epoch]; | ||||||
|  |     float * carrier_doppler_hz = new float [num_epoch]; | ||||||
|  |     float * code_freq_chips = new float [num_epoch]; | ||||||
|  |     float * carr_error_hz = new float [num_epoch]; | ||||||
|  |     float * carr_error_filt_hz = new float [num_epoch]; | ||||||
|  |     float * code_error_chips = new float [num_epoch]; | ||||||
|  |     float * code_error_filt_chips = new float [num_epoch]; | ||||||
|  |     float * CN0_SNV_dB_Hz = new float [num_epoch]; | ||||||
|  |     float * carrier_lock_test = new float [num_epoch]; | ||||||
|  |     float * aux1 = new float [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<char *>(&abs_VE[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_E[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_VL[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&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<long*>(matfp) != NULL) | ||||||
|  |         { | ||||||
|  |             size_t dims[2] = {1, static_cast<size_t>(num_epoch)}; | ||||||
|  |             matvar = Mat_VarCreate("abs_VE", 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_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("abs_VL", 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("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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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_SINGLE, MAT_T_SINGLE, 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; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void galileo_e1_dll_pll_veml_tracking_cc::set_channel(unsigned int channel) | void galileo_e1_dll_pll_veml_tracking_cc::set_channel(unsigned int channel) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -174,6 +174,8 @@ private: | |||||||
|  |  | ||||||
|     std::map<std::string, std::string> systemName; |     std::map<std::string, std::string> systemName; | ||||||
|     std::string sys; |     std::string sys; | ||||||
|  |  | ||||||
|  |     int save_matfile(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif //GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_CC_H | #endif //GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_CC_H | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ | |||||||
| #include <boost/lexical_cast.hpp> | #include <boost/lexical_cast.hpp> | ||||||
| #include <gnuradio/io_signature.h> | #include <gnuradio/io_signature.h> | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
|  | #include <matio.h> | ||||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | #include <volk_gnsssdr/volk_gnsssdr.h> | ||||||
| #include "galileo_e5_signal_processing.h" | #include "galileo_e5_signal_processing.h" | ||||||
| #include "tracking_discriminators.h" | #include "tracking_discriminators.h" | ||||||
| @@ -224,6 +225,20 @@ Galileo_E5a_Dll_Pll_Tracking_cc::~Galileo_E5a_Dll_Pll_Tracking_cc() | |||||||
|                     LOG(WARNING)<<"Exception in destructor "<<ex.what(); |                     LOG(WARNING)<<"Exception in destructor "<<ex.what(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |     if(d_dump) | ||||||
|  |         { | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "Writing .mat files ..."; | ||||||
|  |                 } | ||||||
|  |             Galileo_E5a_Dll_Pll_Tracking_cc::save_matfile(); | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << " done." << std::endl; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |  | ||||||
|     try |     try | ||||||
|     { |     { | ||||||
|             delete[] d_codeI; |             delete[] d_codeI; | ||||||
| @@ -748,6 +763,213 @@ void Galileo_E5a_Dll_Pll_Tracking_cc::set_channel(unsigned int channel) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int Galileo_E5a_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<long int>(size) / static_cast<long int>(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<char *>(&abs_E[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&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<long*>(matfp) != NULL) | ||||||
|  |         { | ||||||
|  |             size_t dims[2] = {1, static_cast<size_t>(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; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void Galileo_E5a_Dll_Pll_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) | void Galileo_E5a_Dll_Pll_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) | ||||||
| { | { | ||||||
|     d_acquisition_gnss_synchro = p_gnss_synchro; |     d_acquisition_gnss_synchro = p_gnss_synchro; | ||||||
|   | |||||||
| @@ -204,6 +204,8 @@ private: | |||||||
|  |  | ||||||
|     std::map<std::string, std::string> systemName; |     std::map<std::string, std::string> systemName; | ||||||
|     std::string sys; |     std::string sys; | ||||||
|  |  | ||||||
|  |     int save_matfile(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_CC_H_ */ | #endif /* GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_CC_H_ */ | ||||||
|   | |||||||
| @@ -36,6 +36,7 @@ | |||||||
| #include <boost/lexical_cast.hpp> | #include <boost/lexical_cast.hpp> | ||||||
| #include <boost/bind.hpp> | #include <boost/bind.hpp> | ||||||
| #include <gnuradio/io_signature.h> | #include <gnuradio/io_signature.h> | ||||||
|  | #include <matio.h> | ||||||
| #include <pmt/pmt.h> | #include <pmt/pmt.h> | ||||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | #include <volk_gnsssdr/volk_gnsssdr.h> | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
| @@ -299,7 +300,6 @@ void gps_l1_ca_dll_pll_c_aid_tracking_cc::start_tracking() | |||||||
|  |  | ||||||
| gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc() | gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc() | ||||||
| { | { | ||||||
|  |  | ||||||
|     if (d_dump_file.is_open()) |     if (d_dump_file.is_open()) | ||||||
|         { |         { | ||||||
|             try |             try | ||||||
| @@ -311,6 +311,20 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc() | |||||||
|                     LOG(WARNING) << "Exception in destructor " << ex.what(); |                     LOG(WARNING) << "Exception in destructor " << ex.what(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |     if(d_dump) | ||||||
|  |         { | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "Writing .mat files ..."; | ||||||
|  |                 } | ||||||
|  |             gps_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile(); | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << " done." << std::endl; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |  | ||||||
|     try |     try | ||||||
|     { |     { | ||||||
|             volk_gnsssdr_free(d_local_code_shift_chips); |             volk_gnsssdr_free(d_local_code_shift_chips); | ||||||
| @@ -326,6 +340,212 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int gps_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<long int>(size) / static_cast<long int>(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<char *>(&abs_E[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&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<long*>(matfp) != NULL) | ||||||
|  |         { | ||||||
|  |             size_t dims[2] = {1, static_cast<size_t>(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 gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)), | int gps_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) |         gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) | ||||||
|   | |||||||
| @@ -196,6 +196,8 @@ private: | |||||||
|  |  | ||||||
|     std::map<std::string, std::string> systemName; |     std::map<std::string, std::string> systemName; | ||||||
|     std::string sys; |     std::string sys; | ||||||
|  |  | ||||||
|  |     int save_matfile(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H | #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ | |||||||
| #include <boost/bind.hpp> | #include <boost/bind.hpp> | ||||||
| #include <boost/lexical_cast.hpp> | #include <boost/lexical_cast.hpp> | ||||||
| #include <gnuradio/io_signature.h> | #include <gnuradio/io_signature.h> | ||||||
|  | #include <matio.h> | ||||||
| #include <pmt/pmt.h> | #include <pmt/pmt.h> | ||||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | #include <volk_gnsssdr/volk_gnsssdr.h> | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
| @@ -309,6 +310,20 @@ gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::~gps_l1_ca_dll_pll_c_aid_tracking_fpga | |||||||
|                     LOG(WARNING)<< "Exception in destructor " << ex.what(); |                     LOG(WARNING)<< "Exception in destructor " << ex.what(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |     if(d_dump) | ||||||
|  |         { | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "Writing .mat files ..."; | ||||||
|  |                 } | ||||||
|  |             gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::save_matfile(); | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << " done." << std::endl; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |  | ||||||
|     try |     try | ||||||
|     { |     { | ||||||
|             volk_gnsssdr_free(d_local_code_shift_chips); |             volk_gnsssdr_free(d_local_code_shift_chips); | ||||||
| @@ -665,6 +680,10 @@ int gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::general_work( | |||||||
|                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||||
|                     tmp_double = static_cast<double>(d_sample_counter + d_correlation_length_samples); |                     tmp_double = static_cast<double>(d_sample_counter + d_correlation_length_samples); | ||||||
|                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||||
|  |  | ||||||
|  |                     // PRN | ||||||
|  |                     unsigned int prn_ = d_acquisition_gnss_synchro->PRN; | ||||||
|  |                     d_dump_file.write(reinterpret_cast<char*>(&prn_), sizeof(unsigned int)); | ||||||
|                 } |                 } | ||||||
|             catch (const std::ifstream::failure* e) |             catch (const std::ifstream::failure* e) | ||||||
|                 { |                 { | ||||||
| @@ -710,6 +729,212 @@ void gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::set_channel(unsigned int channel) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int gps_l1_ca_dll_pll_c_aid_tracking_fpga_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<long int>(size) / static_cast<long int>(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<char *>(&abs_E[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&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<long*>(matfp) != NULL) | ||||||
|  |         { | ||||||
|  |             size_t dims[2] = {1, static_cast<size_t>(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; | ||||||
|  | } | ||||||
|  |  | ||||||
| void gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::set_gnss_synchro( | void gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::set_gnss_synchro( | ||||||
|         Gnss_Synchro* p_gnss_synchro) |         Gnss_Synchro* p_gnss_synchro) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -178,6 +178,8 @@ private: | |||||||
|  |  | ||||||
|     std::map<std::string, std::string> systemName; |     std::map<std::string, std::string> systemName; | ||||||
|     std::string sys; |     std::string sys; | ||||||
|  |  | ||||||
|  |     int save_matfile(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_FPGA_SC_H | #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_FPGA_SC_H | ||||||
|   | |||||||
| @@ -39,6 +39,7 @@ | |||||||
| #include <pmt/pmt.h> | #include <pmt/pmt.h> | ||||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | #include <volk_gnsssdr/volk_gnsssdr.h> | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
|  | #include <matio.h> | ||||||
| #include "gnss_synchro.h" | #include "gnss_synchro.h" | ||||||
| #include "gps_sdr_signal_processing.h" | #include "gps_sdr_signal_processing.h" | ||||||
| #include "tracking_discriminators.h" | #include "tracking_discriminators.h" | ||||||
| @@ -313,6 +314,20 @@ gps_l1_ca_dll_pll_c_aid_tracking_sc::~gps_l1_ca_dll_pll_c_aid_tracking_sc() | |||||||
|                     LOG(WARNING) << "Exception in destructor " << ex.what(); |                     LOG(WARNING) << "Exception in destructor " << ex.what(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |     if(d_dump) | ||||||
|  |         { | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "Writing .mat files ..."; | ||||||
|  |                 } | ||||||
|  |             gps_l1_ca_dll_pll_c_aid_tracking_sc::save_matfile(); | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << " done." << std::endl; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |  | ||||||
|     try |     try | ||||||
|     { |     { | ||||||
|             volk_gnsssdr_free(d_local_code_shift_chips); |             volk_gnsssdr_free(d_local_code_shift_chips); | ||||||
| @@ -330,6 +345,212 @@ gps_l1_ca_dll_pll_c_aid_tracking_sc::~gps_l1_ca_dll_pll_c_aid_tracking_sc() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int gps_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<long int>(size) / static_cast<long int>(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<char *>(&abs_E[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&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<long*>(matfp) != NULL) | ||||||
|  |         { | ||||||
|  |             size_t dims[2] = {1, static_cast<size_t>(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 gps_l1_ca_dll_pll_c_aid_tracking_sc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)), | int gps_l1_ca_dll_pll_c_aid_tracking_sc::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) |         gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) | ||||||
|   | |||||||
| @@ -200,6 +200,8 @@ private: | |||||||
|  |  | ||||||
|     std::map<std::string, std::string> systemName; |     std::map<std::string, std::string> systemName; | ||||||
|     std::string sys; |     std::string sys; | ||||||
|  |  | ||||||
|  |     int save_matfile(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H | #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H | ||||||
|   | |||||||
| @@ -43,6 +43,7 @@ | |||||||
| #include <gnuradio/io_signature.h> | #include <gnuradio/io_signature.h> | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | #include <volk_gnsssdr/volk_gnsssdr.h> | ||||||
|  | #include <matio.h> | ||||||
| #include "gps_sdr_signal_processing.h" | #include "gps_sdr_signal_processing.h" | ||||||
| #include "tracking_discriminators.h" | #include "tracking_discriminators.h" | ||||||
| #include "lock_detectors.h" | #include "lock_detectors.h" | ||||||
| @@ -266,6 +267,213 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int Gps_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<long int>(size) / static_cast<long int>(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<char *>(&abs_E[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&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<long*>(matfp) != NULL) | ||||||
|  |         { | ||||||
|  |             size_t dims[2] = {1, static_cast<size_t>(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; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc() | Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc() | ||||||
| { | { | ||||||
|     if (d_dump_file.is_open()) |     if (d_dump_file.is_open()) | ||||||
| @@ -279,6 +487,20 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc() | |||||||
|                     LOG(WARNING) << "Exception in destructor " << ex.what(); |                     LOG(WARNING) << "Exception in destructor " << ex.what(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |     if(d_dump) | ||||||
|  |         { | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "Writing .mat files ..."; | ||||||
|  |                 } | ||||||
|  |             Gps_L1_Ca_Dll_Pll_Tracking_cc::save_matfile(); | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << " done." << std::endl; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |  | ||||||
|     try |     try | ||||||
|     { |     { | ||||||
|             volk_gnsssdr_free(d_local_code_shift_chips); |             volk_gnsssdr_free(d_local_code_shift_chips); | ||||||
| @@ -291,6 +513,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc() | |||||||
|     { |     { | ||||||
|             LOG(WARNING) << "Exception in destructor " << ex.what(); |             LOG(WARNING) << "Exception in destructor " << ex.what(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -443,7 +666,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items __attribute__ | |||||||
|                     d_correlator_outs[n] = gr_complex(0,0); |                     d_correlator_outs[n] = gr_complex(0,0); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             current_synchro_data.Tracking_sample_counter =d_sample_counter + d_current_prn_length_samples; |             current_synchro_data.Tracking_sample_counter = d_sample_counter + d_current_prn_length_samples; | ||||||
|             current_synchro_data.System = {'G'}; |             current_synchro_data.System = {'G'}; | ||||||
|             current_synchro_data.correlation_length_ms = 1; |             current_synchro_data.correlation_length_ms = 1; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -101,6 +101,7 @@ private: | |||||||
|             float dll_bw_hz, |             float dll_bw_hz, | ||||||
|             float early_late_space_chips); |             float early_late_space_chips); | ||||||
|  |  | ||||||
|  |     int save_matfile(); | ||||||
|     // tracking configuration vars |     // tracking configuration vars | ||||||
|     unsigned int d_vector_length; |     unsigned int d_vector_length; | ||||||
|     bool d_dump; |     bool d_dump; | ||||||
|   | |||||||
| @@ -42,6 +42,7 @@ | |||||||
| #include <boost/lexical_cast.hpp> | #include <boost/lexical_cast.hpp> | ||||||
| #include <gnuradio/io_signature.h> | #include <gnuradio/io_signature.h> | ||||||
| #include <glog/logging.h> | #include <glog/logging.h> | ||||||
|  | #include <matio.h> | ||||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | #include <volk_gnsssdr/volk_gnsssdr.h> | ||||||
| #include "gps_l2c_signal.h" | #include "gps_l2c_signal.h" | ||||||
| #include "tracking_discriminators.h" | #include "tracking_discriminators.h" | ||||||
| @@ -269,6 +270,213 @@ void gps_l2_m_dll_pll_tracking_cc::start_tracking() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int gps_l2_m_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<long int>(size) / static_cast<long int>(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<char *>(&abs_E[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double)); | ||||||
|  |                             dump_file.read(reinterpret_cast<char *>(&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<long*>(matfp) != NULL) | ||||||
|  |         { | ||||||
|  |             size_t dims[2] = {1, static_cast<size_t>(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; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc() | gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc() | ||||||
| { | { | ||||||
|     if (d_dump_file.is_open()) |     if (d_dump_file.is_open()) | ||||||
| @@ -282,6 +490,18 @@ gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc() | |||||||
|                     LOG(WARNING) << "Exception in destructor " << ex.what(); |                     LOG(WARNING) << "Exception in destructor " << ex.what(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     if(d_dump) | ||||||
|  |         { | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << "Writing .mat files ..."; | ||||||
|  |                 } | ||||||
|  |             gps_l2_m_dll_pll_tracking_cc::save_matfile(); | ||||||
|  |             if(d_channel == 0) | ||||||
|  |                 { | ||||||
|  |                     std::cout << " done." << std::endl; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|     try |     try | ||||||
|     { |     { | ||||||
|             volk_gnsssdr_free(d_local_code_shift_chips); |             volk_gnsssdr_free(d_local_code_shift_chips); | ||||||
|   | |||||||
| @@ -162,6 +162,8 @@ private: | |||||||
|  |  | ||||||
|     std::map<std::string, std::string> systemName; |     std::map<std::string, std::string> systemName; | ||||||
|     std::string sys; |     std::string sys; | ||||||
|  |  | ||||||
|  |     int save_matfile(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif //GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H | #endif //GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Carles Fernandez
					Carles Fernandez