mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-15 20:50:33 +00:00
Merge remote-tracking branch 'cf/matio' into next
This commit adds the possibility to get .mat files with intermediate processing results (output of correlators, observables, etc.). Activate it with dump=true This has been implemented in Tracking Blocks and Observables blocks
This commit is contained in:
commit
1d51f7aae3
@ -326,6 +326,7 @@ set(GNSSSDR_ARMADILLO_LOCAL_VERSION "unstable")
|
|||||||
set(GNSSSDR_GTEST_LOCAL_VERSION "1.8.0")
|
set(GNSSSDR_GTEST_LOCAL_VERSION "1.8.0")
|
||||||
set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master")
|
set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master")
|
||||||
set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10")
|
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
|
# 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 \
|
libboost-serialization-dev libboost-program-options-dev libboost-test-dev \
|
||||||
liblog4cpp5-dev libuhd-dev gnuradio-dev gr-osmosdr libblas-dev liblapack-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 \
|
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
|
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 google-glog +gflags
|
||||||
$ sudo port install py27-mako
|
$ sudo port install py27-mako
|
||||||
$ sudo port install py27-six
|
$ 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:
|
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 armadillo
|
||||||
$ brew install glog gflags gnutls
|
$ brew install glog gflags gnutls
|
||||||
$ brew install gnuradio
|
$ brew install gnuradio
|
||||||
|
$ brew install libmatio
|
||||||
$ pip install mako
|
$ pip install mako
|
||||||
$ pip install six
|
$ 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}
|
${ARMADILLO_INCLUDE_DIRS}
|
||||||
${GLOG_INCLUDE_DIRS}
|
${GLOG_INCLUDE_DIRS}
|
||||||
${GFlags_INCLUDE_DIRS}
|
${GFlags_INCLUDE_DIRS}
|
||||||
|
${MATIO_INCLUDE_DIRS}
|
||||||
)
|
)
|
||||||
|
|
||||||
file(GLOB OBS_GR_BLOCKS_HEADERS "*.h")
|
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})
|
add_library(obs_gr_blocks ${OBS_GR_BLOCKS_SOURCES} ${OBS_GR_BLOCKS_HEADERS})
|
||||||
source_group(Headers FILES ${OBS_GR_BLOCKS_HEADERS})
|
source_group(Headers FILES ${OBS_GR_BLOCKS_HEADERS})
|
||||||
add_dependencies(obs_gr_blocks glog-${glog_RELEASE} armadillo-${armadillo_RELEASE})
|
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 <armadillo>
|
||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
|
#include <matio.h>
|
||||||
#include "Galileo_E1.h"
|
#include "Galileo_E1.h"
|
||||||
#include "GPS_L1_CA.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();
|
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;
|
double past_history_s = 100e-3;
|
||||||
|
|
||||||
Gnss_Synchro current_gnss_synchro[d_nchannels];
|
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.
|
* 1. Read the GNSS SYNCHRO objects from available channels.
|
||||||
* Multi-rate GNURADIO Block. Read how many input items are avaliable in each channel
|
* Multi-rate GNURADIO Block. Read how many input items are avaliable in each channel
|
||||||
@ -339,13 +535,13 @@ int hybrid_observables_cc::general_work (int noutput_items __attribute__((unused
|
|||||||
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
||||||
tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz;
|
tmp_double = current_gnss_synchro[i].Carrier_Doppler_hz;
|
||||||
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
||||||
tmp_double = current_gnss_synchro[i].Carrier_phase_rads/GPS_TWO_PI;
|
tmp_double = current_gnss_synchro[i].Carrier_phase_rads / GPS_TWO_PI;
|
||||||
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
||||||
tmp_double = current_gnss_synchro[i].Pseudorange_m;
|
tmp_double = current_gnss_synchro[i].Pseudorange_m;
|
||||||
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
||||||
tmp_double = current_gnss_synchro[i].PRN;
|
tmp_double = current_gnss_synchro[i].PRN;
|
||||||
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
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));
|
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;
|
return n_outputs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +72,8 @@ private:
|
|||||||
unsigned int history_deep;
|
unsigned int history_deep;
|
||||||
std::string d_dump_filename;
|
std::string d_dump_filename;
|
||||||
std::ofstream d_dump_file;
|
std::ofstream d_dump_file;
|
||||||
|
|
||||||
|
int save_matfile();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -51,6 +51,7 @@ include_directories(
|
|||||||
${GNURADIO_RUNTIME_INCLUDE_DIRS}
|
${GNURADIO_RUNTIME_INCLUDE_DIRS}
|
||||||
${VOLK_GNSSSDR_INCLUDE_DIRS}
|
${VOLK_GNSSSDR_INCLUDE_DIRS}
|
||||||
${OPT_TRACKING_INCLUDES}
|
${OPT_TRACKING_INCLUDES}
|
||||||
|
${MATIO_INCLUDE_DIRS}
|
||||||
)
|
)
|
||||||
|
|
||||||
if(ENABLE_GENERIC_ARCH)
|
if(ENABLE_GENERIC_ARCH)
|
||||||
@ -62,7 +63,7 @@ list(SORT TRACKING_GR_BLOCKS_HEADERS)
|
|||||||
add_library(tracking_gr_blocks ${TRACKING_GR_BLOCKS_SOURCES} ${TRACKING_GR_BLOCKS_HEADERS})
|
add_library(tracking_gr_blocks ${TRACKING_GR_BLOCKS_SOURCES} ${TRACKING_GR_BLOCKS_HEADERS})
|
||||||
source_group(Headers FILES ${TRACKING_GR_BLOCKS_HEADERS})
|
source_group(Headers FILES ${TRACKING_GR_BLOCKS_HEADERS})
|
||||||
|
|
||||||
target_link_libraries(tracking_gr_blocks tracking_lib ${GNURADIO_RUNTIME_LIBRARIES} gnss_sp_libs ${Boost_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${OPT_TRACKING_LIBRARIES})
|
target_link_libraries(tracking_gr_blocks tracking_lib ${GNURADIO_RUNTIME_LIBRARIES} gnss_sp_libs ${Boost_LIBRARIES} ${VOLK_GNSSSDR_LIBRARIES} ${MATIO_LIBRARIES} ${OPT_TRACKING_LIBRARIES})
|
||||||
|
|
||||||
if(NOT VOLK_GNSSSDR_FOUND)
|
if(NOT VOLK_GNSSSDR_FOUND)
|
||||||
add_dependencies(tracking_gr_blocks volk_gnsssdr_module)
|
add_dependencies(tracking_gr_blocks volk_gnsssdr_module)
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
|
#include <matio.h>
|
||||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||||
#include "galileo_e1_signal_processing.h"
|
#include "galileo_e1_signal_processing.h"
|
||||||
#include "tracking_discriminators.h"
|
#include "tracking_discriminators.h"
|
||||||
@ -262,6 +263,18 @@ galileo_e1_dll_pll_veml_tracking_cc::~galileo_e1_dll_pll_veml_tracking_cc()
|
|||||||
LOG(WARNING) << "Exception in destructor " << ex.what();
|
LOG(WARNING) << "Exception in destructor " << ex.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(d_dump)
|
||||||
|
{
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Writing .mat files ...";
|
||||||
|
}
|
||||||
|
galileo_e1_dll_pll_veml_tracking_cc::save_matfile();
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << " done." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
volk_gnsssdr_free(d_local_code_shift_chips);
|
volk_gnsssdr_free(d_local_code_shift_chips);
|
||||||
@ -509,6 +522,224 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items __attri
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int galileo_e1_dll_pll_veml_tracking_cc::save_matfile()
|
||||||
|
{
|
||||||
|
// READ DUMP FILE
|
||||||
|
std::ifstream::pos_type size;
|
||||||
|
int number_of_double_vars = 1;
|
||||||
|
int number_of_float_vars = 17;
|
||||||
|
int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
|
||||||
|
sizeof(float) * number_of_float_vars + sizeof(unsigned int);
|
||||||
|
std::ifstream dump_file;
|
||||||
|
dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
|
||||||
|
}
|
||||||
|
catch(const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem opening dump file:" << e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// count number of epochs and rewind
|
||||||
|
long int num_epoch = 0;
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
size = dump_file.tellg();
|
||||||
|
num_epoch = static_cast<long int>(size) / static_cast<long int>(epoch_size_bytes);
|
||||||
|
dump_file.seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
float * abs_VE = new float [num_epoch];
|
||||||
|
float * abs_E = new float [num_epoch];
|
||||||
|
float * abs_P = new float [num_epoch];
|
||||||
|
float * abs_L = new float [num_epoch];
|
||||||
|
float * abs_VL = new float [num_epoch];
|
||||||
|
float * Prompt_I = new float [num_epoch];
|
||||||
|
float * Prompt_Q = new float [num_epoch];
|
||||||
|
unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
|
||||||
|
float * acc_carrier_phase_rad = new float [num_epoch];
|
||||||
|
float * carrier_doppler_hz = new float [num_epoch];
|
||||||
|
float * code_freq_chips = new float [num_epoch];
|
||||||
|
float * carr_error_hz = new float [num_epoch];
|
||||||
|
float * carr_error_filt_hz = new float [num_epoch];
|
||||||
|
float * code_error_chips = new float [num_epoch];
|
||||||
|
float * code_error_filt_chips = new float [num_epoch];
|
||||||
|
float * CN0_SNV_dB_Hz = new float [num_epoch];
|
||||||
|
float * carrier_lock_test = new float [num_epoch];
|
||||||
|
float * aux1 = new float [num_epoch];
|
||||||
|
double * aux2 = new double [num_epoch];
|
||||||
|
unsigned int * PRN = new unsigned int [num_epoch];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
for(long int i = 0; i < num_epoch; i++)
|
||||||
|
{
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_VE[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_E[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_VL[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN[i]), sizeof(unsigned int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dump_file.close();
|
||||||
|
}
|
||||||
|
catch (const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem reading dump file:" << e.what() << std::endl;
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WRITE MAT FILE
|
||||||
|
mat_t *matfp;
|
||||||
|
matvar_t *matvar;
|
||||||
|
std::string filename = d_dump_filename;
|
||||||
|
filename.erase(filename.length() - 4, 4);
|
||||||
|
filename.append(".mat");
|
||||||
|
matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
|
||||||
|
if(reinterpret_cast<long*>(matfp) != NULL)
|
||||||
|
{
|
||||||
|
size_t dims[2] = {1, static_cast<size_t>(num_epoch)};
|
||||||
|
matvar = Mat_VarCreate("abs_VE", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_VL", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, acc_carrier_phase_rad, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_doppler_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_freq_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_freq_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carr_error_filt_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, code_error_filt_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, CN0_SNV_dB_Hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_lock_test", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, carrier_lock_test, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux1", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, aux1, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
}
|
||||||
|
Mat_Close(matfp);
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void galileo_e1_dll_pll_veml_tracking_cc::set_channel(unsigned int channel)
|
void galileo_e1_dll_pll_veml_tracking_cc::set_channel(unsigned int channel)
|
||||||
{
|
{
|
||||||
|
@ -174,6 +174,8 @@ private:
|
|||||||
|
|
||||||
std::map<std::string, std::string> systemName;
|
std::map<std::string, std::string> systemName;
|
||||||
std::string sys;
|
std::string sys;
|
||||||
|
|
||||||
|
int save_matfile();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_CC_H
|
#endif //GNSS_SDR_GALILEO_E1_DLL_PLL_VEML_TRACKING_CC_H
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
|
#include <matio.h>
|
||||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||||
#include "galileo_e5_signal_processing.h"
|
#include "galileo_e5_signal_processing.h"
|
||||||
#include "tracking_discriminators.h"
|
#include "tracking_discriminators.h"
|
||||||
@ -224,6 +225,20 @@ Galileo_E5a_Dll_Pll_Tracking_cc::~Galileo_E5a_Dll_Pll_Tracking_cc()
|
|||||||
LOG(WARNING)<<"Exception in destructor "<<ex.what();
|
LOG(WARNING)<<"Exception in destructor "<<ex.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(d_dump)
|
||||||
|
{
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Writing .mat files ...";
|
||||||
|
}
|
||||||
|
Galileo_E5a_Dll_Pll_Tracking_cc::save_matfile();
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << " done." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
delete[] d_codeI;
|
delete[] d_codeI;
|
||||||
@ -748,6 +763,213 @@ void Galileo_E5a_Dll_Pll_Tracking_cc::set_channel(unsigned int channel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Galileo_E5a_Dll_Pll_Tracking_cc::save_matfile()
|
||||||
|
{
|
||||||
|
// READ DUMP FILE
|
||||||
|
std::ifstream::pos_type size;
|
||||||
|
int number_of_double_vars = 11;
|
||||||
|
int number_of_float_vars = 5;
|
||||||
|
int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
|
||||||
|
sizeof(float) * number_of_float_vars + sizeof(unsigned int);
|
||||||
|
std::ifstream dump_file;
|
||||||
|
dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
|
||||||
|
}
|
||||||
|
catch(const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem opening dump file:" << e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// count number of epochs and rewind
|
||||||
|
long int num_epoch = 0;
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
size = dump_file.tellg();
|
||||||
|
num_epoch = static_cast<long int>(size) / static_cast<long int>(epoch_size_bytes);
|
||||||
|
dump_file.seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
float * abs_E = new float [num_epoch];
|
||||||
|
float * abs_P = new float [num_epoch];
|
||||||
|
float * abs_L = new float [num_epoch];
|
||||||
|
float * Prompt_I = new float [num_epoch];
|
||||||
|
float * Prompt_Q = new float [num_epoch];
|
||||||
|
unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
|
||||||
|
double * acc_carrier_phase_rad = new double [num_epoch];
|
||||||
|
double * carrier_doppler_hz = new double [num_epoch];
|
||||||
|
double * code_freq_chips = new double [num_epoch];
|
||||||
|
double * carr_error_hz = new double [num_epoch];
|
||||||
|
double * carr_error_filt_hz = new double [num_epoch];
|
||||||
|
double * code_error_chips = new double [num_epoch];
|
||||||
|
double * code_error_filt_chips = new double [num_epoch];
|
||||||
|
double * CN0_SNV_dB_Hz = new double [num_epoch];
|
||||||
|
double * carrier_lock_test = new double [num_epoch];
|
||||||
|
double * aux1 = new double [num_epoch];
|
||||||
|
double * aux2 = new double [num_epoch];
|
||||||
|
unsigned int * PRN = new unsigned int [num_epoch];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
for(long int i = 0; i < num_epoch; i++)
|
||||||
|
{
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_E[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN[i]), sizeof(unsigned int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dump_file.close();
|
||||||
|
}
|
||||||
|
catch (const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem reading dump file:" << e.what() << std::endl;
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WRITE MAT FILE
|
||||||
|
mat_t *matfp;
|
||||||
|
matvar_t *matvar;
|
||||||
|
std::string filename = d_dump_filename;
|
||||||
|
filename.erase(filename.length() - 4, 4);
|
||||||
|
filename.append(".mat");
|
||||||
|
matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
|
||||||
|
if(reinterpret_cast<long*>(matfp) != NULL)
|
||||||
|
{
|
||||||
|
size_t dims[2] = {1, static_cast<size_t>(num_epoch)};
|
||||||
|
matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
}
|
||||||
|
Mat_Close(matfp);
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Galileo_E5a_Dll_Pll_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
|
void Galileo_E5a_Dll_Pll_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
|
||||||
{
|
{
|
||||||
d_acquisition_gnss_synchro = p_gnss_synchro;
|
d_acquisition_gnss_synchro = p_gnss_synchro;
|
||||||
|
@ -204,6 +204,8 @@ private:
|
|||||||
|
|
||||||
std::map<std::string, std::string> systemName;
|
std::map<std::string, std::string> systemName;
|
||||||
std::string sys;
|
std::string sys;
|
||||||
|
|
||||||
|
int save_matfile();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_CC_H_ */
|
#endif /* GNSS_SDR_GALILEO_E5A_DLL_PLL_TRACKING_CC_H_ */
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
|
#include <matio.h>
|
||||||
#include <pmt/pmt.h>
|
#include <pmt/pmt.h>
|
||||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
@ -299,7 +300,6 @@ void gps_l1_ca_dll_pll_c_aid_tracking_cc::start_tracking()
|
|||||||
|
|
||||||
gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc()
|
gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (d_dump_file.is_open())
|
if (d_dump_file.is_open())
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -311,6 +311,20 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc()
|
|||||||
LOG(WARNING) << "Exception in destructor " << ex.what();
|
LOG(WARNING) << "Exception in destructor " << ex.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(d_dump)
|
||||||
|
{
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Writing .mat files ...";
|
||||||
|
}
|
||||||
|
gps_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile();
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << " done." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
volk_gnsssdr_free(d_local_code_shift_chips);
|
volk_gnsssdr_free(d_local_code_shift_chips);
|
||||||
@ -326,6 +340,212 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::~gps_l1_ca_dll_pll_c_aid_tracking_cc()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int gps_l1_ca_dll_pll_c_aid_tracking_cc::save_matfile()
|
||||||
|
{
|
||||||
|
// READ DUMP FILE
|
||||||
|
std::ifstream::pos_type size;
|
||||||
|
int number_of_double_vars = 11;
|
||||||
|
int number_of_float_vars = 5;
|
||||||
|
int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
|
||||||
|
sizeof(float) * number_of_float_vars + sizeof(unsigned int);
|
||||||
|
std::ifstream dump_file;
|
||||||
|
dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
|
||||||
|
}
|
||||||
|
catch(const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem opening dump file:" << e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// count number of epochs and rewind
|
||||||
|
long int num_epoch = 0;
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
size = dump_file.tellg();
|
||||||
|
num_epoch = static_cast<long int>(size) / static_cast<long int>(epoch_size_bytes);
|
||||||
|
dump_file.seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
float * abs_E = new float [num_epoch];
|
||||||
|
float * abs_P = new float [num_epoch];
|
||||||
|
float * abs_L = new float [num_epoch];
|
||||||
|
float * Prompt_I = new float [num_epoch];
|
||||||
|
float * Prompt_Q = new float [num_epoch];
|
||||||
|
unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
|
||||||
|
double * acc_carrier_phase_rad = new double [num_epoch];
|
||||||
|
double * carrier_doppler_hz = new double [num_epoch];
|
||||||
|
double * code_freq_chips = new double [num_epoch];
|
||||||
|
double * carr_error_hz = new double [num_epoch];
|
||||||
|
double * carr_error_filt_hz = new double [num_epoch];
|
||||||
|
double * code_error_chips = new double [num_epoch];
|
||||||
|
double * code_error_filt_chips = new double [num_epoch];
|
||||||
|
double * CN0_SNV_dB_Hz = new double [num_epoch];
|
||||||
|
double * carrier_lock_test = new double [num_epoch];
|
||||||
|
double * aux1 = new double [num_epoch];
|
||||||
|
double * aux2 = new double [num_epoch];
|
||||||
|
unsigned int * PRN = new unsigned int [num_epoch];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
for(long int i = 0; i < num_epoch; i++)
|
||||||
|
{
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_E[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN[i]), sizeof(unsigned int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dump_file.close();
|
||||||
|
}
|
||||||
|
catch (const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem reading dump file:" << e.what() << std::endl;
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WRITE MAT FILE
|
||||||
|
mat_t *matfp;
|
||||||
|
matvar_t *matvar;
|
||||||
|
std::string filename = d_dump_filename;
|
||||||
|
filename.erase(filename.length() - 4, 4);
|
||||||
|
filename.append(".mat");
|
||||||
|
matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
|
||||||
|
if(reinterpret_cast<long*>(matfp) != NULL)
|
||||||
|
{
|
||||||
|
size_t dims[2] = {1, static_cast<size_t>(num_epoch)};
|
||||||
|
matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
}
|
||||||
|
Mat_Close(matfp);
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)),
|
int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)),
|
||||||
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
|
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
|
||||||
|
@ -196,6 +196,8 @@ private:
|
|||||||
|
|
||||||
std::map<std::string, std::string> systemName;
|
std::map<std::string, std::string> systemName;
|
||||||
std::string sys;
|
std::string sys;
|
||||||
|
|
||||||
|
int save_matfile();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H
|
#endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_CC_H
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
|
#include <matio.h>
|
||||||
#include <pmt/pmt.h>
|
#include <pmt/pmt.h>
|
||||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
@ -309,6 +310,20 @@ gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::~gps_l1_ca_dll_pll_c_aid_tracking_fpga
|
|||||||
LOG(WARNING)<< "Exception in destructor " << ex.what();
|
LOG(WARNING)<< "Exception in destructor " << ex.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(d_dump)
|
||||||
|
{
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Writing .mat files ...";
|
||||||
|
}
|
||||||
|
gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::save_matfile();
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << " done." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
volk_gnsssdr_free(d_local_code_shift_chips);
|
volk_gnsssdr_free(d_local_code_shift_chips);
|
||||||
@ -665,6 +680,10 @@ int gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::general_work(
|
|||||||
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
||||||
tmp_double = static_cast<double>(d_sample_counter + d_correlation_length_samples);
|
tmp_double = static_cast<double>(d_sample_counter + d_correlation_length_samples);
|
||||||
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
||||||
|
|
||||||
|
// PRN
|
||||||
|
unsigned int prn_ = d_acquisition_gnss_synchro->PRN;
|
||||||
|
d_dump_file.write(reinterpret_cast<char*>(&prn_), sizeof(unsigned int));
|
||||||
}
|
}
|
||||||
catch (const std::ifstream::failure* e)
|
catch (const std::ifstream::failure* e)
|
||||||
{
|
{
|
||||||
@ -710,6 +729,212 @@ void gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::set_channel(unsigned int channel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::save_matfile()
|
||||||
|
{
|
||||||
|
// READ DUMP FILE
|
||||||
|
std::ifstream::pos_type size;
|
||||||
|
int number_of_double_vars = 11;
|
||||||
|
int number_of_float_vars = 5;
|
||||||
|
int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
|
||||||
|
sizeof(float) * number_of_float_vars + sizeof(unsigned int);
|
||||||
|
std::ifstream dump_file;
|
||||||
|
dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
|
||||||
|
}
|
||||||
|
catch(const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem opening dump file:" << e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// count number of epochs and rewind
|
||||||
|
long int num_epoch = 0;
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
size = dump_file.tellg();
|
||||||
|
num_epoch = static_cast<long int>(size) / static_cast<long int>(epoch_size_bytes);
|
||||||
|
dump_file.seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
float * abs_E = new float [num_epoch];
|
||||||
|
float * abs_P = new float [num_epoch];
|
||||||
|
float * abs_L = new float [num_epoch];
|
||||||
|
float * Prompt_I = new float [num_epoch];
|
||||||
|
float * Prompt_Q = new float [num_epoch];
|
||||||
|
unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
|
||||||
|
double * acc_carrier_phase_rad = new double [num_epoch];
|
||||||
|
double * carrier_doppler_hz = new double [num_epoch];
|
||||||
|
double * code_freq_chips = new double [num_epoch];
|
||||||
|
double * carr_error_hz = new double [num_epoch];
|
||||||
|
double * carr_error_filt_hz = new double [num_epoch];
|
||||||
|
double * code_error_chips = new double [num_epoch];
|
||||||
|
double * code_error_filt_chips = new double [num_epoch];
|
||||||
|
double * CN0_SNV_dB_Hz = new double [num_epoch];
|
||||||
|
double * carrier_lock_test = new double [num_epoch];
|
||||||
|
double * aux1 = new double [num_epoch];
|
||||||
|
double * aux2 = new double [num_epoch];
|
||||||
|
unsigned int * PRN = new unsigned int [num_epoch];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
for(long int i = 0; i < num_epoch; i++)
|
||||||
|
{
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_E[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN[i]), sizeof(unsigned int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dump_file.close();
|
||||||
|
}
|
||||||
|
catch (const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem reading dump file:" << e.what() << std::endl;
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WRITE MAT FILE
|
||||||
|
mat_t *matfp;
|
||||||
|
matvar_t *matvar;
|
||||||
|
std::string filename = d_dump_filename;
|
||||||
|
filename.erase(filename.length() - 4, 4);
|
||||||
|
filename.append(".mat");
|
||||||
|
matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
|
||||||
|
if(reinterpret_cast<long*>(matfp) != NULL)
|
||||||
|
{
|
||||||
|
size_t dims[2] = {1, static_cast<size_t>(num_epoch)};
|
||||||
|
matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
}
|
||||||
|
Mat_Close(matfp);
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::set_gnss_synchro(
|
void gps_l1_ca_dll_pll_c_aid_tracking_fpga_sc::set_gnss_synchro(
|
||||||
Gnss_Synchro* p_gnss_synchro)
|
Gnss_Synchro* p_gnss_synchro)
|
||||||
{
|
{
|
||||||
|
@ -178,6 +178,8 @@ private:
|
|||||||
|
|
||||||
std::map<std::string, std::string> systemName;
|
std::map<std::string, std::string> systemName;
|
||||||
std::string sys;
|
std::string sys;
|
||||||
|
|
||||||
|
int save_matfile();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_FPGA_SC_H
|
#endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_FPGA_SC_H
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include <pmt/pmt.h>
|
#include <pmt/pmt.h>
|
||||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
|
#include <matio.h>
|
||||||
#include "gnss_synchro.h"
|
#include "gnss_synchro.h"
|
||||||
#include "gps_sdr_signal_processing.h"
|
#include "gps_sdr_signal_processing.h"
|
||||||
#include "tracking_discriminators.h"
|
#include "tracking_discriminators.h"
|
||||||
@ -313,6 +314,20 @@ gps_l1_ca_dll_pll_c_aid_tracking_sc::~gps_l1_ca_dll_pll_c_aid_tracking_sc()
|
|||||||
LOG(WARNING) << "Exception in destructor " << ex.what();
|
LOG(WARNING) << "Exception in destructor " << ex.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(d_dump)
|
||||||
|
{
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Writing .mat files ...";
|
||||||
|
}
|
||||||
|
gps_l1_ca_dll_pll_c_aid_tracking_sc::save_matfile();
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << " done." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
volk_gnsssdr_free(d_local_code_shift_chips);
|
volk_gnsssdr_free(d_local_code_shift_chips);
|
||||||
@ -330,6 +345,212 @@ gps_l1_ca_dll_pll_c_aid_tracking_sc::~gps_l1_ca_dll_pll_c_aid_tracking_sc()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int gps_l1_ca_dll_pll_c_aid_tracking_sc::save_matfile()
|
||||||
|
{
|
||||||
|
// READ DUMP FILE
|
||||||
|
std::ifstream::pos_type size;
|
||||||
|
int number_of_double_vars = 11;
|
||||||
|
int number_of_float_vars = 5;
|
||||||
|
int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
|
||||||
|
sizeof(float) * number_of_float_vars + sizeof(unsigned int);
|
||||||
|
std::ifstream dump_file;
|
||||||
|
dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
|
||||||
|
}
|
||||||
|
catch(const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem opening dump file:" << e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// count number of epochs and rewind
|
||||||
|
long int num_epoch = 0;
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
size = dump_file.tellg();
|
||||||
|
num_epoch = static_cast<long int>(size) / static_cast<long int>(epoch_size_bytes);
|
||||||
|
dump_file.seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
float * abs_E = new float [num_epoch];
|
||||||
|
float * abs_P = new float [num_epoch];
|
||||||
|
float * abs_L = new float [num_epoch];
|
||||||
|
float * Prompt_I = new float [num_epoch];
|
||||||
|
float * Prompt_Q = new float [num_epoch];
|
||||||
|
unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
|
||||||
|
double * acc_carrier_phase_rad = new double [num_epoch];
|
||||||
|
double * carrier_doppler_hz = new double [num_epoch];
|
||||||
|
double * code_freq_chips = new double [num_epoch];
|
||||||
|
double * carr_error_hz = new double [num_epoch];
|
||||||
|
double * carr_error_filt_hz = new double [num_epoch];
|
||||||
|
double * code_error_chips = new double [num_epoch];
|
||||||
|
double * code_error_filt_chips = new double [num_epoch];
|
||||||
|
double * CN0_SNV_dB_Hz = new double [num_epoch];
|
||||||
|
double * carrier_lock_test = new double [num_epoch];
|
||||||
|
double * aux1 = new double [num_epoch];
|
||||||
|
double * aux2 = new double [num_epoch];
|
||||||
|
unsigned int * PRN = new unsigned int [num_epoch];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
for(long int i = 0; i < num_epoch; i++)
|
||||||
|
{
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_E[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN[i]), sizeof(unsigned int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dump_file.close();
|
||||||
|
}
|
||||||
|
catch (const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem reading dump file:" << e.what() << std::endl;
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WRITE MAT FILE
|
||||||
|
mat_t *matfp;
|
||||||
|
matvar_t *matvar;
|
||||||
|
std::string filename = d_dump_filename;
|
||||||
|
filename.erase(filename.length() - 4, 4);
|
||||||
|
filename.append(".mat");
|
||||||
|
matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
|
||||||
|
if(reinterpret_cast<long*>(matfp) != NULL)
|
||||||
|
{
|
||||||
|
size_t dims[2] = {1, static_cast<size_t>(num_epoch)};
|
||||||
|
matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
}
|
||||||
|
Mat_Close(matfp);
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int gps_l1_ca_dll_pll_c_aid_tracking_sc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)),
|
int gps_l1_ca_dll_pll_c_aid_tracking_sc::general_work (int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)),
|
||||||
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
|
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
|
||||||
|
@ -200,6 +200,8 @@ private:
|
|||||||
|
|
||||||
std::map<std::string, std::string> systemName;
|
std::map<std::string, std::string> systemName;
|
||||||
std::string sys;
|
std::string sys;
|
||||||
|
|
||||||
|
int save_matfile();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H
|
#endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_C_AID_TRACKING_SC_H
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||||
|
#include <matio.h>
|
||||||
#include "gps_sdr_signal_processing.h"
|
#include "gps_sdr_signal_processing.h"
|
||||||
#include "tracking_discriminators.h"
|
#include "tracking_discriminators.h"
|
||||||
#include "lock_detectors.h"
|
#include "lock_detectors.h"
|
||||||
@ -266,6 +267,213 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Gps_L1_Ca_Dll_Pll_Tracking_cc::save_matfile()
|
||||||
|
{
|
||||||
|
// READ DUMP FILE
|
||||||
|
std::ifstream::pos_type size;
|
||||||
|
int number_of_double_vars = 11;
|
||||||
|
int number_of_float_vars = 5;
|
||||||
|
int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
|
||||||
|
sizeof(float) * number_of_float_vars + sizeof(unsigned int);
|
||||||
|
std::ifstream dump_file;
|
||||||
|
dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
|
||||||
|
}
|
||||||
|
catch(const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem opening dump file:" << e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// count number of epochs and rewind
|
||||||
|
long int num_epoch = 0;
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
size = dump_file.tellg();
|
||||||
|
num_epoch = static_cast<long int>(size) / static_cast<long int>(epoch_size_bytes);
|
||||||
|
dump_file.seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
float * abs_E = new float [num_epoch];
|
||||||
|
float * abs_P = new float [num_epoch];
|
||||||
|
float * abs_L = new float [num_epoch];
|
||||||
|
float * Prompt_I = new float [num_epoch];
|
||||||
|
float * Prompt_Q = new float [num_epoch];
|
||||||
|
unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
|
||||||
|
double * acc_carrier_phase_rad = new double [num_epoch];
|
||||||
|
double * carrier_doppler_hz = new double [num_epoch];
|
||||||
|
double * code_freq_chips = new double [num_epoch];
|
||||||
|
double * carr_error_hz = new double [num_epoch];
|
||||||
|
double * carr_error_filt_hz = new double [num_epoch];
|
||||||
|
double * code_error_chips = new double [num_epoch];
|
||||||
|
double * code_error_filt_chips = new double [num_epoch];
|
||||||
|
double * CN0_SNV_dB_Hz = new double [num_epoch];
|
||||||
|
double * carrier_lock_test = new double [num_epoch];
|
||||||
|
double * aux1 = new double [num_epoch];
|
||||||
|
double * aux2 = new double [num_epoch];
|
||||||
|
unsigned int * PRN = new unsigned int [num_epoch];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
for(long int i = 0; i < num_epoch; i++)
|
||||||
|
{
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_E[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN[i]), sizeof(unsigned int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dump_file.close();
|
||||||
|
}
|
||||||
|
catch (const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem reading dump file:" << e.what() << std::endl;
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WRITE MAT FILE
|
||||||
|
mat_t *matfp;
|
||||||
|
matvar_t *matvar;
|
||||||
|
std::string filename = d_dump_filename;
|
||||||
|
filename.erase(filename.length() - 4, 4);
|
||||||
|
filename.append(".mat");
|
||||||
|
matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
|
||||||
|
if(reinterpret_cast<long*>(matfp) != NULL)
|
||||||
|
{
|
||||||
|
size_t dims[2] = {1, static_cast<size_t>(num_epoch)};
|
||||||
|
matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
}
|
||||||
|
Mat_Close(matfp);
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc()
|
Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc()
|
||||||
{
|
{
|
||||||
if (d_dump_file.is_open())
|
if (d_dump_file.is_open())
|
||||||
@ -279,6 +487,20 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc()
|
|||||||
LOG(WARNING) << "Exception in destructor " << ex.what();
|
LOG(WARNING) << "Exception in destructor " << ex.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(d_dump)
|
||||||
|
{
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Writing .mat files ...";
|
||||||
|
}
|
||||||
|
Gps_L1_Ca_Dll_Pll_Tracking_cc::save_matfile();
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << " done." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
volk_gnsssdr_free(d_local_code_shift_chips);
|
volk_gnsssdr_free(d_local_code_shift_chips);
|
||||||
@ -291,6 +513,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc()
|
|||||||
{
|
{
|
||||||
LOG(WARNING) << "Exception in destructor " << ex.what();
|
LOG(WARNING) << "Exception in destructor " << ex.what();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -443,7 +666,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items __attribute__
|
|||||||
d_correlator_outs[n] = gr_complex(0,0);
|
d_correlator_outs[n] = gr_complex(0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
current_synchro_data.Tracking_sample_counter =d_sample_counter + d_current_prn_length_samples;
|
current_synchro_data.Tracking_sample_counter = d_sample_counter + d_current_prn_length_samples;
|
||||||
current_synchro_data.System = {'G'};
|
current_synchro_data.System = {'G'};
|
||||||
current_synchro_data.correlation_length_ms = 1;
|
current_synchro_data.correlation_length_ms = 1;
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,7 @@ private:
|
|||||||
float dll_bw_hz,
|
float dll_bw_hz,
|
||||||
float early_late_space_chips);
|
float early_late_space_chips);
|
||||||
|
|
||||||
|
int save_matfile();
|
||||||
// tracking configuration vars
|
// tracking configuration vars
|
||||||
unsigned int d_vector_length;
|
unsigned int d_vector_length;
|
||||||
bool d_dump;
|
bool d_dump;
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
|
#include <matio.h>
|
||||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||||
#include "gps_l2c_signal.h"
|
#include "gps_l2c_signal.h"
|
||||||
#include "tracking_discriminators.h"
|
#include "tracking_discriminators.h"
|
||||||
@ -269,6 +270,213 @@ void gps_l2_m_dll_pll_tracking_cc::start_tracking()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int gps_l2_m_dll_pll_tracking_cc::save_matfile()
|
||||||
|
{
|
||||||
|
// READ DUMP FILE
|
||||||
|
std::ifstream::pos_type size;
|
||||||
|
int number_of_double_vars = 11;
|
||||||
|
int number_of_float_vars = 5;
|
||||||
|
int epoch_size_bytes = sizeof(unsigned long int) + sizeof(double) * number_of_double_vars +
|
||||||
|
sizeof(float) * number_of_float_vars + sizeof(unsigned int);
|
||||||
|
std::ifstream dump_file;
|
||||||
|
dump_file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dump_file.open(d_dump_filename.c_str(), std::ios::binary | std::ios::ate);
|
||||||
|
}
|
||||||
|
catch(const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem opening dump file:" << e.what() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// count number of epochs and rewind
|
||||||
|
long int num_epoch = 0;
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
size = dump_file.tellg();
|
||||||
|
num_epoch = static_cast<long int>(size) / static_cast<long int>(epoch_size_bytes);
|
||||||
|
dump_file.seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
float * abs_E = new float [num_epoch];
|
||||||
|
float * abs_P = new float [num_epoch];
|
||||||
|
float * abs_L = new float [num_epoch];
|
||||||
|
float * Prompt_I = new float [num_epoch];
|
||||||
|
float * Prompt_Q = new float [num_epoch];
|
||||||
|
unsigned long int * PRN_start_sample_count = new unsigned long int [num_epoch];
|
||||||
|
double * acc_carrier_phase_rad = new double [num_epoch];
|
||||||
|
double * carrier_doppler_hz = new double [num_epoch];
|
||||||
|
double * code_freq_chips = new double [num_epoch];
|
||||||
|
double * carr_error_hz = new double [num_epoch];
|
||||||
|
double * carr_error_filt_hz = new double [num_epoch];
|
||||||
|
double * code_error_chips = new double [num_epoch];
|
||||||
|
double * code_error_filt_chips = new double [num_epoch];
|
||||||
|
double * CN0_SNV_dB_Hz = new double [num_epoch];
|
||||||
|
double * carrier_lock_test = new double [num_epoch];
|
||||||
|
double * aux1 = new double [num_epoch];
|
||||||
|
double * aux2 = new double [num_epoch];
|
||||||
|
unsigned int * PRN = new unsigned int [num_epoch];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (dump_file.is_open())
|
||||||
|
{
|
||||||
|
for(long int i = 0; i < num_epoch; i++)
|
||||||
|
{
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_E[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_P[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&abs_L[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_I[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&Prompt_Q[i]), sizeof(float));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN_start_sample_count[i]), sizeof(unsigned long int));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&acc_carrier_phase_rad[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_doppler_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_freq_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carr_error_filt_hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&code_error_filt_chips[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&CN0_SNV_dB_Hz[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&carrier_lock_test[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux1[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&aux2[i]), sizeof(double));
|
||||||
|
dump_file.read(reinterpret_cast<char *>(&PRN[i]), sizeof(unsigned int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dump_file.close();
|
||||||
|
}
|
||||||
|
catch (const std::ifstream::failure &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Problem reading dump file:" << e.what() << std::endl;
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WRITE MAT FILE
|
||||||
|
mat_t *matfp;
|
||||||
|
matvar_t *matvar;
|
||||||
|
std::string filename = d_dump_filename;
|
||||||
|
filename.erase(filename.length() - 4, 4);
|
||||||
|
filename.append(".mat");
|
||||||
|
matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT73);
|
||||||
|
if(reinterpret_cast<long*>(matfp) != NULL)
|
||||||
|
{
|
||||||
|
size_t dims[2] = {1, static_cast<size_t>(num_epoch)};
|
||||||
|
matvar = Mat_VarCreate("abs_E", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_E, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_P", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_P, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("abs_L", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, abs_L, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_I", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_I, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("Prompt_Q", MAT_C_SINGLE, MAT_T_SINGLE, 2, dims, Prompt_Q, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN_start_sample_count", MAT_C_UINT64, MAT_T_UINT64, 2, dims, PRN_start_sample_count, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("acc_carrier_phase_rad", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, acc_carrier_phase_rad, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_doppler_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_doppler_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_freq_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_freq_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carr_error_filt_hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carr_error_filt_hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("code_error_filt_chips", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, code_error_filt_chips, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("CN0_SNV_dB_Hz", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, CN0_SNV_dB_Hz, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("carrier_lock_test", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, carrier_lock_test, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux1", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux1, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("aux2", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, aux2, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
|
||||||
|
matvar = Mat_VarCreate("PRN", MAT_C_UINT32, MAT_T_UINT32, 2, dims, PRN, 0);
|
||||||
|
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_ZLIB); // or MAT_COMPRESSION_NONE
|
||||||
|
Mat_VarFree(matvar);
|
||||||
|
}
|
||||||
|
Mat_Close(matfp);
|
||||||
|
delete[] abs_E;
|
||||||
|
delete[] abs_P;
|
||||||
|
delete[] abs_L;
|
||||||
|
delete[] Prompt_I;
|
||||||
|
delete[] Prompt_Q;
|
||||||
|
delete[] PRN_start_sample_count;
|
||||||
|
delete[] acc_carrier_phase_rad;
|
||||||
|
delete[] carrier_doppler_hz;
|
||||||
|
delete[] code_freq_chips;
|
||||||
|
delete[] carr_error_hz;
|
||||||
|
delete[] carr_error_filt_hz;
|
||||||
|
delete[] code_error_chips;
|
||||||
|
delete[] code_error_filt_chips;
|
||||||
|
delete[] CN0_SNV_dB_Hz;
|
||||||
|
delete[] carrier_lock_test;
|
||||||
|
delete[] aux1;
|
||||||
|
delete[] aux2;
|
||||||
|
delete[] PRN;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc()
|
gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc()
|
||||||
{
|
{
|
||||||
if (d_dump_file.is_open())
|
if (d_dump_file.is_open())
|
||||||
@ -282,6 +490,18 @@ gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc()
|
|||||||
LOG(WARNING) << "Exception in destructor " << ex.what();
|
LOG(WARNING) << "Exception in destructor " << ex.what();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(d_dump)
|
||||||
|
{
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Writing .mat files ...";
|
||||||
|
}
|
||||||
|
gps_l2_m_dll_pll_tracking_cc::save_matfile();
|
||||||
|
if(d_channel == 0)
|
||||||
|
{
|
||||||
|
std::cout << " done." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
volk_gnsssdr_free(d_local_code_shift_chips);
|
volk_gnsssdr_free(d_local_code_shift_chips);
|
||||||
|
@ -162,6 +162,8 @@ private:
|
|||||||
|
|
||||||
std::map<std::string, std::string> systemName;
|
std::map<std::string, std::string> systemName;
|
||||||
std::string sys;
|
std::string sys;
|
||||||
|
|
||||||
|
int save_matfile();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H
|
#endif //GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H
|
||||||
|
@ -161,6 +161,12 @@ if(GNUPLOT_FOUND)
|
|||||||
add_definitions(-DGNUPLOT_EXECUTABLE="${GNUPLOT_EXECUTABLE}")
|
add_definitions(-DGNUPLOT_EXECUTABLE="${GNUPLOT_EXECUTABLE}")
|
||||||
endif(GNUPLOT_FOUND)
|
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
|
# Optional generator
|
||||||
################################################################################
|
################################################################################
|
||||||
@ -319,7 +325,6 @@ include_directories(
|
|||||||
${VOLK_INCLUDE_DIRS}
|
${VOLK_INCLUDE_DIRS}
|
||||||
${VOLK_GNSSSDR_INCLUDE_DIRS}
|
${VOLK_GNSSSDR_INCLUDE_DIRS}
|
||||||
${GNSS_SDR_TEST_OPTIONAL_HEADERS}
|
${GNSS_SDR_TEST_OPTIONAL_HEADERS}
|
||||||
${GNSS_SDR_TEST_OPTIONAL_HEADERS}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,6 +70,9 @@ DECLARE_string(log_dir);
|
|||||||
#include "unit-tests/arithmetic/code_generation_test.cc"
|
#include "unit-tests/arithmetic/code_generation_test.cc"
|
||||||
#include "unit-tests/arithmetic/fft_length_test.cc"
|
#include "unit-tests/arithmetic/fft_length_test.cc"
|
||||||
#include "unit-tests/arithmetic/fft_speed_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/file_configuration_test.cc"
|
||||||
#include "unit-tests/control-plane/in_memory_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);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user