Files
armod/demodulator.h

81 lines
2.2 KiB
C
Raw Normal View History

2022-10-24 19:41:38 +02:00
/*
* File: demodulator.h
*/
#ifndef DEMODULATOR_H
#define DEMODULATOR_H
#ifdef __XC16
#include <dsp.h>
#else
typedef int16_t _Q0_15;
typedef int32_t _Q15_16;
typedef _Q0_15 _Q15;
typedef _Q15_16 _Q16;
typedef int16_t fractional;
#endif
#include <stdint.h>
#include "modem_types.h"
#define MAX_PHASE_SKEW 10000L
#define ADC_MAX_AMPLITUDE 10000L
typedef struct {
fractional frequency;
fractional phase;
fractional amplitude;
} detector_symbol;
extern detector_symbol detector_constellation[MAX_MODULATION_ALPHABET_SIZE], symbol_error, min_symbol_distance;
// TODO
typedef struct {
uint8_t buffer[MAX_SYMBOL_BUFFER_SIZE];
uint8_t index;
uint8_t length;
} symbol_buffer;
// extern symbol_buffer rx_symbol_buffer;
// buffer dei simboli
extern uint8_t rx_symbol_buffer[MAX_SYMBOL_BUFFER_SIZE];
extern uint8_t rx_symbol_buffer_index, rx_symbol_buffer_lenght;
extern uint8_t rx_sample_buffers_buffer[MAX_BUFFERS_PER_SYMBOL], rx_sample_buffer_index;
extern uint8_t volatile process_input_sample_buffer;
// zona del simbolo da esaminare:
extern uint8_t rx_symbol_detected_part_offset, rx_symbol_detected_part_length;
// NCO
extern fractional tanlock_nco_rotor_inc;
#ifdef __DSP_LIB__
extern FIRStruct ph_det_lpFilterI, ph_det_lpFilterQ, ph_det_lpFilterFreq;
#endif
void demodulator_setup(void);
void demodulator_sample_buffer_demodulate(fractional *buffer, detector_symbol* outsymbol);
symbol find_constellation_center_values(symbol *constellation);
int16_t get_angular_frequency(uint16_t frequency);
void demodulator_prepare_constellation_symbols(symbol *constellation, detector_symbol *demod_constellation);
detector_symbol demodulator_find_min_symbol_distance(detector_symbol *demod_constellation);
uint8_t demodulator_most_frequent_value(uint8_t *serie, uint8_t range, uint8_t len);
uint8_t demodulator_find_nearest_symbol(detector_symbol *in_symbol, detector_symbol *target_constellation, detector_symbol *moderror);
fractional demodulator_phase_detector(fractional sig_in);
fractional demodulator_frequency_detector(fractional phase);
fractional _Q15atan2circle(fractional Y, fractional X);
void FIR_init(void);
#endif /* DEMODULATOR_H */