- Working clock drift correction

- Improved gradient decoding
pull/61/head
Pieter Robyns 2017-08-25 12:38:00 +02:00
rodzic de587b1d33
commit 1bf5399f05
4 zmienionych plików z 99 dodań i 28 usunięć

Wyświetl plik

@ -22,6 +22,27 @@ def fetch(l, num):
del l[0:num]
return fet
def iphase(cpx):
return np.unwrap(np.angle(cpx))
def ifreq(cpx):
global fs
iphase_signal = iphase(cpx)
return np.diff(iphase_signal)
def add_plot_complex(fig, pos, value, title='', grid=False, grid_spacing=8192):
ax = fig.add_subplot(pos)
ax.set_title(title)
ax.plot(np.arange(len(value)), np.real(value), "b", np.arange(len(value)), np.imag(value), "g")
if grid:
ax.grid(color='r', linestyle='-', linewidth=2, markevery=grid_spacing, axis='x', which='minor', alpha=0.5)
minor_ticks = np.arange(0, len(value), grid_spacing)
ax.set_xticks(minor_ticks, minor=True)
ax.set_xlim([0, len(value)])
ax.set_xlabel("samples")
return ax
class State:
READ_HEADER = 0
READ_DATA = 1
@ -68,6 +89,7 @@ class Plotter(Thread):
data = bytearray()
data_len = 0
draw_over = False
fig = plt.figure()
while True:
plt.pause(0.0001)
@ -86,7 +108,9 @@ class Plotter(Thread):
plot_data = np.frombuffer(fetch(data, data_len), dtype=np.complex64)
if not draw_over:
plt.gcf().clear()
plt.plot(np.arange(len(plot_data)), np.real(plot_data), "b", np.arange(len(plot_data)), np.imag(plot_data), "g")
add_plot_complex(fig, 211, plot_data, grid=True)
add_plot_complex(fig, 212, ifreq(plot_data), grid=True)
#plt.plot(np.arange(len(plot_data)), np.real(plot_data), "b", np.arange(len(plot_data)), np.imag(plot_data), "g")
self.state = State.READ_HEADER
except ConnectionResetError:
print("[gr-lora analyzer]: connection reset")

Wyświetl plik

