21#ifndef INCLUDED_LORA_DECODER_IMPL_H
22#define INCLUDED_LORA_DECODER_IMPL_H
24#include <liquid/liquid.h>
32#include <boost/circular_buffer.hpp>
73 std::vector<gr_complex> d_downchirp;
74 std::vector<float> d_downchirp_ifreq;
76 std::vector<gr_complex> d_upchirp;
77 std::vector<float> d_upchirp_ifreq;
78 std::vector<float> d_upchirp_ifreq_v;
80 std::vector<gr_complex> d_fft;
81 std::vector<gr_complex> d_mult_hf;
82 std::vector<gr_complex> d_tmp;
90 double d_bits_per_second;
91 uint32_t d_delay_after_sync;
92 uint32_t d_samples_per_second;
93 double d_symbols_per_second;
94 double d_bits_per_symbol;
95 uint32_t d_samples_per_symbol;
97 uint32_t d_number_of_bins;
98 uint32_t d_number_of_bins_hdr;
99 int32_t d_payload_symbols;
100 uint32_t d_payload_length;
101 uint32_t d_corr_fails;
102 float d_energy_threshold;
104 boost::circular_buffer<float> d_pwr_queue;
106 std::vector<uint32_t> d_words;
107 std::vector<uint8_t> d_demodulated;
108 std::vector<uint8_t> d_words_deshuffled;
109 std::vector<uint8_t> d_words_dewhitened;
110 std::vector<uint8_t> d_decoded;
112 std::ofstream d_debug_samples;
113 std::ofstream d_debug;
119 uint32_t d_decim_factor;
120 float d_cfo_estimation;
122 bool d_enable_fine_sync;
128 float cross_correlate_ifreq_fast(
const float *samples_ifreq,
const float *ideal_chirp,
const uint32_t window);
133 float cross_correlate_fast(
const gr_complex* samples,
const gr_complex* ideal_chirp,
const uint32_t window);
138 void fine_sync(
const gr_complex* in_samples, int32_t bin_idx, int32_t search_space);
143 float detect_preamble_autocorr(
const gr_complex *samples, uint32_t window);
148 float experimental_determine_cfo(
const gr_complex *samples, uint32_t window);
153 void build_ideal_chirps(
void);
167 void samples_to_file(
const std::string path,
const gr_complex *v,
const uint32_t length,
const uint32_t elem_size);
181 void values_to_file(
const std::string path,
const unsigned char *v,
const uint32_t length,
const uint32_t ppm);
191 void samples_debug(
const gr_complex *v,
const uint32_t length);
204 float sliding_norm_cross_correlate_upchirp(
const float *samples_ifreq,
const uint32_t window, int32_t *index);
214 float detect_downchirp(
const gr_complex *samples,
const uint32_t window);
228 float detect_upchirp(
const gr_complex *samples,
const uint32_t window, int32_t *index);
240 float cross_correlate(
const gr_complex *samples_1,
const gr_complex *samples_2,
const uint32_t window);
253 float cross_correlate_ifreq(
const float *samples_ifreq,
const std::vector<float>& ideal_chirp,
const uint32_t to_idx);
261 uint32_t get_shift_fft(
const gr_complex *samples);
269 void determine_cfo(
const gr_complex *samples);
277 float determine_energy(
const gr_complex *samples);
282 void determine_snr();
290 uint32_t max_frequency_gradient_idx(
const gr_complex *samples);
300 bool demodulate(
const gr_complex *samples,
const bool reduced_rate);
308 void deinterleave(
const uint32_t ppm);
319 void decode(
const bool is_header);
329 void deshuffle(
const uint8_t *shuffle_pattern,
const bool is_header);
337 void dewhiten(
const uint8_t *prng);
347 void hamming_decode(
bool is_header);
355 void extract_data_only(
bool is_header);
365 void hamming_decode_soft(
bool is_header);
378 float stddev(
const float *values,
const uint32_t len,
const float mean);
390 inline void instantaneous_phase(
const gr_complex *in_samples,
float *out_iphase,
const uint32_t window);
402 inline void instantaneous_frequency(
const gr_complex *in_samples,
float *out_ifreq,
const uint32_t window);
407 void msg_lora_frame(
void);
418 decoder_impl(
float samp_rate, uint32_t bandwidth, uint8_t
sf,
bool implicit, uint8_t
cr,
bool crc,
bool reduced_rate,
bool disable_drift_correction);
437 gr_vector_const_void_star& input_items,
438 gr_vector_void_star& output_items);
Return the DecoderState as string for debugging purposes.
Definition: decoder_impl.h:68
virtual void set_samp_rate(const float samp_rate)
Set the current sample rate. Currently not supported, restart GNU Radio with different settings inst...
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
The main method called by GNU Radio to perform tasks on the given input.
virtual void set_sf(const uint8_t sf)
Set th current spreading factor. Currently not supported, restart GNU Radio with different settings ...
decoder_impl(float samp_rate, uint32_t bandwidth, uint8_t sf, bool implicit, uint8_t cr, bool crc, bool reduced_rate, bool disable_drift_correction)
Default constructor.
<+description of block+>
Definition: decoder.h:693
cr
Definition: loraphy.h:23
loraphy_header_t
Definition: loraphy.h:32
sf
Definition: loratap.h:33
DecoderState
DecoderState : Each state the LoRa decoder can be in.
Definition: decoder_impl.h:40
Definition: channelizer.h:28