2021-10-17 19:26:38 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <liquid/liquid.h>
|
|
|
|
|
|
|
|
#include "utils.h"
|
|
|
|
#include "packet_mod.h"
|
|
|
|
#include "config.h"
|
|
|
|
#include "preamble.h"
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
uint8_t msg_org[] = "Hello Liquid! This is the message to transmit. Hopefully it can be decoded correctly...";
|
|
|
|
|
|
|
|
fec q = fec_create(CHANNEL_CODE, NULL);
|
|
|
|
|
|
|
|
modem demod = modem_create(MODULATION);
|
|
|
|
|
|
|
|
channel_cccf channel = channel_cccf_create();
|
|
|
|
|
|
|
|
float snr = 20.0f;
|
|
|
|
channel_cccf_add_awgn(channel, -snr, snr);
|
|
|
|
|
|
|
|
|
|
|
|
unsigned int k = fec_get_enc_msg_length(CHANNEL_CODE, sizeof(msg_org));
|
|
|
|
|
|
|
|
packet_mod_ctx_t pmod;
|
|
|
|
packet_mod_init(&pmod);
|
|
|
|
|
|
|
|
packet_mod_set_data(&pmod, msg_org, sizeof(msg_org));
|
|
|
|
packet_mod_encode(&pmod);
|
|
|
|
packet_mod_modulate(&pmod);
|
|
|
|
packet_mod_add_header(&pmod);
|
|
|
|
packet_mod_add_preamble(&pmod);
|
|
|
|
|
|
|
|
size_t nsyms;
|
|
|
|
packet_mod_get_result_cf(&pmod, NULL, &nsyms); // determine number of symbols for allocation
|
|
|
|
|
|
|
|
float complex msg_mod[nsyms];
|
|
|
|
packet_mod_get_result_cf(&pmod, msg_mod, &nsyms); // get the data
|
2021-10-17 19:45:54 +02:00
|
|
|
dump_array_cf(msg_mod, nsyms, 1.0f, "/tmp/tx.cpx");
|
2021-10-17 19:26:38 +02:00
|
|
|
|
|
|
|
// channel
|
|
|
|
float complex msg_received[nsyms];
|
|
|
|
|
2021-10-17 19:45:54 +02:00
|
|
|
nsyms = nsyms - 63 - 16;
|
2021-10-17 19:26:38 +02:00
|
|
|
|
|
|
|
//memcpy(msg_received, msg_mod, sizeof(msg_received)); // no noise in channel
|
|
|
|
|
2021-10-17 19:45:54 +02:00
|
|
|
channel_cccf_execute_block(channel, msg_mod + 63 + 16, nsyms, msg_received);
|
2021-10-17 19:26:38 +02:00
|
|
|
dump_array_cf(msg_received, nsyms, 1.0f, "/tmp/rx.cpx");
|
|
|
|
|
|
|
|
// demodulate
|
|
|
|
unsigned int bps = modem_get_bps(demod);
|
|
|
|
|
|
|
|
unsigned char msg_demod_syms[nsyms];
|
|
|
|
unsigned char msg_demod[k+1];
|
|
|
|
|
|
|
|
for(size_t i = 0; i < nsyms; i++) {
|
|
|
|
unsigned int symbol;
|
|
|
|
|
|
|
|
modem_demodulate(demod, msg_received[i], &symbol);
|
|
|
|
msg_demod_syms[i] = symbol;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int received_bytes;
|
2021-10-17 19:45:54 +02:00
|
|
|
liquid_repack_bytes(msg_demod_syms, bps, nsyms, msg_demod, 8, sizeof(msg_demod), &received_bytes);
|
2021-10-17 19:26:38 +02:00
|
|
|
|
|
|
|
//assert(received_bytes == k);
|
|
|
|
|
|
|
|
// decode
|
|
|
|
uint8_t msg_dec[sizeof(msg_org)];
|
|
|
|
//memcpy(msg_dec, msg_enc, sizeof(msg_dec));
|
|
|
|
fec_decode(q, sizeof(msg_dec), msg_demod, msg_dec);
|
|
|
|
|
|
|
|
// compare original to decoded message
|
|
|
|
for(size_t i = 0; i < sizeof(msg_org); i++)
|
|
|
|
{
|
|
|
|
printf("%02x => %02x", msg_org[i], msg_dec[i]);
|
|
|
|
if(msg_org[i] != msg_dec[i]) {
|
|
|
|
printf(" <<< !!!\n");
|
|
|
|
} else {
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned int bit_errors = count_bit_errors_array(msg_org, msg_dec, sizeof(msg_org));
|
|
|
|
printf("%u bit errors detected.\n", bit_errors);
|
|
|
|
|
|
|
|
fec_destroy(q);
|
|
|
|
|
|
|
|
modem_destroy(demod);
|
|
|
|
|
|
|
|
channel_cccf_destroy(channel);
|
|
|
|
|
|
|
|
printf("Done.\n");
|
|
|
|
}
|