mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 15:23:04 +00:00 
			
		
		
		
	Merge branch 'next' of https://github.com/gnss-sdr/gnss-sdr into next
This commit is contained in:
		| @@ -326,6 +326,7 @@ set(GNSSSDR_ARMADILLO_LOCAL_VERSION "unstable") | ||||
| set(GNSSSDR_GTEST_LOCAL_VERSION "1.8.0") | ||||
| set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") | ||||
| set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10") | ||||
| set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.11") | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -1442,6 +1443,74 @@ endif(ENABLE_GPROF) | ||||
|  | ||||
|  | ||||
|  | ||||
| ######################################################################## | ||||
| # Matio (OPTIONAL) - https://github.com/tbeu/matio | ||||
| ######################################################################## | ||||
| find_package(MATIO) | ||||
| if(NOT MATIO_FOUND) | ||||
|     find_package(ZLIB) | ||||
|     if(ZLIB_FOUND) | ||||
|         get_filename_component(ZLIB_BASE_DIR ${ZLIB_INCLUDE_DIRS} DIRECTORY) | ||||
|         find_package(HDF5) | ||||
|         if(HDF5_FOUND) | ||||
|             list(GET HDF5_LIBRARIES 0 HDF5_FIRST_DIR) | ||||
|             get_filename_component(HDF5_BASE_DIR2 ${HDF5_FIRST_DIR} DIRECTORY) | ||||
|             get_filename_component(HDF5_BASE_DIR ${HDF5_BASE_DIR2} DIRECTORY) | ||||
|             if(OS_IS_MACOSX) | ||||
|                 if(EXISTS /opt/local/include/hdf5.h) | ||||
|                     set(HDF5_BASE_DIR /opt/local) | ||||
|                 endif(EXISTS /opt/local/include/hdf5.h) | ||||
|                 if(EXISTS /usr/local/include/hdf5.h) | ||||
|                     set(HDF5_BASE_DIR /usr/local) | ||||
|                 endif(EXISTS /usr/local/include/hdf5.h) | ||||
|             endif(OS_IS_MACOSX) | ||||
|             if(CMAKE_VERSION VERSION_LESS 3.2) | ||||
|               ExternalProject_Add( | ||||
|                  matio-${GNSSSDR_MATIO_LOCAL_VERSION} | ||||
|                  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/mati | ||||
|                  GIT_REPOSITORY https://github.com/tbeu/matio | ||||
|                  GIT_TAG v${GNSSSDR_MATIO_LOCAL_VERSION} | ||||
|                  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION} | ||||
|                  UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/autogen.sh | ||||
|                  CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/configure --with-hdf5=${HDF5_BASE_DIR} --with-zlib=${ZLIB_BASE_DIR} --with-default-file-ver=7.3 --enable-mat73=yes --prefix=<INSTALL_DIR> | ||||
|                  BUILD_COMMAND "${CMAKE_MAKE_PROGRAM}" | ||||
|               ) | ||||
|             else(CMAKE_VERSION VERSION_LESS 3.2) | ||||
|               ExternalProject_Add( | ||||
|                  matio-${GNSSSDR_MATIO_LOCAL_VERSION} | ||||
|                  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/matio | ||||
|                  GIT_REPOSITORY https://github.com/tbeu/matio | ||||
|                  GIT_TAG v${GNSSSDR_MATIO_LOCAL_VERSION} | ||||
|                  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION} | ||||
|                  UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/autogen.sh | ||||
|                  CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/matio/matio-${GNSSSDR_MATIO_LOCAL_VERSION}/configure --with-hdf5=${HDF5_BASE_DIR} --with-zlib=${ZLIB_BASE_DIR} --with-default-file-ver=7.3 --enable-mat73=yes --prefix=<INSTALL_DIR> | ||||
|                  BUILD_COMMAND "${CMAKE_MAKE_PROGRAM}" | ||||
|                  BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/matio/lib/${CMAKE_FIND_LIBRARY_PREFIXES}matio${CMAKE_STATIC_LIBRARY_SUFFIX} | ||||
|               ) | ||||
|             endif(CMAKE_VERSION VERSION_LESS 3.2) | ||||
|             set(MATIO_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/matio/lib/${CMAKE_FIND_LIBRARY_PREFIXES}matio${CMAKE_STATIC_LIBRARY_SUFFIX} ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES} ) | ||||
|             set(MATIO_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/matio/include ) | ||||
|             set(MATIO_LOCAL true) | ||||
|         else(HDF5_FOUND) | ||||
|             message(STATUS " The hdf5 library has not been found in your system.") | ||||
|             message(STATUS " Please try to install it by doing:") | ||||
|             if(OS_IS_MACOSX) | ||||
|                 message(STATUS "  $ sudo port install hdf5") | ||||
|                 message(STATUS " or") | ||||
|                 message(STATUS "  $ brew install hdf5") | ||||
|             endif(OS_IS_MACOSX) | ||||
|             if(OS_IS_LINUX) | ||||
|                 message(STATUS "  $ sudo apt-get install libhdf5-dev") | ||||
|             endif(OS_IS_LINUX) | ||||
|             message(FATAL_ERROR "*** The hdf5 library is required to build gnss-sdr") | ||||
|         endif(HDF5_FOUND) | ||||
|     else(ZLIB_FOUND) | ||||
|         message(FATAL_ERROR "*** The zlib library is required to build gnss-sdr") | ||||
|     endif(ZLIB_FOUND) | ||||
| endif(NOT MATIO_FOUND) | ||||
|  | ||||
|  | ||||
|  | ||||
| ######################################################################## | ||||
| # Set compiler flags | ||||
| ######################################################################## | ||||
|   | ||||
| @@ -47,7 +47,7 @@ $ sudo apt-get install build-essential cmake git libboost-dev libboost-date-time | ||||
|        libboost-serialization-dev libboost-program-options-dev libboost-test-dev \ | ||||
|        liblog4cpp5-dev libuhd-dev gnuradio-dev gr-osmosdr libblas-dev liblapack-dev \ | ||||
|        libarmadillo-dev libgflags-dev libgoogle-glog-dev libgnutls-openssl-dev libgtest-dev \ | ||||
|        python-mako python-six | ||||
|        python-mako python-six libmatio-dev | ||||
| ~~~~~~ | ||||
|  | ||||
| Alternatively, and starting from Ubuntu 16.04 LTS, you can install all the required dependencies by adding the line | ||||
| @@ -495,6 +495,7 @@ $ sudo port install gnutls | ||||
| $ sudo port install google-glog +gflags | ||||
| $ sudo port install py27-mako | ||||
| $ sudo port install py27-six | ||||
| $ sudo port install matio | ||||
| ~~~~~~ | ||||
|  | ||||
| You also might need to activate a Python installation. The list of installed versions can be retrieved with: | ||||
| @@ -533,6 +534,7 @@ $ brew install cmake hdf5 arpack superlu | ||||
| $ brew install armadillo | ||||
| $ brew install glog gflags gnutls | ||||
| $ brew install gnuradio | ||||
| $ brew install libmatio | ||||
| $ pip install mako | ||||
| $ pip install six | ||||
| ~~~~~~ | ||||
|   | ||||
							
								
								
									
										100
									
								
								cmake/Modules/FindMATIO.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								cmake/Modules/FindMATIO.cmake
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| # FindMATIO | ||||
| # | ||||
| # Try to find MATIO library | ||||
| # | ||||
| # Once done this will define: | ||||
| # | ||||
| #  MATIO_FOUND		- True if MATIO found. | ||||
| #  MATIO_LIBRARIES	- MATIO libraries. | ||||
| #  MATIO_INCLUDE_DIRS - where to find matio.h, etc.. | ||||
| #  MATIO_VERSION_STRING - version number as a string (e.g.: "1.3.4") | ||||
| #  | ||||
| #============================================================================= | ||||
| # Copyright 2015 Avtech Scientific <http://avtechscientific.com> | ||||
| #  | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions | ||||
| # are met: | ||||
| #  | ||||
| # * Redistributions of source code must retain the above copyright | ||||
| #   notice, this list of conditions and the following disclaimer. | ||||
| #  | ||||
| # * Redistributions in binary form must reproduce the above copyright | ||||
| #   notice, this list of conditions and the following disclaimer in the | ||||
| #   documentation and/or other materials provided with the distribution. | ||||
| #  | ||||
| # * Neither the names of Kitware, Inc., the Insight Software Consortium, | ||||
| #   nor the names of their contributors may be used to endorse or promote | ||||
| #   products derived from this software without specific prior written | ||||
| #   permission. | ||||
| #  | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| #============================================================================= | ||||
| # | ||||
|  | ||||
| # Look for the header file. | ||||
| find_path(MATIO_INCLUDE_DIR NAMES matio.h DOC "The MATIO include directory") | ||||
|  | ||||
| # Look for the library. | ||||
| find_library(MATIO_LIBRARY NAMES matio DOC "The MATIO library") | ||||
|  | ||||
| if(MATIO_INCLUDE_DIR) | ||||
| 	# --------------------------------------------------- | ||||
| 	#  Extract version information from MATIO | ||||
| 	# --------------------------------------------------- | ||||
|  | ||||
| 	# If the file is missing, set all values to 0 | ||||
| 	set(MATIO_MAJOR_VERSION 0) | ||||
| 	set(MATIO_MINOR_VERSION 0) | ||||
| 	set(MATIO_RELEASE_LEVEL 0) | ||||
|  | ||||
| 	# new versions of MATIO have `matio_pubconf.h` | ||||
| 	if(EXISTS ${MATIO_INCLUDE_DIR}/matio_pubconf.h) | ||||
| 		set(MATIO_CONFIG_FILE "matio_pubconf.h") | ||||
| 	else() | ||||
| 		set(MATIO_CONFIG_FILE "matioConfig.h") | ||||
| 	endif() | ||||
|  | ||||
| 	if(MATIO_CONFIG_FILE) | ||||
|  | ||||
| 		# Read and parse MATIO config header file for version number | ||||
| 		file(STRINGS "${MATIO_INCLUDE_DIR}/${MATIO_CONFIG_FILE}" _matio_HEADER_CONTENTS REGEX "#define MATIO_((MAJOR|MINOR)_VERSION)|(RELEASE_LEVEL) ") | ||||
|  | ||||
| 		foreach(line ${_matio_HEADER_CONTENTS}) | ||||
| 			if(line MATCHES "#define ([A-Z_]+) ([0-9]+)") | ||||
| 				set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}") | ||||
| 			endif() | ||||
| 		endforeach() | ||||
|  | ||||
| 		unset(_matio_HEADER_CONTENTS) | ||||
| 	endif() | ||||
|  | ||||
| 	set(MATIO_VERSION_STRING "${MATIO_MAJOR_VERSION}.${MATIO_MINOR_VERSION}.${MATIO_RELEASE_LEVEL}") | ||||
| endif () | ||||
|  | ||||
| #================== | ||||
|  | ||||
| mark_as_advanced(MATIO_INCLUDE_DIR MATIO_LIBRARY) | ||||
|  | ||||
| # handle the QUIETLY and REQUIRED arguments and set MATIO_FOUND to TRUE if  | ||||
| # all listed variables are TRUE | ||||
| include(FindPackageHandleStandardArgs) | ||||
| FIND_PACKAGE_HANDLE_STANDARD_ARGS(MATIO REQUIRED_VARS MATIO_LIBRARY MATIO_INCLUDE_DIR VERSION_VAR MATIO_VERSION_STRING) | ||||
|  | ||||
| if(MATIO_FOUND) | ||||
|   set(MATIO_LIBRARIES ${MATIO_LIBRARY}) | ||||
|   set(MATIO_INCLUDE_DIRS ${MATIO_INCLUDE_DIR}) | ||||
| else(MATIO_FOUND) | ||||
|   set(MATIO_LIBRARIES) | ||||
|   set(MATIO_INCLUDE_DIRS) | ||||
| endif(MATIO_FOUND) | ||||
| @@ -31,6 +31,7 @@ include_directories( | ||||
|      ${ARMADILLO_INCLUDE_DIRS} | ||||
|      ${GLOG_INCLUDE_DIRS} | ||||
|      ${GFlags_INCLUDE_DIRS} | ||||
|      ${MATIO_INCLUDE_DIRS} | ||||
| ) | ||||
|  | ||||
| file(GLOB OBS_GR_BLOCKS_HEADERS "*.h") | ||||
| @@ -38,4 +39,4 @@ list(SORT OBS_GR_BLOCKS_HEADERS) | ||||
| add_library(obs_gr_blocks ${OBS_GR_BLOCKS_SOURCES} ${OBS_GR_BLOCKS_HEADERS}) | ||||
| source_group(Headers FILES ${OBS_GR_BLOCKS_HEADERS}) | ||||
| add_dependencies(obs_gr_blocks glog-${glog_RELEASE} armadillo-${armadillo_RELEASE}) | ||||
| target_link_libraries(obs_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${ARMADILLO_LIBRARIES}) | ||||
| target_link_libraries(obs_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${ARMADILLO_LIBRARIES} ${MATIO_LIBRARIES}) | ||||
|   | ||||
| @@ -38,6 +38,7 @@ | ||||
| #include <armadillo> | ||||
| #include <gnuradio/io_signature.h> | ||||
| #include <glog/logging.h> | ||||
| #include <matio.h> | ||||
| #include "Galileo_E1.h" | ||||
| #include "GPS_L1_CA.h" | ||||
|  | ||||
| @@ -104,6 +105,197 @@ hybrid_observables_cc::~hybrid_observables_cc() | ||||
|                     LOG(WARNING) << "Exception in destructor closing the dump file " << ex.what(); | ||||
|             } | ||||
|         } | ||||
|     if(d_dump == true) | ||||
|         { | ||||
|             std::cout << "Writing observables .mat files ..."; | ||||
|             hybrid_observables_cc::save_matfile(); | ||||
|             std::cout << " done." << std::endl; | ||||
|         } | ||||
| } | ||||
|  | ||||
|  | ||||
| int hybrid_observables_cc::save_matfile() | ||||
| { | ||||
|     // READ DUMP FILE | ||||
|     std::ifstream::pos_type size; | ||||
|     int number_of_double_vars = 7; | ||||
|     int epoch_size_bytes = sizeof(double) * number_of_double_vars * d_nchannels; | ||||
|     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; | ||||
|         } | ||||
|     double ** RX_time = new double * [d_nchannels]; | ||||
|     double ** TOW_at_current_symbol_s = new double * [d_nchannels]; | ||||
|     double ** Carrier_Doppler_hz = new double * [d_nchannels]; | ||||
|     double ** Carrier_phase_cycles = new double * [d_nchannels]; | ||||
|     double ** Pseudorange_m = new double * [d_nchannels]; | ||||
|     double ** PRN = new double * [d_nchannels]; | ||||
|     double ** Flag_valid_pseudorange = new double * [d_nchannels]; | ||||
|  | ||||
|     for(unsigned int i = 0; i < d_nchannels; i++) | ||||
|         { | ||||
|             RX_time[i] = new double [num_epoch]; | ||||
|             TOW_at_current_symbol_s[i] = new double[num_epoch]; | ||||
|             Carrier_Doppler_hz[i] = new double[num_epoch]; | ||||
|             Carrier_phase_cycles[i] = new double[num_epoch]; | ||||
|             Pseudorange_m[i] = new double[num_epoch]; | ||||
|             PRN[i] = new double[num_epoch]; | ||||
|             Flag_valid_pseudorange[i] = new double[num_epoch]; | ||||
|         } | ||||
|  | ||||
|     try | ||||
|     { | ||||
|             if (dump_file.is_open()) | ||||
|                 { | ||||
|                     for(long int i = 0; i < num_epoch; i++) | ||||
|                         { | ||||
|                             for(unsigned int chan = 0; chan < d_nchannels; chan++) | ||||
|                                 { | ||||
|                                     dump_file.read(reinterpret_cast<char *>(&RX_time[chan][i]), sizeof(double)); | ||||
|                                     dump_file.read(reinterpret_cast<char *>(&TOW_at_current_symbol_s[chan][i]), sizeof(double)); | ||||
|                                     dump_file.read(reinterpret_cast<char *>(&Carrier_Doppler_hz[chan][i]), sizeof(double)); | ||||
|                                     dump_file.read(reinterpret_cast<char *>(&Carrier_phase_cycles[chan][i]), sizeof(double)); | ||||
|                                     dump_file.read(reinterpret_cast<char *>(&Pseudorange_m[chan][i]), sizeof(double)); | ||||
|                                     dump_file.read(reinterpret_cast<char *>(&PRN[chan][i]), sizeof(double)); | ||||
|                                     dump_file.read(reinterpret_cast<char *>(&Flag_valid_pseudorange[chan][i]), sizeof(double)); | ||||
|                                 } | ||||
|                         } | ||||
|                 } | ||||
|             dump_file.close(); | ||||
|     } | ||||
|     catch (const std::ifstream::failure &e) | ||||
|     { | ||||
|             std::cerr << "Problem reading dump file:" <<  e.what() << std::endl; | ||||
|             for(unsigned int i = 0; i < d_nchannels; i++) | ||||
|                 { | ||||
|                     delete[] RX_time[i]; | ||||
|                     delete[] TOW_at_current_symbol_s[i]; | ||||
|                     delete[] Carrier_Doppler_hz[i]; | ||||
|                     delete[] Carrier_phase_cycles[i]; | ||||
|                     delete[] Pseudorange_m[i]; | ||||
|                     delete[] PRN[i]; | ||||
|                     delete[] Flag_valid_pseudorange[i]; | ||||
|                 } | ||||
|             delete[] RX_time; | ||||
|             delete[] TOW_at_current_symbol_s; | ||||
|             delete[] Carrier_Doppler_hz; | ||||
|             delete[] Carrier_phase_cycles; | ||||
|             delete[] Pseudorange_m; | ||||
|             delete[] PRN; | ||||
|             delete[] Flag_valid_pseudorange; | ||||
|  | ||||
|             return 1; | ||||
|     } | ||||
|  | ||||
|     double * RX_time_aux = new double [d_nchannels * num_epoch]; | ||||
|     double * TOW_at_current_symbol_s_aux = new double [d_nchannels * num_epoch]; | ||||
|     double * Carrier_Doppler_hz_aux = new double [d_nchannels * num_epoch]; | ||||
|     double * Carrier_phase_cycles_aux = new double [d_nchannels * num_epoch]; | ||||
|     double * Pseudorange_m_aux = new double [d_nchannels * num_epoch]; | ||||
|     double * PRN_aux = new double [d_nchannels * num_epoch]; | ||||
|     double * Flag_valid_pseudorange_aux = new double[d_nchannels * num_epoch]; | ||||
|     unsigned int k = 0; | ||||
|     for(long int j = 0; j < num_epoch; j++ ) | ||||
|         { | ||||
|             for(unsigned int i = 0; i < d_nchannels; i++ ) | ||||
|                 { | ||||
|                     RX_time_aux[k] = RX_time[i][j]; | ||||
|                     TOW_at_current_symbol_s_aux[k] = TOW_at_current_symbol_s[i][j]; | ||||
|                     Carrier_Doppler_hz_aux[k] = Carrier_Doppler_hz[i][j]; | ||||
|                     Carrier_phase_cycles_aux[k] = Carrier_phase_cycles[i][j]; | ||||
|                     Pseudorange_m_aux[k] = Pseudorange_m[i][j]; | ||||
|                     PRN_aux[k] = PRN[i][j]; | ||||
|                     Flag_valid_pseudorange_aux[k] = Flag_valid_pseudorange[i][j]; | ||||
|                     k++; | ||||
|                 } | ||||
|         } | ||||
|  | ||||
|     // 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] = {static_cast<size_t>(d_nchannels), static_cast<size_t>(num_epoch)}; | ||||
|             matvar = Mat_VarCreate("RX_time", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, RX_time_aux, MAT_F_DONT_COPY_DATA); | ||||
|             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|             Mat_VarFree(matvar); | ||||
|  | ||||
|             matvar = Mat_VarCreate("TOW_at_current_symbol_s", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, TOW_at_current_symbol_s_aux, MAT_F_DONT_COPY_DATA); | ||||
|             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_aux, MAT_F_DONT_COPY_DATA); | ||||
|             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|             Mat_VarFree(matvar); | ||||
|  | ||||
|             matvar = Mat_VarCreate("Carrier_phase_cycles", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Carrier_phase_cycles_aux, MAT_F_DONT_COPY_DATA); | ||||
|             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|             Mat_VarFree(matvar); | ||||
|  | ||||
|             matvar = Mat_VarCreate("Pseudorange_m", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Pseudorange_m_aux, MAT_F_DONT_COPY_DATA); | ||||
|             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|             Mat_VarFree(matvar); | ||||
|  | ||||
|             matvar = Mat_VarCreate("PRN", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, PRN_aux, MAT_F_DONT_COPY_DATA); | ||||
|             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|             Mat_VarFree(matvar); | ||||
|  | ||||
|             matvar = Mat_VarCreate("Flag_valid_pseudorange", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, Flag_valid_pseudorange_aux, MAT_F_DONT_COPY_DATA); | ||||
|             Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|             Mat_VarFree(matvar); | ||||
|         } | ||||
|     Mat_Close(matfp); | ||||
|  | ||||
|     for(unsigned int i = 0; i < d_nchannels; i++) | ||||
|         { | ||||
|             delete[] RX_time[i]; | ||||
|             delete[] TOW_at_current_symbol_s[i]; | ||||
|             delete[] Carrier_Doppler_hz[i]; | ||||
|             delete[] Carrier_phase_cycles[i]; | ||||
|             delete[] Pseudorange_m[i]; | ||||
|             delete[] PRN[i]; | ||||
|             delete[] Flag_valid_pseudorange[i]; | ||||
|  | ||||
|         } | ||||
|     delete[] RX_time; | ||||
|     delete[] TOW_at_current_symbol_s; | ||||
|     delete[] Carrier_Doppler_hz; | ||||
|     delete[] Carrier_phase_cycles; | ||||
|     delete[] Pseudorange_m; | ||||
|     delete[] PRN; | ||||
|     delete[] Flag_valid_pseudorange; | ||||
|  | ||||
|     delete[] RX_time_aux; | ||||
|     delete[] TOW_at_current_symbol_s_aux; | ||||
|     delete[] Carrier_Doppler_hz_aux; | ||||
|     delete[] Carrier_phase_cycles_aux; | ||||
|     delete[] Pseudorange_m_aux; | ||||
|     delete[] PRN_aux; | ||||
|     delete[] Flag_valid_pseudorange_aux; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -149,7 +341,11 @@ int hybrid_observables_cc::general_work (int noutput_items __attribute__((unused | ||||
|     double past_history_s = 100e-3; | ||||
|  | ||||
|     Gnss_Synchro current_gnss_synchro[d_nchannels]; | ||||
|  | ||||
|     Gnss_Synchro aux = Gnss_Synchro(); | ||||
|     for(unsigned int i = 0; i < d_nchannels; i++) | ||||
|         { | ||||
|             current_gnss_synchro[i] = aux; | ||||
|         } | ||||
|     /* | ||||
|      * 1. Read the GNSS SYNCHRO objects from available channels. | ||||
|      *  Multi-rate GNURADIO Block. Read how many input items are avaliable in each channel | ||||
| @@ -345,7 +541,7 @@ int hybrid_observables_cc::general_work (int noutput_items __attribute__((unused | ||||
|                                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||
|                                                     tmp_double = current_gnss_synchro[i].PRN; | ||||
|                                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||
|                                                     tmp_double = current_gnss_synchro[i].Flag_valid_pseudorange; | ||||
|                                                     tmp_double = static_cast<double>(current_gnss_synchro[i].Flag_valid_pseudorange); | ||||
|                                                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||
|                                                 } | ||||
|                                     } | ||||
| @@ -384,3 +580,4 @@ int hybrid_observables_cc::general_work (int noutput_items __attribute__((unused | ||||
|  | ||||
|     return n_outputs; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -72,6 +72,8 @@ private: | ||||
|     unsigned int history_deep; | ||||
|     std::string d_dump_filename; | ||||
|     std::ofstream d_dump_file; | ||||
|  | ||||
|     int save_matfile(); | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -51,6 +51,7 @@ include_directories( | ||||
|      ${GNURADIO_RUNTIME_INCLUDE_DIRS} | ||||
|      ${VOLK_GNSSSDR_INCLUDE_DIRS} | ||||
|      ${OPT_TRACKING_INCLUDES} | ||||
|      ${MATIO_INCLUDE_DIRS} | ||||
| ) | ||||
|  | ||||
| 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}) | ||||
| 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) | ||||
|     add_dependencies(tracking_gr_blocks volk_gnsssdr_module) | ||||
|   | ||||
| @@ -42,6 +42,7 @@ | ||||
| #include <boost/lexical_cast.hpp> | ||||
| #include <gnuradio/io_signature.h> | ||||
| #include <glog/logging.h> | ||||
| #include <matio.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | ||||
| #include "galileo_e1_signal_processing.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(); | ||||
|             } | ||||
|         } | ||||
|     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 | ||||
|     { | ||||
|             volk_gnsssdr_free(d_local_code_shift_chips); | ||||
| @@ -509,6 +522,228 @@ 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_VE; | ||||
|             delete[] abs_E; | ||||
|             delete[] abs_P; | ||||
|             delete[] abs_L; | ||||
|             delete[] abs_VL; | ||||
|             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_VE; | ||||
|     delete[] abs_E; | ||||
|     delete[] abs_P; | ||||
|     delete[] abs_L; | ||||
|     delete[] abs_VL; | ||||
|     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) | ||||
| { | ||||
|   | ||||
| @@ -174,6 +174,8 @@ private: | ||||
|  | ||||
|     std::map<std::string, std::string> systemName; | ||||
|     std::string sys; | ||||
|  | ||||
|     int save_matfile(); | ||||
| }; | ||||
|  | ||||
| #endif //GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_CC_H | ||||
|   | ||||
| @@ -41,6 +41,7 @@ | ||||
| #include <boost/lexical_cast.hpp> | ||||
| #include <gnuradio/io_signature.h> | ||||
| #include <glog/logging.h> | ||||
| #include <matio.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | ||||
| #include "galileo_e5_signal_processing.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(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     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 | ||||
|     { | ||||
|             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) | ||||
| { | ||||
|     d_acquisition_gnss_synchro = p_gnss_synchro; | ||||
|   | ||||
| @@ -204,6 +204,8 @@ private: | ||||
|  | ||||
|     std::map<std::string, std::string> systemName; | ||||
|     std::string sys; | ||||
|  | ||||
|     int save_matfile(); | ||||
| }; | ||||
|  | ||||
| #endif /* GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_CC_H_ */ | ||||
|   | ||||
| @@ -36,6 +36,7 @@ | ||||
| #include <boost/lexical_cast.hpp> | ||||
| #include <boost/bind.hpp> | ||||
| #include <gnuradio/io_signature.h> | ||||
| #include <matio.h> | ||||
| #include <pmt/pmt.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr.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() | ||||
| { | ||||
|  | ||||
|     if (d_dump_file.is_open()) | ||||
|         { | ||||
|             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(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     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 | ||||
|     { | ||||
|             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)), | ||||
|         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::string sys; | ||||
|  | ||||
|     int save_matfile(); | ||||
| }; | ||||
|  | ||||
| #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H | ||||
|   | ||||
| @@ -37,6 +37,7 @@ | ||||
| #include <boost/bind.hpp> | ||||
| #include <boost/lexical_cast.hpp> | ||||
| #include <gnuradio/io_signature.h> | ||||
| #include <matio.h> | ||||
| #include <pmt/pmt.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr.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(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     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 | ||||
|     { | ||||
|             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)); | ||||
|                     tmp_double = static_cast<double>(d_sample_counter + d_correlation_length_samples); | ||||
|                     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) | ||||
|                 { | ||||
| @@ -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( | ||||
|         Gnss_Synchro* p_gnss_synchro) | ||||
| { | ||||
|   | ||||
| @@ -178,6 +178,8 @@ private: | ||||
|  | ||||
|     std::map<std::string, std::string> systemName; | ||||
|     std::string sys; | ||||
|  | ||||
|     int save_matfile(); | ||||
| }; | ||||
|  | ||||
| #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_FPGA_SC_H | ||||
|   | ||||
| @@ -39,6 +39,7 @@ | ||||
| #include <pmt/pmt.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | ||||
| #include <glog/logging.h> | ||||
| #include <matio.h> | ||||
| #include "gnss_synchro.h" | ||||
| #include "gps_sdr_signal_processing.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(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     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 | ||||
|     { | ||||
|             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)), | ||||
|         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::string sys; | ||||
|  | ||||
|     int save_matfile(); | ||||
| }; | ||||
|  | ||||
| #endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H | ||||
|   | ||||
| @@ -43,6 +43,7 @@ | ||||
| #include <gnuradio/io_signature.h> | ||||
| #include <glog/logging.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | ||||
| #include <matio.h> | ||||
| #include "gps_sdr_signal_processing.h" | ||||
| #include "tracking_discriminators.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() | ||||
| { | ||||
|     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(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     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 | ||||
|     { | ||||
|             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(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -101,6 +101,7 @@ private: | ||||
|             float dll_bw_hz, | ||||
|             float early_late_space_chips); | ||||
|  | ||||
|     int save_matfile(); | ||||
|     // tracking configuration vars | ||||
|     unsigned int d_vector_length; | ||||
|     bool d_dump; | ||||
|   | ||||
| @@ -42,6 +42,7 @@ | ||||
| #include <boost/lexical_cast.hpp> | ||||
| #include <gnuradio/io_signature.h> | ||||
| #include <glog/logging.h> | ||||
| #include <matio.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | ||||
| #include "gps_l2c_signal.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() | ||||
| { | ||||
|     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(); | ||||
|             } | ||||
|         } | ||||
|     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 | ||||
|     { | ||||
|             volk_gnsssdr_free(d_local_code_shift_chips); | ||||
|   | ||||
| @@ -162,6 +162,8 @@ private: | ||||
|  | ||||
|     std::map<std::string, std::string> systemName; | ||||
|     std::string sys; | ||||
|  | ||||
|     int save_matfile(); | ||||
| }; | ||||
|  | ||||
| #endif //GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H | ||||
|   | ||||
| @@ -161,6 +161,12 @@ if(GNUPLOT_FOUND) | ||||
|     add_definitions(-DGNUPLOT_EXECUTABLE="${GNUPLOT_EXECUTABLE}") | ||||
| endif(GNUPLOT_FOUND) | ||||
|  | ||||
| if(MATIO_FOUND OR MATIO_LOCAL) | ||||
|     add_definitions(-DMATIO_TEST=1) | ||||
|     set(GNSS_SDR_TEST_OPTIONAL_LIBS "${GNSS_SDR_TEST_OPTIONAL_LIBS};${MATIO_LIBRARIES}") | ||||
|     set(GNSS_SDR_TEST_OPTIONAL_HEADERS "${GNSS_SDR_TEST_OPTIONAL_HEADERS};${MATIO_INCLUDE_DIRS}") | ||||
| endif(MATIO_FOUND OR MATIO_LOCAL) | ||||
|  | ||||
| ################################################################################ | ||||
| # Optional generator | ||||
| ################################################################################ | ||||
| @@ -319,7 +325,6 @@ include_directories( | ||||
|      ${VOLK_INCLUDE_DIRS} | ||||
|      ${VOLK_GNSSSDR_INCLUDE_DIRS} | ||||
|      ${GNSS_SDR_TEST_OPTIONAL_HEADERS} | ||||
|      ${GNSS_SDR_TEST_OPTIONAL_HEADERS} | ||||
| ) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1895,12 +1895,13 @@ bool Gnuplot::get_program_path() | ||||
|     else | ||||
|         { | ||||
|             std::list<std::string> ls; | ||||
|             std::string path_str = path; | ||||
|  | ||||
|             //split path (one long string) into list ls of strings | ||||
| #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) | ||||
|             stringtok(ls,path,";"); | ||||
|             stringtok(ls,path_str,";"); | ||||
| #elif defined(unix) || defined(__unix) || defined(__unix__) || defined(__APPLE__) | ||||
|             stringtok(ls,path,":"); | ||||
|             stringtok(ls,path_str,":"); | ||||
| #endif | ||||
|  | ||||
|             // scan list for Gnuplot program files | ||||
| @@ -1921,10 +1922,8 @@ bool Gnuplot::get_program_path() | ||||
|  | ||||
|             tmp = "Can't find gnuplot neither in PATH nor in \"" + | ||||
|                     Gnuplot::m_sGNUPlotPath + "\""; | ||||
|             throw GnuplotException(tmp); | ||||
|  | ||||
|             Gnuplot::m_sGNUPlotPath = ""; | ||||
|             return false; | ||||
|             throw GnuplotException(tmp); | ||||
|         } | ||||
| } | ||||
|  | ||||
| @@ -2046,7 +2045,6 @@ std::string Gnuplot::create_tmpfile(std::ofstream &tmp) | ||||
|             std::ostringstream except; | ||||
|             except << "Cannot create temporary file \"" << name << "\""; | ||||
|             throw GnuplotException(except.str()); | ||||
|             return ""; | ||||
|         } | ||||
|  | ||||
|     // | ||||
| @@ -2064,7 +2062,8 @@ void Gnuplot::remove_tmpfiles() | ||||
|     if ((tmpfile_list).size() > 0) | ||||
|         { | ||||
|             for (unsigned int i = 0; i < tmpfile_list.size(); i++) | ||||
|                 remove( tmpfile_list[i].c_str() ); | ||||
|                 if(remove( tmpfile_list[i].c_str() ) != 0) | ||||
|                     std::cout << "Problem closing files" << std::endl; | ||||
|  | ||||
|             Gnuplot::tmpfile_num -= tmpfile_list.size(); | ||||
|         } | ||||
|   | ||||
| @@ -70,6 +70,9 @@ DECLARE_string(log_dir); | ||||
| #include "unit-tests/arithmetic/code_generation_test.cc" | ||||
| #include "unit-tests/arithmetic/fft_length_test.cc" | ||||
| #include "unit-tests/arithmetic/fft_speed_test.cc" | ||||
| #if MATIO_TEST | ||||
| #include "unit-tests/arithmetic/matio_test.cc" | ||||
| #endif | ||||
|  | ||||
| #include "unit-tests/control-plane/file_configuration_test.cc" | ||||
| #include "unit-tests/control-plane/in_memory_configuration_test.cc" | ||||
|   | ||||
							
								
								
									
										159
									
								
								src/tests/unit-tests/arithmetic/matio_test.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								src/tests/unit-tests/arithmetic/matio_test.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| /*! | ||||
|  * \file matio_test.cc | ||||
|  * \brief  This file implements tests for the matio library | ||||
|  *  in long arrays. | ||||
|  * \author Carles Fernandez-Prades, 2017. cfernandez(at)cttc.es | ||||
|  * | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (C) 2010-2017  (see AUTHORS file for a list of contributors) | ||||
|  * | ||||
|  * GNSS-SDR is a software defined Global Navigation | ||||
|  *          Satellite Systems receiver | ||||
|  * | ||||
|  * This file is part of GNSS-SDR. | ||||
|  * | ||||
|  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * GNSS-SDR is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  */ | ||||
|  | ||||
| #include <matio.h> | ||||
| #include <cstdio> | ||||
| #include <gnuradio/gr_complex.h> | ||||
|  | ||||
| TEST(MatioTest, WriteAndReadDoubles) | ||||
| { | ||||
|     // Write a .mat file | ||||
|     mat_t *matfp; | ||||
|     matvar_t *matvar; | ||||
|     std::string filename = "./test.mat"; | ||||
|     matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matfp) == NULL) << "Error creating .mat file"; | ||||
|  | ||||
|     double x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; | ||||
|     size_t dims[2] = {10, 1}; | ||||
|     matvar = Mat_VarCreate("x", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, x, 0); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matvar) == NULL) << "Error creating variable for ’x’"; | ||||
|  | ||||
|     Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|     Mat_VarFree(matvar); | ||||
|  | ||||
|     Mat_Close(matfp); | ||||
|  | ||||
|     // Read a .mat file | ||||
|     mat_t *matfp_read; | ||||
|     matvar_t *matvar_read; | ||||
|  | ||||
|     matfp_read = Mat_Open(filename.c_str(), MAT_ACC_RDONLY); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matfp_read) == NULL) << "Error reading .mat file"; | ||||
|  | ||||
|     matvar_read = Mat_VarReadInfo(matfp_read, "x"); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matvar_read) == NULL) << "Error reading variable in .mat file"; | ||||
|  | ||||
|     matvar_read = Mat_VarRead(matfp_read, "x"); | ||||
|     double *x_read = reinterpret_cast<double*>(matvar_read->data); | ||||
|     Mat_Close(matfp_read); | ||||
|  | ||||
|     for(int i = 0; i < 10; i++) | ||||
|         { | ||||
|             EXPECT_DOUBLE_EQ(x[i], x_read[i]); | ||||
|         } | ||||
|     Mat_VarFree(matvar_read); | ||||
|     ASSERT_EQ(remove(filename.c_str()), 0); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(MatioTest, WriteAndReadGrComplex) | ||||
| { | ||||
|     // Write a .mat file | ||||
|     mat_t *matfp; | ||||
|     matvar_t *matvar1; | ||||
|     std::string filename = "./test3.mat"; | ||||
|     matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matfp) == NULL) << "Error creating .mat file"; | ||||
|  | ||||
|     std::vector<gr_complex> x_v = { {1, 10}, {2, 9}, {3, 8}, {4, 7}, {5, 6}, {6, -5}, {7, -4}, {8, 3}, {9, 2}, {10, 1}}; | ||||
|     const unsigned int size = x_v.size(); | ||||
|     float x_real[size]; | ||||
|     float x_imag[size]; | ||||
|     unsigned int i = 0; | ||||
|     for (std::vector<gr_complex>::const_iterator it = x_v.cbegin(); it != x_v.cend(); it++) | ||||
|         { | ||||
|             x_real[i] = it->real(); | ||||
|             x_imag[i] = it->imag(); | ||||
|             i++; | ||||
|         } | ||||
|  | ||||
|     struct mat_complex_split_t x = {x_real, x_imag}; | ||||
|     size_t dims[2] = {static_cast<size_t>(size), 1}; | ||||
|     matvar1 = Mat_VarCreate("x", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, &x, MAT_F_COMPLEX); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matvar1) == NULL) << "Error creating variable for ’x’"; | ||||
|  | ||||
|     std::vector<gr_complex> x2 = { {1.1, -10}, {2, -9}, {3, -8}, {4, -7}, {5, 6}, {6, -5}, {7, -4}, {8, 3}, {9, 2}, {10, 1}}; | ||||
|     const unsigned int size_y = x2.size(); | ||||
|     float y_real[size_y]; | ||||
|     float y_imag[size_y]; | ||||
|     i = 0; | ||||
|     for (std::vector<gr_complex>::const_iterator it = x2.cbegin(); it != x2.cend(); it++) | ||||
|         { | ||||
|             y_real[i] = it->real(); | ||||
|             y_imag[i] = it->imag(); | ||||
|             i++; | ||||
|         } | ||||
|  | ||||
|     struct mat_complex_split_t y = {y_real, y_imag}; | ||||
|     size_t dims_y[2] = {static_cast<size_t>(size_y), 1}; | ||||
|     matvar_t *matvar2; | ||||
|     matvar2 = Mat_VarCreate("y", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims_y, &y, MAT_F_COMPLEX); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matvar2) == NULL) << "Error creating variable for ’y’"; | ||||
|  | ||||
|     Mat_VarWrite(matfp, matvar1, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|     Mat_VarWrite(matfp, matvar2, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE | ||||
|     Mat_VarFree(matvar1); | ||||
|     Mat_VarFree(matvar2); | ||||
|  | ||||
|     Mat_Close(matfp); | ||||
|  | ||||
|     // Read a .mat file | ||||
|     mat_t *matfp_read; | ||||
|     matvar_t *matvar_read; | ||||
|  | ||||
|     matfp_read = Mat_Open(filename.c_str(), MAT_ACC_RDONLY); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matfp_read) == NULL) << "Error reading .mat file"; | ||||
|  | ||||
|     matvar_read = Mat_VarReadInfo(matfp_read, "x"); | ||||
|     ASSERT_FALSE(reinterpret_cast<long*>(matvar_read) == NULL) << "Error reading variable in .mat file"; | ||||
|  | ||||
|     matvar_read = Mat_VarRead(matfp_read, "x"); | ||||
|     mat_complex_split_t *x_read_st = reinterpret_cast<mat_complex_split_t*>(matvar_read->data); | ||||
|     float * x_read_real = reinterpret_cast<float*>(x_read_st->Re); | ||||
|     float * x_read_imag = reinterpret_cast<float*>(x_read_st->Im); | ||||
|     std::vector<gr_complex> x_v_read; | ||||
|     for(unsigned int i = 0; i < size; i++) | ||||
|         { | ||||
|             x_v_read.push_back(gr_complex(x_read_real[i], x_read_imag[i])); | ||||
|         } | ||||
|  | ||||
|     Mat_Close(matfp_read); | ||||
|     Mat_VarFree(matvar_read); | ||||
|  | ||||
|     for(unsigned int i = 0; i < size; i++) | ||||
|         { | ||||
|             EXPECT_FLOAT_EQ(x_v[i].real(), x_v_read[i].real()); | ||||
|             EXPECT_FLOAT_EQ(x_v[i].imag(), x_v_read[i].imag()); | ||||
|         } | ||||
|     ASSERT_EQ(remove(filename.c_str()), 0); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Carles Fernandez
					Carles Fernandez