qo100-trx-prototypes/blocks/test.cpp

70 lines
1.8 KiB
C++

#include <cstdio>
#include <iostream>
#include <complex>
#include <liquid/liquid.h>
#include "costas-beacon-sync.h"
#include "fft-beacon-finder.h"
const size_t buffer_size = 4069;
int main(int argc, char const* argv[]) {
FILE* output = fopen("output.raw", "w");
FILE* input = fopen("input.raw", "r");
FFTBeaconFinder finder(1024000);
CostasBeaconSync sync(0.03, -0.1, 0.1);
int sample_count = 0;
clock_t start_time = clock();
std::complex<float> in_buffer[buffer_size];
std::complex<float> out_buffer[buffer_size/2];
firdecim_crcf decim = firdecim_crcf_create_kaiser(2,2,80);
size_t len =
fread(in_buffer, sizeof(std::complex<float>), buffer_size, input);
while (len > 0) {
for (size_t i = 0; i < len; i+=2) {
std::complex<float> coarse_synced[2];
coarse_synced[0] = finder.work(in_buffer[i]);
coarse_synced[1] = finder.work(in_buffer[i+1]);
std::complex<float> resampled;
firdecim_crcf_execute(decim, coarse_synced, &resampled);
std::complex<float> sync_correction = sync.work(resampled);
if(!sync.has_lock()) {
//std::cout << "Resetting lock" << std::endl;
finder.reset_sync();
}
out_buffer[i/2] = resampled * sync_correction;
}
sample_count += len;
fwrite(out_buffer, sizeof(std::complex<float>), buffer_size/2, output);
len =
fread(&in_buffer, sizeof(std::complex<float>), buffer_size, input);
};
clock_t end_time = clock();
clock_t result = end_time - start_time;
std::cout << "Processed " << sample_count << " samples ("
<< sample_count / 1024000.0 << "s) "
<< "in " << result / CLOCKS_PER_SEC << " s" << std::endl;
fclose(input);
fclose(output);
return 0;
}