mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-15 12:40:35 +00:00
Add 8 and 16 bits ADC compatibility
This commit is contained in:
parent
8386289984
commit
ecf94f71f1
@ -37,7 +37,6 @@
|
|||||||
#include <gnuradio/blocks/file_source.h>
|
#include <gnuradio/blocks/file_source.h>
|
||||||
#include <gnuradio/blocks/file_sink.h>
|
#include <gnuradio/blocks/file_sink.h>
|
||||||
#include <gnuradio/blocks/throttle.h>
|
#include <gnuradio/blocks/throttle.h>
|
||||||
#include <gnuradio/blocks/packed_to_unpacked_ii.h>
|
|
||||||
#include <gnuradio/blocks/deinterleave.h>
|
#include <gnuradio/blocks/deinterleave.h>
|
||||||
#include <gnuradio/blocks/null_sink.h>
|
#include <gnuradio/blocks/null_sink.h>
|
||||||
#include <gnuradio/blocks/endian_swap.h>
|
#include <gnuradio/blocks/endian_swap.h>
|
||||||
|
@ -31,8 +31,7 @@
|
|||||||
|
|
||||||
#include "unpack_spir_gss6450_samples.h"
|
#include "unpack_spir_gss6450_samples.h"
|
||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
|
||||||
unpack_spir_gss6450_samples_sptr make_unpack_spir_gss6450_samples(unsigned int adc_nbit)
|
unpack_spir_gss6450_samples_sptr make_unpack_spir_gss6450_samples(unsigned int adc_nbit)
|
||||||
{
|
{
|
||||||
@ -45,33 +44,17 @@ unpack_spir_gss6450_samples::unpack_spir_gss6450_samples(unsigned int adc_nbit)
|
|||||||
gr::io_signature::make(1, 1, sizeof(gr_complex)), 16 / adc_nbit)
|
gr::io_signature::make(1, 1, sizeof(gr_complex)), 16 / adc_nbit)
|
||||||
{
|
{
|
||||||
adc_bits = adc_nbit;
|
adc_bits = adc_nbit;
|
||||||
i_data = 0;
|
|
||||||
q_data = 0;
|
|
||||||
samples_per_int = 16 / adc_bits;
|
samples_per_int = 16 / adc_bits;
|
||||||
if(adc_bits == 2)
|
i_data.resize(adc_bits, false);
|
||||||
{
|
q_data.resize(adc_bits, false);
|
||||||
mask_data = 0x00000003;
|
adc_bits_two_pow = static_cast<int>(std::exp2(adc_bits));
|
||||||
map_ = {0, 1, -2, -1};
|
two_compl_thres = adc_bits_two_pow / 2;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mask_data = 0x0000000F;
|
|
||||||
map_ = {0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unpack_spir_gss6450_samples::~unpack_spir_gss6450_samples()
|
unpack_spir_gss6450_samples::~unpack_spir_gss6450_samples()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void unpack_spir_gss6450_samples::process_sample(gr_complex& out)
|
|
||||||
{
|
|
||||||
out = gr_complex(0.5, 0.5);
|
|
||||||
compute_two_complement(i_data);
|
|
||||||
compute_two_complement(q_data);
|
|
||||||
out += gr_complex(static_cast<float>(i_data), static_cast<float>(q_data));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int unpack_spir_gss6450_samples::work(int noutput_items,
|
int unpack_spir_gss6450_samples::work(int noutput_items,
|
||||||
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
|
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
|
||||||
@ -80,16 +63,19 @@ int unpack_spir_gss6450_samples::work(int noutput_items,
|
|||||||
gr_complex* out = reinterpret_cast<gr_complex*>(output_items[0]);
|
gr_complex* out = reinterpret_cast<gr_complex*>(output_items[0]);
|
||||||
unsigned int n_sample = 0;
|
unsigned int n_sample = 0;
|
||||||
unsigned int in_counter = 0;
|
unsigned int in_counter = 0;
|
||||||
|
std::bitset<32> bs;
|
||||||
for(int i = 0; i < noutput_items; i++)
|
for(int i = 0; i < noutput_items; i++)
|
||||||
{
|
{
|
||||||
int sample_aux = in[in_counter];
|
bs = in[in_counter];
|
||||||
int aux_i = sample_aux;
|
|
||||||
int aux_q = sample_aux;
|
|
||||||
int i_shift = adc_bits * 2 * (samples_per_int - n_sample - 1) + adc_bits;
|
int i_shift = adc_bits * 2 * (samples_per_int - n_sample - 1) + adc_bits;
|
||||||
int q_shift = adc_bits * 2 * (samples_per_int - n_sample - 1);
|
int q_shift = adc_bits * 2 * (samples_per_int - n_sample - 1);
|
||||||
i_data = (aux_i >> i_shift) & mask_data;
|
for(unsigned int k = 0; k < adc_bits; k++)
|
||||||
q_data = (aux_q >> q_shift) & mask_data;
|
{
|
||||||
process_sample(out[samples_per_int * in_counter + samples_per_int - n_sample - 1]);
|
i_data[k] = bs[i_shift + k];
|
||||||
|
q_data[k] = bs[q_shift + k];
|
||||||
|
}
|
||||||
|
out[i] = gr_complex(static_cast<float>(compute_two_complement(i_data.to_ulong())) + 0.5,
|
||||||
|
static_cast<float>(compute_two_complement(q_data.to_ulong())) + 0.5);
|
||||||
n_sample++;
|
n_sample++;
|
||||||
if(n_sample == samples_per_int)
|
if(n_sample == samples_per_int)
|
||||||
{
|
{
|
||||||
@ -100,7 +86,10 @@ int unpack_spir_gss6450_samples::work(int noutput_items,
|
|||||||
return noutput_items;
|
return noutput_items;
|
||||||
}
|
}
|
||||||
|
|
||||||
void unpack_spir_gss6450_samples::compute_two_complement(int& data)
|
int unpack_spir_gss6450_samples::compute_two_complement(unsigned long data)
|
||||||
{
|
{
|
||||||
data = map_[data];
|
int res = 0;
|
||||||
|
if( static_cast<int>(data) < two_compl_thres) { res = static_cast<int>(data); }
|
||||||
|
else { res = static_cast<int>(data) - adc_bits_two_pow; }
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include <gnuradio/sync_interpolator.h>
|
#include <gnuradio/sync_interpolator.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <boost/dynamic_bitset.hpp>
|
||||||
|
|
||||||
class unpack_spir_gss6450_samples;
|
class unpack_spir_gss6450_samples;
|
||||||
|
|
||||||
@ -51,14 +52,14 @@ public:
|
|||||||
~unpack_spir_gss6450_samples();
|
~unpack_spir_gss6450_samples();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
int compute_two_complement(unsigned long data);
|
||||||
|
|
||||||
unsigned int adc_bits;
|
unsigned int adc_bits;
|
||||||
unsigned int samples_per_int;
|
unsigned int samples_per_int;
|
||||||
void process_sample(gr_complex& out);
|
int two_compl_thres;
|
||||||
void compute_two_complement(int& data);
|
int adc_bits_two_pow;
|
||||||
int i_data;
|
boost::dynamic_bitset<> i_data;
|
||||||
int q_data;
|
boost::dynamic_bitset<> q_data;
|
||||||
int mask_data;
|
|
||||||
std::vector<int> map_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user