@ -65,7 +65,13 @@ namespace gr {
}
// Set whitening sequence
this->d_whitening_sequence = gr::lora::prng_payload;
if(sf == 11) {
this->d_whitening_sequence = gr::lora::prng_payload_sf11;
} else if(sf == 12) {
this->d_whitening_sequence = gr::lora::prng_payload_sf12;
} else {
this->d_whitening_sequence = gr::lora::prng_payload;
}
if (sf == 6) {
std::cerr << "[LoRa Decoder] WARNING : Spreading factor wrapped around to 12 due to incompatibility in hardware!" << std::endl;
@ -77,6 +83,10 @@ namespace gr {
this->d_debug.open("/tmp/grlora_debug_txt", std::ios::out);
#endif
#ifndef NDEBUG
d_dbg.attach();
#endif
this->d_bw = 125000u;
this->d_cr = 4;
this->d_samples_per_second = samp_rate;
@ -135,9 +145,6 @@ namespace gr {
// Whitening empty file
// DBGR_QUICK_TO_FILE("/tmp/whitening_out", false, g, -1, "");
#ifndef NDEBUG
d_dbg.attach();
#endif
d_fine_sync = 0;
}
@ -164,7 +171,10 @@ namespace gr {
this->d_upchirp.resize(this->d_samples_per_symbol);
this->d_downchirp_ifreq.resize(this->d_samples_per_symbol);
this->d_upchirp_ifreq.resize(this->d_samples_per_symbol);
gr_complex tmp[this->d_samples_per_symbol*3];
this->d_upchirp_ifreq_v.resize(this->d_samples_per_symbol*3);
this->d_upchirp_stored.resize(this->d_samples_per_symbol*3);
this->d_downchirp_stored.resize(this->d_samples_per_symbol);
const double T = -0.5 * this->d_bw * this->d_symbols_per_second;
const double f0 = (this->d_bw / 2.0);
@ -188,9 +198,10 @@ namespace gr {
samples_to_file("/tmp/upchirp", &this->d_upchirp[0], this->d_upchirp.size(), sizeof(gr_complex));
// Values
memcpy(&d_upchirp_ifreq_v[0], &d_upchirp_ifreq[0], sizeof(float) * this->d_samples_per_symbol);
memcpy(&d_upchirp_ifreq_v[0]+this->d_samples_per_symbol, &d_upchirp_ifreq[0], sizeof(float) * this->d_samples_per_symbol);
memcpy(&d_upchirp_ifreq_v[0]+this->d_samples_per_symbol*2, &d_upchirp_ifreq[0], sizeof(float) * this->d_samples_per_symbol);
memcpy(tmp, &d_upchirp[0], sizeof(gr_complex) * this->d_samples_per_symbol);
memcpy(tmp+this->d_samples_per_symbol, &d_upchirp[0], sizeof(gr_complex) * this->d_samples_per_symbol);
memcpy(tmp+this->d_samples_per_symbol*2, &d_upchirp[0], sizeof(gr_complex) * this->d_samples_per_symbol);
this->instantaneous_frequency(tmp, &this->d_upchirp_ifreq_v[0], this->d_samples_per_symbol*3);
}
void decoder_impl::values_to_file(const std::string path, const unsigned char *v, const uint32_t length, const uint32_t ppm) {
@ -304,6 +315,12 @@ namespace gr {
return result;
}
float decoder_impl::cross_correlate_fast(const gr_complex *samples, const gr_complex *ideal_chirp, const uint32_t window) {
gr_complex result = 0;
volk_32fc_x2_conjugate_dot_prod_32fc(&result, samples, ideal_chirp, window);
return abs(result);
}
/**
* Currently unused.
*/
@ -340,10 +357,9 @@ namespace gr {
return result;
}
void decoder_impl::fine_sync(const gr_complex* in_samples, uint32_t bin_idx) {
int32_t shift_ref = bin_idx * this->d_decim_factor;
void decoder_impl::fine_sync(const gr_complex* in_samples, uint32_t bin_idx, int32_t search_space) {
int32_t shift_ref = (bin_idx+1) * this->d_decim_factor;
//shift_ref = std::max(shift_ref + (int32_t)(this->d_decim_factor / 2), 0);
int32_t search_space = this->d_decim_factor; // At most d_decim_factor samples offset
float samples_ifreq[d_samples_per_symbol];
float max_correlation = 0.0f;
int32_t lag = 0;
@ -351,7 +367,8 @@ namespace gr {
this->instantaneous_frequency(in_samples, samples_ifreq, d_samples_per_symbol);
for(int32_t i = -search_space+1; i < search_space; i++) {
float c = cross_correlate_ifreq_fast(samples_ifreq, &d_upchirp_ifreq_v[shift_ref+i+d_samples_per_symbol], d_samples_per_symbol-1);
//float c = cross_correlate_fast(in_samples, &d_upchirp_stored[shift_ref+i+d_samples_per_symbol], d_samples_per_symbol);
float c = cross_correlate_ifreq_fast(samples_ifreq, &d_upchirp_ifreq_v[shift_ref+i+d_samples_per_symbol], d_samples_per_symbol);
if(c > max_correlation) {
max_correlation = c;
lag = i;
@ -361,6 +378,10 @@ namespace gr {
d_debug << "FINE: " << -lag << std::endl;
d_fine_sync = -lag;
//if(abs(d_fine_sync) >= d_decim_factor / 2)
// d_fine_sync = 0;
//d_fine_sync = 0;
}
float decoder_impl::detect_preamble_autocorr(const gr_complex *samples, const uint32_t window) {
@ -460,7 +481,7 @@ namespace gr {
// Multiply with ideal downchirp
for (uint32_t i = 0u; i < this->d_samples_per_symbol; i++) {
this->d_mult_hf[i] = std::conj(samples[i] * this->d_downchirp[i]);
this->d_mult_hf[i] = samples[i] * this->d_downchirp[i];
}
samples_to_file("/tmp/mult", &this->d_mult_hf[0], this->d_samples_per_symbol, sizeof(gr_complex));
@ -498,25 +519,31 @@ namespace gr {
uint32_t decoder_impl::max_frequency_gradient_idx(const gr_complex *samples, const bool is_header) {
float samples_ifreq[this->d_samples_per_symbol];
float samples_ifreq_avg[this->d_number_of_bins];
samples_to_file("/tmp/data", &samples[0], this->d_samples_per_symbol, sizeof(gr_complex));
this->instantaneous_frequency(samples, samples_ifreq, this->d_samples_per_symbol);
for(uint32_t i = 0; i < d_number_of_bins; i++) {
volk_32f_accumulator_s32f(&samples_ifreq_avg[i], &samples_ifreq[i*d_decim_factor], d_decim_factor);
samples_ifreq_avg[i] /= d_decim_factor;
}
float max_gradient = 0.2f;
float gradient = 0.0f;
uint32_t max_index = 0;
for (uint32_t i = 1u; i < this->d_number_of_bins; i++) {
int32_t index_1 = (this->d_decim_factor * i) - this->d_decim_factor / 2;
int32_t index_2 = (this->d_decim_factor * (i + 1u)) - this->d_decim_factor / 2;
gradient = samples_ifreq[index_1] - samples_ifreq[index_2];
gradient = samples_ifreq_avg[i - 1] - samples_ifreq_avg[i];
if (gradient > max_gradient) {
max_gradient = gradient;
max_index = i;
}
}
return this->d_number_of_bins - max_index;
max_index += 1;
return (this->d_number_of_bins - max_index) % this->d_number_of_bins;
}
bool decoder_impl::demodulate(const gr_complex *samples, const bool is_header) {
@ -526,9 +553,7 @@ namespace gr {
uint32_t bin_idx = this->max_frequency_gradient_idx(samples, is_header);
//uint32_t bin_idx = this->get_shift_fft(samples);
fine_sync(samples, bin_idx);
if(abs(d_fine_sync) >= d_decim_factor / 2)
d_fine_sync = 0;
fine_sync(samples, bin_idx, 4);
// DBGR_INTERMEDIATE_TIME_MEASUREMENT();
@ -594,6 +619,9 @@ namespace gr {
void decoder_impl::decode(uint8_t *out_data, const bool is_header) {
static const uint8_t shuffle_pattern[] = {5, 0, 1, 2, 4, 3, 6, 7};
if (!is_header)
this->values_to_file("/tmp/before_deshuffle", &this->d_demodulated[0], this->d_demodulated.size(), 8);
this->deshuffle(shuffle_pattern, is_header);
// For determining whitening sequence
@ -819,7 +847,7 @@ namespace gr {
float correlation = detect_preamble_autocorr(input, d_samples_per_symbol);
if (correlation >= 0.80f) {
this->samples_to_file("/tmp/detect", &input[0], this->d_samples_per_symbol, sizeof(gr_complex));
//this->samples_to_file("/tmp/detect", &input[0], this->d_samples_per_symbol, sizeof(gr_complex));
this->d_corr_fails = 0u;
this->d_state = gr::lora::DecoderState::SYNC;
break;
@ -838,6 +866,11 @@ namespace gr {
this->d_debug << "Cu: " << correlation << std::endl;
#endif
this->samples_to_file("/tmp/detect", &input[i], this->d_samples_per_symbol, sizeof(gr_complex));
memcpy(&d_upchirp_stored[0], input+i, sizeof(gr_complex) * this->d_samples_per_symbol);
memcpy(&d_upchirp_stored[d_samples_per_symbol], input+i, sizeof(gr_complex) * this->d_samples_per_symbol);
memcpy(&d_upchirp_stored[d_samples_per_symbol*2], input+i, sizeof(gr_complex) * this->d_samples_per_symbol);
this->consume_each(i);
this->d_state = gr::lora::DecoderState::FIND_SFD;
break;
@ -851,18 +884,21 @@ namespace gr {
#endif
if (c > 0.99f) {
d_dbg.store_samples(input, this->d_samples_per_symbol);
memcpy(&d_downchirp_stored[0], input, sizeof(gr_complex) * this->d_samples_per_symbol);
#ifndef NDEBUG
this->d_debug << "SYNC: " << c << std::endl;
#endif
// Debug stuff
this->samples_to_file("/tmp/sync", input, this->d_samples_per_symbol, sizeof(gr_complex));
d_dbg.analyze_samples(false, false);
//printf("---------------------- SYNC! with %f\n", c);
this->d_state = gr::lora::DecoderState::PAUSE;
} else {
if(c < -0.95) {
fine_sync(input, 0);
if(c < -0.98) {
fine_sync(input, d_number_of_bins-1, 64);
} else {
this->d_corr_fails++;
}
@ -875,7 +911,7 @@ namespace gr {
}
}
this->consume_each(this->d_samples_per_symbol+d_fine_sync);
this->consume_each((int32_t)this->d_samples_per_symbol+d_fine_sync);
break;
}
@ -915,7 +951,7 @@ namespace gr {
this->msg_raw_chirp_debug(raw_input, this->d_samples_per_symbol);
//samples_debug(input, d_samples_per_symbol);
this->consume_each(this->d_samples_per_symbol+d_fine_sync);
this->consume_each((int32_t)this->d_samples_per_symbol+d_fine_sync);
break;
}
@ -948,7 +984,7 @@ namespace gr {
this->msg_raw_chirp_debug(raw_input, this->d_samples_per_symbol);
//samples_debug(input, d_samples_per_symbol);
this->consume_each(this->d_samples_per_symbol+d_fine_sync);
this->consume_each((int32_t)this->d_samples_per_symbol+d_fine_sync);
break;
}

Wyświetl plik

@ -77,6 +77,8 @@ namespace gr {
std::vector<float> d_upchirp_ifreq; ///< The instantaneous frequency of the ideal upchirp.
std::vector<float> d_upchirp_ifreq_v; ///< The instantaneous frequency of the ideal upchirp.
std::vector<gr_complex> d_upchirp_stored; ///< The complex stored upchirp.
std::vector<gr_complex> d_downchirp_stored; ///< The complex stored upchirp.
std::vector<gr_complex> d_fft; ///< Vector containing the FFT resuls.
std::vector<gr_complex> d_mult_hf; ///< Vector containing the FFT decimation.
@ -119,7 +121,8 @@ namespace gr {
double d_dt; ///< Indicates how fast the frequency changes in a symbol (chirp).
float cross_correlate_ifreq_fast(const float *samples_ifreq, const float *ideal_chirp, const uint32_t window);
void fine_sync(const gr_complex* in_samples, uint32_t bin_idx);
float cross_correlate_fast(const gr_complex* samples, const gr_complex* ideal_chirp, const uint32_t window);
void fine_sync(const gr_complex* in_samples, uint32_t bin_idx, int32_t search_space);
int32_t d_fine_sync;
float detect_preamble_autocorr(const gr_complex *samples, uint32_t window);

Wyświetl plik

@ -35,10 +35,18 @@ namespace gr {
* Whitening sequence
*/
const uint8_t prng_payload[] = {
0xff, 0xff, 0x2d, 0xff, 0x78, 0xff, 0xe1, 0xff, 0x00, 0xff, 0xd2, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x66, 0x00, 0x1e, 0xd2, 0xff, 0x55, 0x2d, 0x4b, 0x78, 0x66, 0xe1, 0x1e, 0xd2, 0xff, 0x87, 0x2d, 0xcc, 0x78, 0xaa, 0xe1, 0xb4, 0xd2, 0x99, 0x87, 0xe1, 0xcc, 0x00, 0xaa, 0x00, 0xb4, 0x00, 0x99, 0x00, 0xe1, 0xd2, 0x00, 0x55, 0x00, 0x99, 0x00, 0xe1, 0x00, 0xd2, 0xd2, 0x87, 0x55, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0xd2, 0xe1, 0x87, 0xd2, 0x1e, 0x55, 0x2d, 0x99, 0x78, 0x33, 0xe1, 0x55, 0xd2, 0x4b, 0x55, 0x66, 0x99, 0x1e, 0x33, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x66, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x78, 0xd2, 0xe1, 0x87, 0x00, 0xcc, 0x00, 0x78, 0x00, 0x33, 0xd2, 0x55, 0x87, 0x99, 0xcc, 0x33, 0x78, 0x55, 0x33, 0x99, 0x55, 0x33, 0x99, 0x87, 0x33, 0xcc, 0x55, 0xaa, 0x99, 0x66, 0x33, 0x1e, 0x87, 0x2d, 0xcc, 0x78, 0xaa, 0x33, 0x66, 0x55, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0x00, 0x33, 0x00, 0x55, 0xd2, 0x99, 0x55, 0xe1, 0x4b, 0x00, 0xb4, 0x00, 0x4b, 0xd2, 0x66, 0x55, 0xcc, 0x4b, 0xaa, 0xb4, 0x66, 0x4b, 0xcc, 0x66, 0xaa, 0xcc, 0xb4, 0xaa, 0x4b, 0x66, 0x66, 0xcc, 0xcc, 0xaa, 0x78, 0xb4, 0x33, 0x4b, 0x55, 0x66, 0x4b, 0xcc, 0x66, 0x78, 0xcc, 0x33, 0x78, 0x55, 0xe1, 0x4b, 0x00, 0x66, 0xd2, 0xcc, 0x87, 0x78, 0x1e, 0xe1, 0xff, 0x00, 0xff, 0xd2, 0x2d, 0x87, 0xaa, 0x1e, 0x66, 0xff, 0xcc, 0xff, 0xaa, 0x2d, 0x66, 0xaa, 0x1e, 0x66, 0xff, 0xcc, 0x2d, 0xaa, 0xaa, 0x66, 0xb4, 0x1e, 0x4b, 0xff, 0x66, 0x2d, 0x1e, 0xaa, 0x2d, 0xb4, 0xaa, 0x4b, 0xb4, 0x66, 0x99, 0x1e, 0xe1, 0x2d, 0xd2, 0xaa, 0x55, 0xb4, 0x99, 0x99, 0xe1, 0xe1, 0x00, 0xd2, 0xd2, 0x55, 0x87, 0x99, 0xcc, 0xe1, 0xaa, 0x00, 0x66, 0xd2, 0xcc, 0x87, 0x78, 0xcc, 0xe1, 0xaa, 0xd2, 0x66, 0x87, 0xcc, 0x1e, 0x78, 0xff, 0xe1, 0x2d, 0xd2, 0x78, 0x87, 0x33, 0x1e, 0x87, 0xff, 0x1e, 0x2d, 0x2d, 0x78, 0x78, 0x33, 0x33, 0x87, 0x87, 0x1e, 0xcc, 0x2d, 0x78, 0x78, 0xe1, 0x33, 0xd2, 0x87, 0x55, 0xcc, 0x4b, 0x78, 0x66, 0xe1, 0xcc, 0xd2, 0xaa, 0x55, 0xb4, 0x4b, 0x99, 0x66, 0x33, 0xcc, 0x55, 0xaa, 0x99, 0xb4, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x55, 0x4b, 0x99, 0xb4, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x55, 0x4b, 0x4b, 0xb4, 0xb4, 0x99, 0x4b, 0x33, 0xb4, 0x55, 0x99, 0x4b, 0x33, 0xb4, 0x87, 0x4b, 0x1e, 0xb4, 0x2d, 0x99, 0xaa, 0x33, 0x66, 0xc7, 0x1e, 0x1e, 0x2d, 0x2d, 0xaa, 0xaa, 0x66, 0x66, 0xcc, 0x1e, 0x78, 0x2d, 0x33, 0xaa, 0x87, 0x66, 0x1e, 0xcc, 0xff, 0x78, 0x2d, 0x33, 0xaa, 0x87, 0x66, 0x1e, 0x1e, 0xff, 0xff, 0x2d, 0xff, 0xaa, 0xff, 0x66, 0x2d, 0x1e, 0xaa, 0xff, 0xb4, 0xff, 0x99, 0xff, 0x33, 0x2d, 0x87, 0xaa, 0xcc, 0xb4, 0x78, 0x99, 0x33, 0x33, 0x87, 0x87, 0xcc, 0xcc, 0xaa, 0x78, 0xb4, 0x33, 0x4b, 0x87, 0xb4, 0xcc, 0x99, 0xaa, 0xe1, 0xb4, 0xd2, 0x4b, 0x87, 0xb4, 0xcc, 0x99, 0x78, 0xe1, 0xe1, 0xd2, 0x00, 0x87, 0x00, 0xcc, 0xd2, 0x78, 0x87, 0xe1, 0x1e, 0x00, 0x2d, 0x00, 0xaa, 0xd2, 0xb4, 0x87, 0x4b, 0x1e, 0xb4, 0x2d, 0x4b, 0xaa, 0xb4, 0xb4, 0x4b, 0x4b, 0x66, 0xb4, 0x1e, 0x4b, 0xff, 0xb4, 0xff, 0x4b, 0x2d, 0x66, 0x78, 0x1e, 0x33, 0xff, 0x55, 0xff, 0x4b, 0x2d, 0xb4, 0x78, 0x99, 0x33, 0xe1, 0x55, 0x00, 0x4b, 0xd2, 0xb4, 0x55, 0x99, 0x99, 0xe1, 0x33, 0x00, 0x87, 0xd2, 0x1e, 0x55, 0xff, 0x99, 0xff, 0x33, 0xff, 0x87, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x87, 0xe1, 0xaa, 0xcc,
0xff, 0xff, 0x2d, 0xff, 0x78, 0xff, 0xe1, 0xff, 0x00, 0xff, 0xd2, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x66, 0x00, 0x1e, 0xd2, 0xff, 0x55, 0x2d, 0x4b, 0x78, 0x66, 0xe1, 0x1e, 0xd2, 0xff, 0x87, 0x2d, 0xcc, 0x78, 0xaa, 0xe1, 0xb4, 0xd2, 0x99, 0x87, 0xe1, 0xcc, 0x00, 0xaa, 0x00, 0xb4, 0x00, 0x99, 0x00, 0xe1, 0xd2, 0x00, 0x55, 0x00, 0x99, 0x00, 0xe1, 0x00, 0xd2, 0xd2, 0x87, 0x55, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0xd2, 0xe1, 0x87, 0xd2, 0x1e, 0x55, 0x2d, 0x99, 0x78, 0x33, 0xe1, 0x55, 0xd2, 0x4b, 0x55, 0x66, 0x99, 0x1e, 0x33, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x66, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x78, 0xd2, 0xe1, 0x87, 0x00, 0xcc, 0x00, 0x78, 0x00, 0x33, 0xd2, 0x55, 0x87, 0x99, 0xcc, 0x33, 0x78, 0x55, 0x33, 0x99, 0x55, 0x33, 0x99, 0x87, 0x33, 0xcc, 0x55, 0xaa, 0x99, 0x66, 0x33, 0x1e, 0x87, 0x2d, 0xcc, 0x78, 0xaa, 0x33, 0x66, 0x55, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0x00, 0x33, 0x00, 0x55, 0xd2, 0x99, 0x55, 0xe1, 0x4b, 0x00, 0xb4, 0x00, 0x4b, 0xd2, 0x66, 0x55, 0xcc, 0x4b, 0xaa, 0xb4, 0x66, 0x4b, 0xcc, 0x66, 0xaa, 0xcc, 0xb4, 0xaa, 0x4b, 0x66, 0x66, 0xcc, 0xcc, 0xaa, 0x78, 0xb4, 0x33, 0x4b, 0x55, 0x66, 0x4b, 0xcc, 0x66, 0x78, 0xcc, 0x33, 0x78, 0x55, 0xe1, 0x4b, 0x00, 0x66, 0xd2, 0xcc, 0x87, 0x78, 0x1e, 0xe1, 0xff, 0x00, 0xff, 0xd2, 0x2d, 0x87, 0xaa, 0x1e, 0x66, 0xff, 0xcc, 0xff, 0xaa, 0x2d, 0x66, 0xaa, 0x1e, 0x66, 0xff, 0xcc, 0x2d, 0xaa, 0xaa, 0x66, 0xb4, 0x1e, 0x4b, 0xff, 0x66, 0x2d, 0x1e, 0xaa, 0x2d, 0xb4, 0xaa, 0x4b, 0xb4, 0x66, 0x99, 0x1e, 0xe1, 0x2d, 0xd2, 0xaa, 0x55, 0xb4, 0x99, 0x99, 0xe1, 0xe1, 0x00, 0xd2, 0xd2, 0x55, 0x87, 0x99, 0xcc, 0xe1, 0xaa, 0x00, 0x66, 0xd2, 0xcc, 0x87, 0x78, 0xcc, 0xe1, 0xaa, 0xd2, 0x66, 0x87, 0xcc, 0x1e, 0x78, 0xff, 0xe1, 0x2d, 0xd2, 0x78, 0x87, 0x33, 0x1e, 0x87, 0xff, 0x1e, 0x2d, 0x2d, 0x78, 0x78, 0x33, 0x33, 0x87, 0x87, 0x1e, 0xcc, 0x2d, 0x78, 0x78, 0xe1, 0x33, 0xd2, 0x87, 0x55, 0xcc, 0x4b, 0x78, 0x66, 0xe1, 0xcc, 0xd2, 0xaa, 0x55, 0xb4, 0x4b, 0x99, 0x66, 0x33, 0xcc, 0x55, 0xaa, 0x99, 0xb4, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x55, 0x4b, 0x99, 0xb4, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x55, 0x4b, 0x4b, 0xb4, 0xb4, 0x99, 0x4b, 0x33, 0xb4, 0x55, 0x99, 0x4b, 0x33, 0xb4, 0x87, 0x4b, 0x1e, 0xb4, 0x2d, 0x99, 0xaa, 0x33, 0x66, 0x87, 0x1e, 0x1e, 0x2d, 0x2d, 0xaa, 0xaa, 0x66, 0x66, 0xcc, 0x1e, 0x78, 0x2d, 0x33, 0xaa, 0x87, 0x66, 0x1e, 0xcc, 0xff, 0x78, 0x2d, 0x33, 0xaa, 0x87, 0x66, 0x1e, 0x1e, 0xff, 0xff, 0x2d, 0xff, 0xaa, 0xff, 0x66, 0x2d, 0x1e, 0xaa, 0xff, 0xb4, 0xff, 0x99, 0xff, 0x33, 0x2d, 0x87, 0xaa, 0xcc, 0xb4, 0x78, 0x99, 0x33, 0x33, 0x87, 0x87, 0xcc, 0xcc, 0xaa, 0x78, 0xb4, 0x33, 0x4b, 0x87, 0xb4, 0xcc, 0x99, 0xaa, 0xe1, 0xb4, 0xd2, 0x4b, 0x87, 0xb4, 0xcc, 0x99, 0x78, 0xe1, 0xe1, 0xd2, 0x00, 0x87, 0x00, 0xcc, 0xd2, 0x78, 0x87, 0xe1, 0x1e, 0x00, 0x2d, 0x00, 0xaa, 0xd2, 0xb4, 0x87, 0x4b, 0x1e, 0xb4, 0x2d, 0x4b, 0xaa, 0xb4, 0xb4, 0x4b, 0x4b, 0x66, 0xb4, 0x1e, 0x4b, 0xff, 0xb4, 0xff, 0x4b, 0x2d, 0x66, 0x78, 0x1e, 0x33, 0xff, 0x55, 0xff, 0x4b, 0x2d, 0xb4, 0x78, 0x99, 0x33, 0xe1, 0x55, 0x00, 0x4b, 0xd2, 0xb4, 0x55, 0x99, 0x99, 0xe1, 0x33, 0x00, 0x87, 0xd2, 0x1e, 0x55, 0xff, 0x99, 0xff, 0x33, 0xff, 0x87, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x87, 0xe1, 0xaa, 0xcc,
/*0xff, 0xff, 0x2e, 0xff, 0x5c, 0xff, 0xe8, 0xff, 0x00, 0xff, 0xd1, 0x2e, 0x72, 0x5c, 0x65, 0xe8, 0x4b, 0x00, 0x17, 0xd1, 0xff, 0x72, 0x2e, 0x65, 0x5c, 0x4b, 0xe8, 0x17, 0xd1, 0xff, 0xa3, 0x2e, 0xc6, 0x5c, 0x8d, 0xe8, 0x9a, 0xd1, 0xb4, 0xa3, 0xe8, 0xc6, 0x00, 0x8d, 0x00, 0x9a, 0x00, 0xb4, 0x00, 0xe8, 0xd1, 0x00, 0x72, 0x00, 0xb4, 0x00, 0xe8, 0x00, 0xd1, 0xd1, 0xa3, 0x72, 0x17, 0xb4, 0x2e, 0xe8, 0x5c, 0xd1, 0xe8, 0xa3, 0xd1, 0x17, 0x72, 0x2e, 0xb4, 0x5c, 0x39, 0xe8, 0x72, 0xd1, 0x65, 0x72, 0x4b, 0xb4, 0x17, 0x39, 0x2e, 0x72, 0x5c, 0x65, 0xe8, 0x4b, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x5c, 0xd1, 0xe8, 0xa3, 0x00, 0xc6, 0x00, 0x5c, 0x00, 0x39, 0xd1, 0x72, 0xa3, 0xb4, 0xc6, 0x39, 0x5c, 0x72, 0x39, 0xb4, 0x72, 0x39, 0xb4, 0xa3, 0x39, 0xc6, 0x72, 0x8d, 0xb4, 0x4b, 0x39, 0x17, 0xa3, 0x2e, 0xc6, 0x5c, 0x8d, 0x39, 0x4b, 0x72, 0x17, 0xb4, 0x2e, 0xe8, 0x5c, 0x00, 0x39, 0x00, 0x72, 0xd1, 0xb4, 0x72, 0xe8, 0x65, 0x00, 0x9a, 0x00, 0x65, 0xd1, 0x4b, 0x72, 0xc6, 0x65, 0x8d, 0x9a, 0x4b, 0x65, 0xc6, 0x4b, 0x8d, 0xc6, 0x9a, 0x8d, 0x65, 0x4b, 0x4b, 0xc6, 0xc6, 0x8d, 0x5c, 0x9a, 0x39, 0x65, 0x72, 0x4b, 0x65, 0xc6, 0x4b, 0x5c, 0xc6, 0x39, 0x5c, 0x72, 0xe8, 0x65, 0x00, 0x4b, 0xd1, 0xc6, 0xa3, 0x5c, 0x17, 0xe8, 0xff, 0x00, 0xff, 0xd1, 0x2e, 0xa3, 0x8d, 0x17, 0x4b, 0xff, 0xc6, 0xff, 0x8d, 0x2e, 0x4b, 0x8d, 0x17, 0x4b, 0xff, 0xc6, 0x2e, 0x8d, 0x8d, 0x4b, 0x9a, 0x17, 0x65, 0xff, 0x4b, 0x2e, 0x17, 0x8d, 0x2e, 0x9a, 0x8d, 0x65, 0x9a, 0x4b, 0xb4, 0x17, 0xe8, 0x2e, 0xd1, 0x8d, 0x72, 0x9a, 0xb4, 0xb4, 0xe8, 0xe8, 0x00, 0xd1, 0xd1, 0x72, 0xa3, 0xb4*/
};
const uint8_t prng_payload_sf11[] = {
0xff, 0xff, 0x2d, 0xff, 0x78, 0xf9, 0xe5, 0xdf, 0x00, 0xee, 0x80, 0x7f, 0xd2, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x42, 0x00, 0x36, 0x80, 0x5e, 0xd2, 0xff, 0x55, 0x2d, 0x49, 0x74, 0x4a, 0xe9, 0x26, 0xa1, 0x1e, 0x52, 0xff, 0x87, 0x2d, 0xca, 0x70, 0x8c, 0xe9, 0xaa, 0xa0, 0x34, 0xd2, 0x99, 0x87, 0xe1, 0xca, 0x00, 0x8c, 0x20, 0xaa, 0x00, 0x34, 0x80, 0x99, 0x00, 0xe1, 0xd2, 0x04, 0x5b, 0x00, 0x94, 0x00, 0x19, 0x00, 0xe1, 0x00, 0xd0, 0xd0, 0x83, 0x53, 0x26, 0x84, 0x1f, 0x59, 0xad, 0xe1, 0x78, 0xd0, 0xe1, 0x83, 0xd0, 0x26, 0x42, 0x1f, 0x55, 0xad, 0x99, 0x78, 0x31, 0xe3, 0x53, 0xd8, 0x65, 0x42, 0x0a, 0x15, 0xe6, 0x99, 0x1e, 0x31, 0x29, 0x53, 0x54, 0x65, 0xe8, 0x0b, 0x61, 0xe6, 0x00, 0x1e, 0x00, 0x29, 0x04, 0x5c, 0xe0, 0xe8, 0x93, 0x21, 0x07, 0x00, 0xcc, 0x00, 0x7a, 0x04, 0x19, 0xc0, 0x72, 0x92, 0x15, 0x07, 0x99, 0xcc, 0x31, 0x78, 0x57, 0x19, 0x85, 0x62, 0x18, 0x55, 0xb3, 0x99, 0x87, 0x31, 0xc8, 0x57, 0x84, 0x85, 0x7a, 0x19, 0x66, 0x33, 0x1e, 0x87, 0x2d, 0xc8, 0x74, 0x84, 0x29, 0x7a, 0x32, 0x26, 0xd5, 0x1e, 0x99, 0x2d, 0xe1, 0x70, 0x08, 0x09, 0x10, 0x33, 0x00, 0xd5, 0xd2, 0x99, 0x55, 0xe1, 0x45, 0x00, 0xaa, 0x10, 0x34, 0x00, 0xcb, 0xd2, 0x66, 0x55, 0xca, 0x41, 0x8c, 0x8a, 0x6a, 0x35, 0x66, 0x4b, 0xcc, 0x66, 0xa8, 0xca, 0xb2, 0x84, 0x65, 0x7a, 0x0b, 0x26, 0x66, 0xcc, 0xcc, 0xa8, 0x7a, 0xb2, 0x19, 0x65, 0x62, 0x0a, 0x15, 0xe6, 0x4b, 0xcc, 0x64, 0x7a, 0xc6, 0x11, 0x6c, 0x62, 0xb8, 0x55, 0x61, 0x4b, 0x00, 0x64, 0xd2, 0xc6, 0x83, 0x4c, 0x06, 0xb9, 0x1e, 0xe1, 0xff, 0x00, 0xfd, 0xd2, 0x27, 0x83, 0xac, 0x06, 0x2a, 0x5e, 0x66, 0xff, 0xcc, 0xfd, 0xaa, 0x27, 0x4a, 0xac, 0x36, 0x2b, 0x5e, 0xe6, 0xff, 0xcc, 0x2d, 0xaa, 0xa0, 0x42, 0xaa, 0x36, 0x35, 0x1e, 0x4b, 0xff, 0x66, 0x2d, 0x1a, 0xa0, 0x07, 0xaa, 0xbc, 0x35, 0x2a, 0x4b, 0xb4, 0x66, 0x99, 0x1a, 0xe1, 0x0f, 0xc0, 0xac, 0x13, 0x6a, 0x55, 0xb4, 0x99, 0x99, 0xe3, 0xe1, 0x00, 0xc0, 0xd0, 0x12, 0x52, 0xd5, 0x87, 0x99, 0xcc, 0xe1, 0xa0, 0x00, 0x4a, 0xc0, 0xa6, 0x12, 0x4c, 0x87, 0x78, 0xcc, 0xe3, 0xa4, 0xd8, 0x4a, 0x92, 0xa6, 0x07, 0x4c, 0x1e, 0x78, 0xfd, 0xe1, 0x27, 0xd0, 0x6c, 0x92, 0x38, 0x07, 0xb3, 0x1e, 0x87, 0xfd, 0x1a, 0x27, 0x07, 0x6c, 0x6c, 0x38, 0x78, 0x33, 0x33, 0x87, 0x85, 0x18, 0xc2, 0x0f, 0x6c, 0x7c, 0xb8, 0x78, 0x61, 0x33, 0xd2, 0x85, 0x51, 0xc6, 0x45, 0x6c, 0x5a, 0xb8, 0x26, 0xe1, 0xcc, 0xd2, 0xa8, 0x51, 0xb6, 0x45, 0x85, 0x5a, 0x19, 0x66, 0x33, 0xcc, 0x55, 0xa8, 0x9b, 0xb6, 0xc9, 0x85, 0xf0, 0x18, 0x12, 0x33, 0x55, 0x55, 0x49, 0x9b, 0xb6, 0xc9, 0xa5, 0xf0, 0x19, 0x52, 0xb3, 0x55, 0x55, 0x49, 0x49, 0xb2, 0x92, 0x85, 0x64, 0x18, 0x0b, 0x33, 0xb4, 0x55, 0x99, 0x4b, 0x35, 0x9a, 0x83, 0x74, 0x06, 0x0b, 0x1e, 0xb4, 0x2d, 0x99, 0xa8, 0x31, 0x42, 0xa3, 0x26, 0x07, 0x5e, 0x9e, 0x2d, 0x2d, 0xa8, 0xa8, 0x66, 0x42, 0xe6, 0x36, 0x0c, 0x1e, 0xf8, 0x2d, 0x33, 0xa8, 0x81, 0x62, 0x16, 0xc6, 0xce, 0x0c, 0x3f, 0x78, 0x2d, 0x33, 0xa8, 0x81, 0x62, 0x1e, 0x06, 0xde, 0x9f, 0x3f, 0xff, 0x2d, 0xff, 0xa8, 0xfb, 0x66, 0x0f, 0x06, 0xbc, 0x9e, 0x2a, 0x7f, 0xb4, 0xff, 0x99, 0xf9, 0x35, 0x07, 0x83, 0xbc, 0x87, 0x6a, 0x4c, 0xb4, 0x78, 0x99, 0x33, 0x31, 0x8b, 0x83, 0xc6, 0x87, 0x4c, 0x4c, 0xaa, 0x78, 0xb4, 0x31, 0x41, 0x83, 0xaa, 0xc6, 0xb5, 0x4c,
};
const uint8_t prng_payload_sf12[] = {
0xff, 0xff, 0x2d, 0xff, 0x78, 0xfd, 0xe3, 0xf7, 0x00, 0xcf, 0xc0, 0x3f, 0x12, 0xad, 0x55, 0x78, 0x4b, 0xe1, 0x62, 0x04, 0x1e, 0xe0, 0xde, 0x13, 0x7f, 0xd5, 0x2d, 0x4b, 0x78, 0x64, 0xe1, 0x12, 0xd0, 0xcf, 0x82, 0x3e, 0x07, 0x2d, 0xcc, 0x78, 0xaa, 0xe1, 0xb2, 0xd4, 0x9d, 0x83, 0xd8, 0x86, 0x21, 0x4c, 0x00, 0xaa, 0x00, 0xb4, 0x02, 0x91, 0x00, 0xc9, 0xd0, 0x20, 0x52, 0x80, 0x55, 0x00, 0x99, 0x00, 0xe1, 0x00, 0xd8, 0xc0, 0x92, 0x13, 0x07, 0xd5, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0xd0, 0xc1, 0x83, 0xe0, 0x06, 0x12, 0x1e, 0x55, 0x2d, 0x99, 0x78, 0x33, 0xe1, 0x53, 0xc0, 0x54, 0x12, 0x4b, 0xd5, 0x66, 0x99, 0x1e, 0x31, 0x29, 0x53, 0x54, 0x65, 0xe8, 0x0b, 0x61, 0xe6, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x74, 0xd0, 0xc9, 0x92, 0x21, 0x47, 0x00, 0xcc, 0x00, 0x78, 0x00, 0x31, 0xd0, 0x5b, 0xa3, 0x94, 0x86, 0x59, 0x4c, 0x33, 0x78, 0x55, 0x31, 0x9b, 0x53, 0x11, 0x85, 0xb2, 0x18, 0x47, 0xb3, 0xcc, 0x55, 0xaa, 0x99, 0x60, 0x35, 0x16, 0x83, 0x1e, 0x87, 0x6d, 0x4c, 0x78, 0xaa, 0x33, 0x64, 0x53, 0x12, 0x95, 0x2f, 0xd8, 0x2d, 0x21, 0x78, 0x00, 0x33, 0x00, 0x55, 0xd2, 0x95, 0x5b, 0xc9, 0x54, 0x20, 0x0b, 0x00, 0xb4, 0x00, 0x4b, 0xd0, 0x60, 0x53, 0xce, 0x45, 0x9c, 0x8b, 0x2a, 0xb4, 0x66, 0x4b, 0xcc, 0x64, 0xa8, 0xc6, 0x82, 0x8c, 0x64, 0x2b, 0x4b, 0x66, 0x66, 0xcc, 0xcc, 0xa8, 0x78, 0xb6, 0x19, 0x45, 0x62, 0x0a, 0x55, 0xe6, 0x4b, 0xcc, 0x66, 0x78, 0xc8, 0x35, 0x54, 0x63, 0xf8, 0x14, 0x21, 0xcb, 0x00, 0x66, 0xd2, 0xcc, 0x83, 0x70, 0x16, 0xe9, 0xde, 0x21, 0x3f, 0x00, 0xff, 0xd2, 0x2d, 0x85, 0xa8, 0x12, 0x4a, 0xef, 0xf6, 0xbe, 0x4c, 0x7f, 0xaa, 0x2d, 0x66, 0xa8, 0x1a, 0x66, 0xdf, 0xc6, 0x3e, 0x8c, 0x2d, 0x2a, 0xaa, 0x66, 0xb4, 0x1c, 0x4b, 0xf7, 0x42, 0x2f, 0x26, 0xac, 0x5e, 0x2a, 0x2d, 0xb4, 0xaa, 0x49, 0xb2, 0x66, 0x9d, 0x26, 0xd8, 0x1f, 0x61, 0xad, 0xd2, 0xaa, 0x55, 0xb4, 0x9b, 0x95, 0xc1, 0xe9, 0x20, 0xa0, 0x40, 0x52, 0xd2, 0x55, 0x87, 0x99, 0xc8, 0xe1, 0x8c, 0x00, 0x7a, 0x81, 0x26, 0xd2, 0xcc, 0x87, 0x78, 0xcc, 0xe1, 0xa0, 0xd0, 0x6a, 0x82, 0xa7, 0x47, 0xcc, 0x1e, 0x78, 0xff, 0xe1, 0x2b, 0xd0, 0x5c, 0xa3, 0x28, 0x06, 0x33, 0x9e, 0x87, 0xff, 0x1e, 0x2d, 0x2b, 0x70, 0x54, 0x09, 0x38, 0xb2, 0x73, 0x87, 0x87, 0x1e, 0xcc, 0x2d, 0x78, 0x70, 0xc9, 0x29, 0xf0, 0xb2, 0x52, 0x07, 0x55, 0xcc, 0x4b, 0x78, 0x60, 0xe1, 0xce, 0xe0, 0x9c, 0x12, 0x6a, 0x55, 0xb4, 0x4b, 0x99, 0x64, 0x31, 0xc2, 0x53, 0xac, 0x84, 0xab, 0x59, 0xb4, 0xe1, 0x99, 0xd2, 0x31, 0x51, 0x57, 0x4d, 0x85, 0x8a, 0x98, 0x74, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x51, 0x45, 0x45, 0x8a, 0x9a, 0xb5, 0x74, 0x19, 0x4b, 0x33, 0xb4, 0x55, 0x9b, 0x41, 0x19, 0x8a, 0xa2, 0x35, 0x47, 0x4b, 0x1e, 0xb4, 0x2d, 0x99, 0xaa, 0x31, 0x4a, 0x83, 0x26, 0x07, 0x5e, 0x1e, 0x2d, 0x2d, 0xaa, 0xa8, 0x62, 0x62, 0xc6, 0x26, 0x5c, 0x1f, 0x38, 0x2d, 0x33, 0xaa, 0x87, 0x64, 0x1a, 0xc6, 0xd7, 0x6c, 0x2e, 0x38, 0x6d, 0x33, 0xaa, 0x87, 0x66, 0x1c, 0x18, 0xf7, 0xdf, 0x0f, 0xee, 0xac, 0x7f, 0xaa, 0xff, 0x66, 0x2d, 0x1c, 0xaa, 0xf7, 0x9a, 0xef, 0xb4, 0xbf, 0x59, 0xff, 0x33, 0x2d, 0x87, 0xa8, 0xca, 0xb6, 0x5c, 0xa5, 0x38, 0x19, 0x73, 0xb3, 0x87, 0x87, 0xcc, 0xcc, 0xa8, 0x74, 0x92, 0x29, 0x74, 0xb2, 0x0b, 0x87, 0xb4, 0xcc, 0x99, 0xa8, 0xe1, 0xb2, 0xd8, 0x65, 0x92, 0x8a, 0x47, 0x34,
};
}
}