/* -*- c++ -*- */ /* * Copyright 2023 jmfriedt. * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "m17_decoder_impl.h" #include #include #include #include #include #include "../M17_Implementations/SP5WWP/lib/lib.h" #include "../M17_Implementations/SP5WWP/lib/math/golay.h" #include "../M17_Implementations/SP5WWP/lib/payload/crc.h" #include "../M17_Implementations/SP5WWP/lib/payload/call.h" #include "../M17_Implementations/SP5WWP/lib/phy/sync.h" #include "../M17_Implementations/SP5WWP/lib/decode/viterbi.h" #include "../M17_Implementations/SP5WWP/lib/payload/lsf.h" #include "../M17_Implementations/SP5WWP/lib/phy/interleave.h" #include "../M17_Implementations/SP5WWP/lib/phy/randomize.h" #include "../M17_Implementations/SP5WWP/lib/decode/symbols.h" #include "../M17_Implementations/SP5WWP/lib/encode/symbols.h" #include "../M17_Implementations/SP5WWP/lib/encode/convol.h" #include "../M17_Implementations/SP5WWP/lib/math/math.h" #define DECODE_CALLSIGNS //#define SHOW_VITERBI_ERRS // #define CODE_MEAN -0.75 // mean(str_sync_symbols) #define CODE_STD 8.21583836f //std(str_sync_symbols)*sqrt(length(str_sync_symbols)-1) namespace gr { namespace m17 { m17_decoder::sptr m17_decoder::make(bool debug_data,bool debug_ctrl,float threshold) { return gnuradio::get_initial_sptr (new m17_decoder_impl(debug_data,debug_ctrl,threshold)); } /* * The private constructor */ m17_decoder_impl::m17_decoder_impl(bool debug_data,bool debug_ctrl,float threshold) : gr::block("m17_decoder", gr::io_signature::make(1, 1, sizeof(float)), gr::io_signature::make(1, 1, sizeof(char))), _debug_data(debug_data), _debug_ctrl(debug_ctrl), _threshold(threshold) {set_debug_data(debug_data); set_debug_ctrl(debug_ctrl); set_threshold(threshold); } /* * Our virtual destructor. */ m17_decoder_impl::~m17_decoder_impl() { } void m17_decoder_impl::set_threshold(float threshold) {_threshold=threshold; printf("Threshold: %f\n",_threshold); } void m17_decoder_impl::set_debug_data(bool debug) {_debug_data=debug; if (_debug_data==true) printf("Data debug: true\n"); else printf("Data debug: false\n"); } void m17_decoder_impl::set_debug_ctrl(bool debug) {_debug_ctrl=debug; if (_debug_ctrl==true) printf("Debug control: true\n"); else printf("Debug control: false\n"); } void m17_decoder_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) { ninput_items_required[0] = 0; // noutput_items; } int m17_decoder_impl::general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const float *in = (const float *) input_items[0]; char *out = (char *) output_items[0]; int countout=0; float sample; //last raw sample from the stdin float dist; //Euclidean distance for finding syncwords in the symbol stream for (int counterin=0;counterin=symbol_map[3]) { soft_bit[i*2+1]=0xFFFF; } else if(pld[i]>=symbol_map[2]) { soft_bit[i*2+1]=-(float)0xFFFF/(symbol_map[3]-symbol_map[2])*symbol_map[2]+pld[i]*(float)0xFFFF/(symbol_map[3]-symbol_map[2]); } else if(pld[i]>=symbol_map[1]) { soft_bit[i*2+1]=0x0000; } else if(pld[i]>=symbol_map[0]) { soft_bit[i*2+1]=(float)0xFFFF/(symbol_map[1]-symbol_map[0])*symbol_map[1]-pld[i]*(float)0xFFFF/(symbol_map[1]-symbol_map[0]); } else { soft_bit[i*2+1]=0xFFFF; } //bit 1 if(pld[i]>=symbol_map[2]) { soft_bit[i*2]=0x0000; } else if(pld[i]>=symbol_map[1]) { soft_bit[i*2]=0x7FFF-pld[i]*(float)0xFFFF/(symbol_map[2]-symbol_map[1]); } else { soft_bit[i*2]=0xFFFF; } } //derandomize for(uint16_t i=0; i>(7-(i%8)))&1) //soft XOR. flip soft bit if "1" soft_bit[i]=0xFFFF-soft_bit[i]; } //deinterleave for(uint16_t i=0; i>5; lich_chunks_rcvd|=(1<