60 lines
2.0 KiB
C
60 lines
2.0 KiB
C
#include "correct/convolutional/convolutional.h"
|
|
|
|
// https://www.youtube.com/watch?v=b3_lVSrPB6w
|
|
|
|
correct_convolutional *_correct_convolutional_init(correct_convolutional *conv,
|
|
size_t rate, size_t order,
|
|
const polynomial_t *poly) {
|
|
if (order > 8 * sizeof(shift_register_t)) {
|
|
// XXX turn this into an error code
|
|
// printf("order must be smaller than 8 * sizeof(shift_register_t)\n");
|
|
return NULL;
|
|
}
|
|
if (rate < 2) {
|
|
// XXX turn this into an error code
|
|
// printf("rate must be 2 or greater\n");
|
|
return NULL;
|
|
}
|
|
|
|
conv->order = order;
|
|
conv->rate = rate;
|
|
conv->numstates = 1 << order;
|
|
|
|
unsigned int *table = malloc(sizeof(unsigned int) * (1 << order));
|
|
fill_table(conv->rate, conv->order, poly, table);
|
|
*(unsigned int **)&conv->table = table;
|
|
|
|
conv->bit_writer = bit_writer_create(NULL, 0);
|
|
conv->bit_reader = bit_reader_create(NULL, 0);
|
|
|
|
conv->has_init_decode = false;
|
|
return conv;
|
|
}
|
|
|
|
correct_convolutional *correct_convolutional_create(size_t rate, size_t order,
|
|
const polynomial_t *poly) {
|
|
correct_convolutional *conv = malloc(sizeof(correct_convolutional));
|
|
correct_convolutional *init_conv = _correct_convolutional_init(conv, rate, order, poly);
|
|
if (!init_conv) {
|
|
free(conv);
|
|
}
|
|
return init_conv;
|
|
}
|
|
|
|
void _correct_convolutional_teardown(correct_convolutional *conv) {
|
|
free(*(unsigned int **)&conv->table);
|
|
bit_writer_destroy(conv->bit_writer);
|
|
bit_reader_destroy(conv->bit_reader);
|
|
if (conv->has_init_decode) {
|
|
pair_lookup_destroy(conv->pair_lookup);
|
|
history_buffer_destroy(conv->history_buffer);
|
|
error_buffer_destroy(conv->errors);
|
|
free(conv->distances);
|
|
}
|
|
}
|
|
|
|
void correct_convolutional_destroy(correct_convolutional *conv) {
|
|
_correct_convolutional_teardown(conv);
|
|
free(conv);
|
|
}
|