mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2025-02-14 10:00:11 +00:00
Removing unused code
This commit is contained in:
parent
2697fb6198
commit
aefe47cd7a
@ -32,7 +32,6 @@
|
||||
|
||||
#include "geojson_printer.h"
|
||||
#include <ctime>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
#include <glog/logging.h>
|
||||
|
@ -33,7 +33,6 @@
|
||||
#ifndef GNSS_SDR_GEOJSON_PRINTER_H_
|
||||
#define GNSS_SDR_GEOJSON_PRINTER_H_
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
@ -32,7 +32,6 @@
|
||||
#define GNSS_SDR_GPS_L1_CA_LS_PVT_H_
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include "ls_pvt.h"
|
||||
|
@ -37,11 +37,14 @@
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
//#ifndef GNSS_SDR_CONVOLUTIONAL_H_
|
||||
//#define GNSS_SDR_CONVOLUTIONAL_H_
|
||||
/* define constants used throughout the library */
|
||||
#define MAXLOG 1e7 /* Define infinity */
|
||||
|
||||
#ifndef GNSS_SDR_CONVOLUTIONAL_H_
|
||||
#define GNSS_SDR_CONVOLUTIONAL_H_
|
||||
|
||||
#include <cstdlib> // for calloc
|
||||
|
||||
/* define constants used throughout the library */
|
||||
const float MAXLOG = 1e7; /* Define infinity */
|
||||
|
||||
/*!
|
||||
* \brief Converts an integer symbol into a vector of bits
|
||||
@ -103,7 +106,7 @@ static int parity_counter(int symbol, int length)
|
||||
* \param[out] state_out_p[] An integer containing the final state of the encoder
|
||||
* (i.e. the state after encoding this bit)
|
||||
*
|
||||
* This function is used by rsc_encode(), nsc_transit(), rsc_transit(), and nsc_transit()
|
||||
* This function is used by nsc_transit()
|
||||
*/
|
||||
static int nsc_enc_bit(int state_out_p[],
|
||||
int input,
|
||||
@ -194,169 +197,6 @@ static void nsc_transit(int output_p[],
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Calculates the "transition matrix" for the trellis.
|
||||
* This information tells the decoder what the next state and output bits
|
||||
* will be given the current state and input bit.
|
||||
*
|
||||
* \param[in] input Either 0 or 1 --- the input data bit.
|
||||
* \param[in] g[] A two element vector containing the code generators.
|
||||
* \param[in] KK The constraint length of the convolutional code.
|
||||
* \param[out] output_p[] A vector of length max_states = 2^(KK-1) containing
|
||||
* the output symbols.
|
||||
* \param[out] trans_p[] A vector of length max_states that tells the decoder
|
||||
* what the next state will be given the input and current state.
|
||||
*
|
||||
* This function is used by turbo_decode()
|
||||
*/
|
||||
static void rsc_transit(int output_p[],
|
||||
int trans_p[],
|
||||
int input,
|
||||
int g[],
|
||||
int KK,
|
||||
int nn )
|
||||
{
|
||||
int nextstate[1];
|
||||
int state, states;
|
||||
|
||||
states = 1 << (KK - 1); // The number of states: 2^mm
|
||||
|
||||
// Determine the output and next state for each possible starting state
|
||||
for(state = 0; state < states; state++)
|
||||
{
|
||||
output_p[state] = rsc_enc_bit( nextstate, input, state, g, KK, nn );
|
||||
trans_p[state] = nextstate[0];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \brief determines the tail for a RSC code
|
||||
*/
|
||||
static void rsc_tail(int tail_p[],
|
||||
int g[],
|
||||
int max_states,
|
||||
int mm )
|
||||
{
|
||||
int state;
|
||||
|
||||
/* Determine the tail for each state */
|
||||
for(state = 0; state < max_states; state++)
|
||||
{
|
||||
/* determine feedback word */
|
||||
tail_p[state] = parity_counter(g[0]&state, mm);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Perform convolutional encoding
|
||||
*/
|
||||
static void conv_encode(int output_p[],
|
||||
int input[],
|
||||
int out0[],
|
||||
int state0[],
|
||||
int out1[],
|
||||
int state1[],
|
||||
int tail[],
|
||||
int KK,
|
||||
int LL,
|
||||
int nn)
|
||||
{
|
||||
int i, j, outsym;
|
||||
int *bin_vec;
|
||||
int state = 0;
|
||||
|
||||
/* Negative value in "tail" is a flag that this is
|
||||
a tail-biting NSC code. Determine initial state */
|
||||
|
||||
if ( tail[0] < 0 )
|
||||
{
|
||||
for (i = LL - KK + 1; i < LL; i++)
|
||||
{
|
||||
if (input[i])
|
||||
{
|
||||
/* Determine next state */
|
||||
state = state1[state];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Determine next state */
|
||||
state = state0[state];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bin_vec = (int*)calloc( nn, sizeof(int) );
|
||||
|
||||
/* encode data bits one bit at a time */
|
||||
for (i = 0; i < LL; i++)
|
||||
{
|
||||
if (input[i])
|
||||
{
|
||||
/* Input is a one */
|
||||
outsym = out1[state]; /* The output symbol */
|
||||
|
||||
/* Determine next state */
|
||||
state = state1[state];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Input is a zero */
|
||||
outsym = out0[state]; /* The output symbol */
|
||||
|
||||
/* Determine next state */
|
||||
state = state0[state];
|
||||
}
|
||||
|
||||
/* Convert symbol to a binary vector */
|
||||
itob( bin_vec, outsym, nn );
|
||||
|
||||
/* Assign to output */
|
||||
for (j = 0; j < nn; j++)
|
||||
output_p[nn*i + j] = bin_vec[j];
|
||||
}
|
||||
|
||||
/* encode tail if needed */
|
||||
if (tail[0] >= 0)
|
||||
{
|
||||
for (i = LL; i < LL + KK - 1; i++)
|
||||
{
|
||||
if (tail[state])
|
||||
{
|
||||
/* Input is a one */
|
||||
outsym = out1[state]; /* The output symbol */
|
||||
|
||||
/* Determine next state */
|
||||
state = state1[state];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Input is a zero */
|
||||
outsym = out0[state]; /* The output symbol */
|
||||
|
||||
/* Determine next state */
|
||||
state = state0[state];
|
||||
}
|
||||
|
||||
/* Convert symbol to a binary vector */
|
||||
itob( bin_vec, outsym, nn );
|
||||
|
||||
/* Assign to output */
|
||||
for (j = 0; j < nn; j++)
|
||||
output_p[nn*i + j] = bin_vec[j];
|
||||
}
|
||||
}
|
||||
|
||||
free(bin_vec);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Computes the branch metric used for decoding.
|
||||
* \return (returned float) The metric between the hypothetical symbol and the received vector
|
||||
@ -386,10 +226,10 @@ static float Gamma(float rec_array[],
|
||||
|
||||
/*!
|
||||
* \brief Uses the Viterbi algorithm to perform hard-decision decoding of a convolutional code.
|
||||
* \param[in] out0[] The output bits for each state if input is a 0 (generated by rsc_transit).
|
||||
* \param[in] state0[] The next state if input is a 0 (generated by rsc_transit).
|
||||
* \param[in] out1[] The output bits for each state if input is a 1 (generated by rsc_transit).
|
||||
* \param[in] state1[] The next state if input is a 1 (generated by rsc_transit).
|
||||
* \param[in] out0[] The output bits for each state if input is a 0.
|
||||
* \param[in] state0[] The next state if input is a 0.
|
||||
* \param[in] out1[] The output bits for each state if input is a 1.
|
||||
* \param[in] state1[] The next state if input is a 1.
|
||||
* \param[in] r[] The received signal in LLR-form. For BPSK, must be in form r = 2*a*y/(sigma^2).
|
||||
* \param[in] KK The constraint length of the convolutional code.
|
||||
* \param[in] LL The number of data bits.
|
||||
@ -422,12 +262,12 @@ static void Viterbi(int output_u_int[],
|
||||
number_symbols = 1 << nn; /* 2^nn */
|
||||
|
||||
/* dynamically allocate memory */
|
||||
prev_section = (float*)calloc( states, sizeof(float) );
|
||||
next_section = (float*)calloc( states, sizeof(float) );
|
||||
prev_bit = (int*)calloc( states*(LL + mm), sizeof(int) );
|
||||
prev_state = (int*)calloc( states*(LL + mm), sizeof(int) );
|
||||
rec_array = (float*)calloc( nn, sizeof(float) );
|
||||
metric_c = (float*)calloc( number_symbols, sizeof(float) );
|
||||
prev_section = static_cast<float*>(calloc( states, sizeof(float) ));
|
||||
next_section = static_cast<float*>(calloc( states, sizeof(float) ));
|
||||
prev_bit = static_cast<int*>(calloc( states*(LL + mm), sizeof(int) ));
|
||||
prev_state = static_cast<int*>(calloc( states*(LL + mm), sizeof(int) ));
|
||||
rec_array = static_cast<float*>(calloc( nn, sizeof(float) ));
|
||||
metric_c = static_cast<float*>(calloc( number_symbols, sizeof(float) ));
|
||||
|
||||
/* initialize trellis */
|
||||
for (state = 0; state < states; state++)
|
||||
@ -441,7 +281,7 @@ static void Viterbi(int output_u_int[],
|
||||
for (t = 0; t < LL + mm; t++)
|
||||
{
|
||||
for (i = 0; i < nn; i++)
|
||||
rec_array[i] = (float)input_c[nn*t + i];
|
||||
rec_array[i] = static_cast<float>(input_c[nn*t + i]);
|
||||
|
||||
/* precompute all possible branch metrics */
|
||||
for (i = 0; i < number_symbols; i++)
|
||||
@ -514,148 +354,4 @@ static void Viterbi(int output_u_int[],
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Uses the Viterbi algorithm to perform hard-decision decoding of a tail-biting convolutional code.
|
||||
* Input parameters:
|
||||
* out0[] The output bits for each state if input is a 0 (generated by rsc_transit).
|
||||
* state0[] The next state if input is a 0 (generated by rsc_transit).
|
||||
* out1[] The output bits for each state if input is a 1 (generated by rsc_transit).
|
||||
* state1[] The next state if input is a 1 (generated by rsc_transit).
|
||||
* r[] The received signal in LLR-form. For BPSK, must be in form r = 2*a*y/(sigma^2).
|
||||
* KK The constraint length of the convolutional code.
|
||||
* LL The number of data bits.
|
||||
* depth head and tail decoding length [Ref. W. Sung, Electronics Letters, vol. 36, no. 7]
|
||||
* Output parameters:
|
||||
* output_u_int[] Hard decisions on the data bits
|
||||
*/
|
||||
static void ViterbiTb(int output_u_int[],
|
||||
int out0[],
|
||||
int state0[],
|
||||
int out1[],
|
||||
int state1[],
|
||||
double input_c[],
|
||||
int KK,
|
||||
int nn,
|
||||
int LL,
|
||||
int depth)
|
||||
{
|
||||
int i, t, state, mm, states, max_state;
|
||||
int number_symbols, starting_bit;
|
||||
float metric;
|
||||
float *prev_section, *next_section;
|
||||
int *prev_bit;
|
||||
int *prev_state;
|
||||
float *metric_c; /* Set of all possible branch metrics */
|
||||
float *rec_array; /* Received values for one trellis section */
|
||||
float max_val;
|
||||
|
||||
/* some derived constants */
|
||||
mm = KK - 1;
|
||||
states = 1 << mm; /* 2^mm */
|
||||
number_symbols = 1 << nn; /* 2^nn */
|
||||
|
||||
/* dynamically allocate memory */
|
||||
prev_section = (float*)calloc( states, sizeof(float) );
|
||||
next_section = (float*)calloc( states, sizeof(float) );
|
||||
prev_bit = (int*)calloc( states*(LL + depth), sizeof(int) );
|
||||
prev_state = (int*)calloc( states*(LL + depth), sizeof(int) );
|
||||
rec_array = (float*)calloc( nn, sizeof(float) );
|
||||
metric_c = (float*)calloc( number_symbols, sizeof(float) );
|
||||
|
||||
/* initialize trellis */
|
||||
for (state = 0; state < states; state++)
|
||||
{
|
||||
prev_section[state] = 0; /* equally likely starting state */
|
||||
next_section[state] = -MAXLOG;
|
||||
}
|
||||
|
||||
/* go through trellis */
|
||||
for (t = -depth; t < LL + depth; t++)
|
||||
{
|
||||
/* determine the corresponding data bits */
|
||||
starting_bit = nn*(t % LL);
|
||||
if (starting_bit < 0 )
|
||||
starting_bit = nn*LL + starting_bit;
|
||||
|
||||
for (i = 0; i < nn; i++)
|
||||
{
|
||||
rec_array[i] = (float)input_c[starting_bit+i];
|
||||
}
|
||||
|
||||
/* precompute all possible branch metrics */
|
||||
for (i = 0; i < number_symbols; i++)
|
||||
metric_c[i] = Gamma( rec_array, i, nn );
|
||||
|
||||
/* step through all states */
|
||||
for (state = 0; state < states; state++)
|
||||
{
|
||||
/* hypothesis: info bit is a zero */
|
||||
metric = prev_section[state] + metric_c[ out0[ state ] ];
|
||||
|
||||
/* store new metric if more than metric in storage */
|
||||
if ( metric > next_section[state0[state]] )
|
||||
{
|
||||
next_section[state0[state]] = metric;
|
||||
if (t >= 0)
|
||||
{
|
||||
prev_state[t*states+state0[state]] = state;
|
||||
prev_bit[t*states+state0[state]] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* hypothesis: info bit is a one */
|
||||
metric = prev_section[state] + metric_c[ out1[ state ] ];
|
||||
|
||||
/* store new metric if more than metric in storage */
|
||||
if ( metric > next_section[state1[state]] )
|
||||
{
|
||||
next_section[state1[state]] = metric;
|
||||
if (t >= 0)
|
||||
{
|
||||
prev_state[t*states+state1[state]] = state;
|
||||
prev_bit[t*states+state1[state]] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* normalize */
|
||||
max_val = 0;
|
||||
for (state = 0; state < states; state++)
|
||||
{
|
||||
if (next_section[state] > max_val)
|
||||
{
|
||||
max_val = next_section[state];
|
||||
max_state = state;
|
||||
}
|
||||
}
|
||||
for (state = 0; state < states; state++)
|
||||
{
|
||||
prev_section[state] = next_section[state] - max_val;
|
||||
next_section[state] = -MAXLOG;
|
||||
}
|
||||
}
|
||||
|
||||
/* trace-back operation */
|
||||
state = max_state;
|
||||
|
||||
/* tail, no need to output */
|
||||
for (t = LL + depth - 1; t >= LL; t--)
|
||||
{
|
||||
state = prev_state[t*states + state];
|
||||
}
|
||||
|
||||
for (t = LL - 1; t >= 0; t--)
|
||||
{
|
||||
output_u_int[t] = prev_bit[t*states + state];
|
||||
state = prev_state[t*states + state];
|
||||
}
|
||||
|
||||
/* free the dynamically allocated memory */
|
||||
free(prev_section);
|
||||
free(next_section);
|
||||
free(prev_bit);
|
||||
free(prev_state);
|
||||
free(rec_array);
|
||||
free(metric_c);
|
||||
}
|
||||
//#endif
|
||||
#endif
|
||||
|
@ -41,7 +41,7 @@
|
||||
#define LMORE 6 // many entries per sample / very specific stuff
|
||||
|
||||
|
||||
#define MAXLOG 1e7 /* Define infinity */
|
||||
const float MAXLOG = 1e7; /* Define infinity */
|
||||
|
||||
Viterbi_Decoder::Viterbi_Decoder(const int g_encoder[], const int KK, const int nn)
|
||||
{
|
||||
@ -59,7 +59,6 @@ Viterbi_Decoder::Viterbi_Decoder(const int g_encoder[], const int KK, const int
|
||||
d_state0 = new int[d_states];
|
||||
d_state1 = new int[d_states];
|
||||
|
||||
|
||||
nsc_transit(d_out0, d_state0, 0, g_encoder, d_KK, d_nn);
|
||||
nsc_transit(d_out1, d_state1, 1, g_encoder, d_KK, d_nn);
|
||||
|
||||
@ -68,6 +67,7 @@ Viterbi_Decoder::Viterbi_Decoder(const int g_encoder[], const int KK, const int
|
||||
Viterbi_Decoder::init_trellis_state();
|
||||
}
|
||||
|
||||
|
||||
Viterbi_Decoder::~Viterbi_Decoder()
|
||||
{
|
||||
// trellis definition
|
||||
@ -110,7 +110,7 @@ float Viterbi_Decoder::decode_block(const double input_c[], int output_u_int[],
|
||||
// init
|
||||
init_trellis_state();
|
||||
// do add compare select
|
||||
do_acs(input_c, LL+d_mm);
|
||||
do_acs(input_c, LL + d_mm);
|
||||
// tail, no need to output -> traceback, but don't decode
|
||||
state = do_traceback(d_mm);
|
||||
// traceback and decode
|
||||
@ -207,7 +207,7 @@ int Viterbi_Decoder::do_acs(const double sym[], int nbits)
|
||||
{
|
||||
/* Temporarily store the received symbols current decoding step */
|
||||
for (i = 0; i < d_nn; i++)
|
||||
d_rec_array[i] = (float) sym[d_nn * t + i];
|
||||
d_rec_array[i] = static_cast<float>(sym[d_nn * t + i]);
|
||||
|
||||
/* precompute all possible branch metrics */
|
||||
for (i = 0; i < d_number_symbols; i++)
|
||||
@ -478,15 +478,15 @@ int Viterbi_Decoder::parity_counter(int symbol, int length)
|
||||
Viterbi_Decoder::Prev::Prev(int states, int t)
|
||||
{
|
||||
this->t = t;
|
||||
num_states=states;
|
||||
num_states = states;
|
||||
state = new int[states];
|
||||
bit = new int[states];
|
||||
metric = new float[states];
|
||||
refcount = new int;
|
||||
*refcount = 1;
|
||||
memset(state,0,sizeof(int)*num_states);
|
||||
memset(bit,0,sizeof(int)*num_states);
|
||||
memset(metric,0,sizeof(float)*num_states);
|
||||
memset(state, 0, sizeof(int) * num_states);
|
||||
memset(bit, 0, sizeof(int) * num_states);
|
||||
memset(metric, 0, sizeof(float) * num_states);
|
||||
}
|
||||
|
||||
|
||||
@ -498,7 +498,7 @@ Viterbi_Decoder::Prev::Prev(const Prev& prev)
|
||||
(*refcount)++;
|
||||
t = prev.t;
|
||||
state = prev.state;
|
||||
num_states=prev.num_states;
|
||||
num_states = prev.num_states;
|
||||
bit = prev.bit;
|
||||
metric = prev.metric;
|
||||
VLOG(LMORE) << "Prev(" << "?" << ", " << t << ")" << " copy, new refcount = " << *refcount;
|
||||
@ -567,14 +567,16 @@ Viterbi_Decoder::Prev::~Prev()
|
||||
int Viterbi_Decoder::Prev::get_anchestor_state_of_current_state(int current_state)
|
||||
{
|
||||
//std::cout << "get prev state: for state " << current_state << " at time " << t << ", the prev state at time " << t-1 << " is " << state[current_state] << std::endl;
|
||||
if (num_states>current_state)
|
||||
{
|
||||
return state[current_state];
|
||||
}else{
|
||||
//std::cout<<"alarm "<<"num_states="<<num_states<<" current_state="<<current_state<<std::endl;
|
||||
//return state[current_state];
|
||||
return 0;
|
||||
}
|
||||
if (num_states > current_state)
|
||||
{
|
||||
return state[current_state];
|
||||
}
|
||||
else
|
||||
{
|
||||
//std::cout<<"alarm "<<"num_states="<<num_states<<" current_state="<<current_state<<std::endl;
|
||||
//return state[current_state];
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -582,49 +584,58 @@ int Viterbi_Decoder::Prev::get_anchestor_state_of_current_state(int current_stat
|
||||
int Viterbi_Decoder::Prev::get_bit_of_current_state(int current_state)
|
||||
{
|
||||
//std::cout << "get prev bit : for state " << current_state << " at time " << t << ", the send bit is " << bit[current_state] << std::endl;
|
||||
if (num_states>current_state)
|
||||
{
|
||||
return bit[current_state];
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
if (num_states > current_state)
|
||||
{
|
||||
return bit[current_state];
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
float Viterbi_Decoder::Prev::get_metric_of_current_state(int current_state)
|
||||
{
|
||||
if (num_states>current_state)
|
||||
{
|
||||
return metric[current_state];
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
if (num_states > current_state)
|
||||
{
|
||||
return metric[current_state];
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int Viterbi_Decoder::Prev::get_t()
|
||||
{
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
void Viterbi_Decoder::Prev::set_current_state_as_ancestor_of_next_state(int next_state, int current_state)
|
||||
{
|
||||
if (num_states>next_state)
|
||||
{
|
||||
state[next_state] = current_state;
|
||||
}
|
||||
if (num_states > next_state)
|
||||
{
|
||||
state[next_state] = current_state;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Viterbi_Decoder::Prev::set_decoded_bit_for_next_state(int next_state, int bit)
|
||||
{
|
||||
if (num_states>next_state)
|
||||
{
|
||||
this->bit[next_state] = bit;
|
||||
}
|
||||
if (num_states > next_state)
|
||||
{
|
||||
this->bit[next_state] = bit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Viterbi_Decoder::Prev::set_survivor_branch_metric_of_next_state(int next_state, float metric)
|
||||
{
|
||||
if (num_states>next_state)
|
||||
{
|
||||
this->metric[next_state] = metric;
|
||||
}
|
||||
if (num_states > next_state)
|
||||
{
|
||||
this->metric[next_state] = metric;
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,6 @@
|
||||
#define GNSS_SDR_VITERBI_DECODER_H_
|
||||
|
||||
#include <deque>
|
||||
#include <iostream>
|
||||
|
||||
/*!
|
||||
* \brief Class that implements a Viterbi decoder
|
||||
@ -55,7 +54,6 @@ public:
|
||||
*/
|
||||
float decode_block(const double input_c[], int* output_u_int, const int LL);
|
||||
|
||||
|
||||
float decode_continuous(const double sym[], const int traceback_depth, int output_u_int[],
|
||||
const int nbits_requested, int &nbits_decoded);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user