diff options
author | ghostop14 <ghostop14@gmail.com> | 2020-02-04 18:37:41 -0500 |
---|---|---|
committer | Michael Dickens <michael.dickens@ettus.com> | 2020-02-15 19:20:26 -0500 |
commit | 012870af22ae873b3b998691de8e81752179d266 (patch) | |
tree | d294d2d83b4f94b11922cf2873ebaf473bb36df3 /gr-blocks/lib/correctiq_swapiq_impl.cc | |
parent | f6a346d8b59050b2da520c80f7fab9d85018e350 (diff) |
Blocks: Add DC Spike Removal and IQ Swap Native Blocks
This block incorporates the OOT modules in correctiq that provide
3 different techniques to remove the DC spike inherent in IQ sampling.
The first technique mirrors SDR GUI receivers with an IIR filter
approach, the second provides a time-limited IIR approach where after
a user-configurable number of seconds locks into a basic offset
correction to eliminate the effect of the filter on the signal while
maintaining the correction, and the last is manual I and Q
configurable offsets. The Swap IQ block is a drop-in block to help
correct for inverted spectrums and just swaps I<->Q.
Diffstat (limited to 'gr-blocks/lib/correctiq_swapiq_impl.cc')
-rw-r--r-- | gr-blocks/lib/correctiq_swapiq_impl.cc | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/gr-blocks/lib/correctiq_swapiq_impl.cc b/gr-blocks/lib/correctiq_swapiq_impl.cc new file mode 100644 index 0000000000..dac0fc10fe --- /dev/null +++ b/gr-blocks/lib/correctiq_swapiq_impl.cc @@ -0,0 +1,96 @@ +/* -*- c++ -*- */ +/* + * Copyright 2020 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "correctiq_swapiq_impl.h" +#include <gnuradio/io_signature.h> + +namespace gr { +namespace blocks { + +swap_iq::sptr swap_iq::make(int datatype, int datasize) +{ + return gnuradio::get_initial_sptr(new swap_iq_impl(datatype, datasize)); +} + +/* + * The private constructor + */ +swap_iq_impl::swap_iq_impl(int datatype, int datasize) + : gr::sync_block("swap_iq", + gr::io_signature::make(1, 1, datasize), + gr::io_signature::make(1, 1, datasize)) +{ + d_datatype = datatype; + + if (d_datatype != SWAPTYPE_FLOATCOMPLEX) { + gr::block::set_output_multiple(2); // Make sure we work with pairs + } +} + +/* + * Our virtual destructor. + */ +swap_iq_impl::~swap_iq_impl() {} + +int swap_iq_impl::work(int noutput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ + // Constructor guarantees we'll have pairs. + + long i; + long noi; + + switch (d_datatype) { + case SWAPTYPE_FLOATCOMPLEX: { + noi = noutput_items * 2; // Each complex is 2 floats + const float* in_float = (const float*)input_items[0]; + float* out_float = (float*)output_items[0]; + + for (i = 0; i < noi; i += 2) { + *out_float++ = in_float[i + 1]; + *out_float++ = in_float[i]; + } + } break; + case SWAPTYPE_SHORTCOMPLEX: { + noi = noutput_items; + const int16_t* in_short = (const int16_t*)input_items[0]; + int16_t* out_short = (int16_t*)output_items[0]; + + for (i = 0; i < noi; i += 2) { + *out_short++ = in_short[i + 1]; + *out_short++ = in_short[i]; + } + } break; + case SWAPTYPE_BYTECOMPLEX: { + noi = noutput_items; + const char* in_byte = (const char*)input_items[0]; + char* out_byte = (char*)output_items[0]; + + for (i = 0; i < noi; i += 2) { + *out_byte++ = in_byte[i + 1]; + *out_byte++ = in_byte[i]; + } + } break; + default: { + GR_LOG_ERROR(d_logger, "Unknown data type. Bytes not swapped."); + return WORK_DONE; + } + } + + // Tell runtime system how many output items we produced. + return noutput_items; +} +} /* namespace blocks */ +} /* namespace gr */ |