2024-10-08 23:49:40 -04:00
|
|
|
#include <bitset>
|
|
|
|
#include <fstream>
|
|
|
|
#include <iostream>
|
2024-10-14 23:52:56 -04:00
|
|
|
#include <random>
|
2024-10-08 23:49:40 -04:00
|
|
|
#include <string>
|
|
|
|
#include <sndfile.h>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "ModemController.h"
|
2024-10-14 17:43:33 -04:00
|
|
|
#include "PSKModulator.h"
|
2024-10-08 23:49:40 -04:00
|
|
|
|
2024-10-14 23:52:56 -04:00
|
|
|
BitStream generateBernoulliData(size_t length, double p = 0.5) {
|
|
|
|
BitStream random_data;
|
|
|
|
std::random_device rd;
|
|
|
|
std::mt19937 gen(rd());
|
|
|
|
std::bernoulli_distribution dist(p);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < length * 8; ++i) {
|
|
|
|
random_data.putBit(dist(gen)); // Generates 0 or 1 with probability p
|
|
|
|
}
|
|
|
|
return random_data;
|
|
|
|
}
|
2024-10-08 23:49:40 -04:00
|
|
|
|
2024-10-14 23:52:56 -04:00
|
|
|
int main() {
|
2024-10-08 23:49:40 -04:00
|
|
|
// Convert sample data to a BitStream object
|
2024-10-14 23:52:56 -04:00
|
|
|
BitStream input_data = generateBernoulliData(28800);
|
2024-10-08 23:49:40 -04:00
|
|
|
|
|
|
|
// Configuration for modem
|
2024-10-14 23:52:56 -04:00
|
|
|
size_t baud_rate = 75;
|
2024-10-08 23:49:40 -04:00
|
|
|
bool is_voice = false; // False indicates data mode
|
|
|
|
bool is_frequency_hopping = false; // Fixed frequency operation
|
2024-10-14 23:52:56 -04:00
|
|
|
size_t interleave_setting = 2; // Short interleave
|
2024-10-08 23:49:40 -04:00
|
|
|
|
|
|
|
// Create ModemController instance
|
2024-10-14 23:52:56 -04:00
|
|
|
ModemController modem(baud_rate, is_voice, is_frequency_hopping, interleave_setting);
|
|
|
|
|
|
|
|
const char* file_name = "modulated_signal_75bps_longinterleave.wav";
|
2024-10-08 23:49:40 -04:00
|
|
|
|
|
|
|
// Perform transmit operation to generate modulated signal
|
2024-10-14 23:52:56 -04:00
|
|
|
std::vector<int16_t> modulated_signal = modem.transmit(input_data);
|
|
|
|
|
|
|
|
// Output modulated signal to a WAV file using libsndfile
|
|
|
|
SF_INFO sfinfo;
|
|
|
|
sfinfo.channels = 1;
|
|
|
|
sfinfo.samplerate = 48000;
|
|
|
|
sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
|
|
|
|
|
|
|
|
SNDFILE* sndfile = sf_open(file_name, SFM_WRITE, &sfinfo);
|
|
|
|
if (sndfile == nullptr) {
|
|
|
|
std::cerr << "Unable to open WAV file for writing modulated signal: " << sf_strerror(sndfile) << "\n";
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sf_write_short(sndfile, modulated_signal.data(), modulated_signal.size());
|
|
|
|
sf_close(sndfile);
|
|
|
|
std::cout << "Modulated signal written to " << file_name << '\n';
|
|
|
|
|
|
|
|
// Success message
|
|
|
|
std::cout << "Modem test completed successfully.\n";
|
2024-10-08 23:49:40 -04:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|