I have the following structure
typedef std::vector<float> vectorf;
struct FM_Detector_params_t {
float Fs; // Sampling frequency, Hz
float Fc; // Carrier freq., Hz
int Kd; // Decimation coef
int fir1_order;
int fir2_order;
vectorf fir1_coefs;
vectorf fir2_coefs;
int block_size;
FM_Detector_params_t() {
Fs = 44100.;
Fc = 1800.;
Kd = 12;
fir1_coefs = vectorf();
fir1_order = FIR1_ORDER;
block_size = DEFAULT_BLOCK_SIZE;
fir2_coefs = vectorf();
fir2_order = FIR2_ORDER;
};
};
I need to write it to the file, I have tried the following code to do this
Write to file
bool try_to_restore_filter_configuration() {
std::ifstream in;
FM_Detector_params_t restored;
// Set invalid values to check later
restored.Kd = INVALID_CONFIG_VALUE;
restored.Fs = INVALID_CONFIG_VALUE;
in.open(this->get_config_file_name(), std::ios::binary);
/* if (in.good()) {*/
in.read(reinterpret_cast<char *>(&restored),
sizeof(FM_Detector_params_t));
in.read(reinterpret_cast<char *>(&restored.Fs),
sizeof(restored.Fs));
in.read(reinterpret_cast<char *>(&restored.Fc),
sizeof(restored.Fc));
in.read(reinterpret_cast<char *>(&restored.Kd),
sizeof(restored.Kd));
in.read(reinterpret_cast<char *>(&restored.fir1_order),
sizeof(restored.fir1_order));
in.read(reinterpret_cast<char *>(&restored.fir2_order),
sizeof(restored.fir2_order));
vectorf fir_1_coeffs;
fir_1_coeffs.resize((unsigned long) restored.fir1_order);
in.read((char *) &fir_1_coeffs[0], restored.fir1_order * sizeof(fir_1_coeffs[0]));
in.close();
bool zeros_fir_1 = std::all_of(fir_1_coeffs.begin(), fir_1_coeffs.end(),
[](float i) { return i == 0; });
if (restored.Kd > 0 && restored.Fs > 0 && !zeros_fir_1) {
this->m_fm_detector_params_ = restored;
return true;
}
return false;
}
Read
void save_current_filter_configuration() {
std::ofstream out;
std::cout << "FILE PATH " << this->get_config_file_name() << endl;
out.open(this->get_config_file_name(), std::ios::binary);
out.write(reinterpret_cast<char *>(&this->m_fm_detector_params_.Fs),
sizeof(this->m_fm_detector_params_.Fs));
out.write(reinterpret_cast<char *>(&this->m_fm_detector_params_.Fc),
sizeof(this->m_fm_detector_params_.Fc));
out.write(reinterpret_cast<char *>(&this->m_fm_detector_params_.Kd),
sizeof(this->m_fm_detector_params_.Kd));
out.write(reinterpret_cast<char *>(&this->m_fm_detector_params_.fir1_order),
sizeof(this->m_fm_detector_params_.fir1_order));
out.write(reinterpret_cast<char *>(&this->m_fm_detector_params_.fir2_order),
sizeof(this->m_fm_detector_params_.fir2_order));
auto fir_1_vec_first = this->m_fm_detector_params_.fir1_coefs[0];
out.write(reinterpret_cast<const char *>(&fir_1_vec_first),
this->m_fm_detector_params_.fir1_order * sizeof(fir_1_vec_first));
out.flush();
out.close();
}
The problem is that I cannot serialize/deserialize the vector, it seems to write some data to the file, but it fails to read it back, reading zeroes or throwing SIGSEGV.
Please help to solve the problem, what is wrong with my code ?
THanks
Aucun commentaire:
Enregistrer un commentaire