summaryrefslogtreecommitdiff
path: root/gr-blocks/lib/complex_to_interleaved_char_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-blocks/lib/complex_to_interleaved_char_impl.cc')
-rw-r--r--gr-blocks/lib/complex_to_interleaved_char_impl.cc24
1 files changed, 13 insertions, 11 deletions
diff --git a/gr-blocks/lib/complex_to_interleaved_char_impl.cc b/gr-blocks/lib/complex_to_interleaved_char_impl.cc
index d875ce9772..a60a3d9675 100644
--- a/gr-blocks/lib/complex_to_interleaved_char_impl.cc
+++ b/gr-blocks/lib/complex_to_interleaved_char_impl.cc
@@ -14,21 +14,26 @@
#include "complex_to_interleaved_char_impl.h"
#include <gnuradio/io_signature.h>
+#include <volk/volk.h>
namespace gr {
namespace blocks {
-complex_to_interleaved_char::sptr complex_to_interleaved_char::make(bool vector)
+complex_to_interleaved_char::sptr complex_to_interleaved_char::make(bool vector,
+ float scale_factor)
{
- return gnuradio::get_initial_sptr(new complex_to_interleaved_char_impl(vector));
+ return gnuradio::get_initial_sptr(
+ new complex_to_interleaved_char_impl(vector, scale_factor));
}
-complex_to_interleaved_char_impl::complex_to_interleaved_char_impl(bool vector)
+complex_to_interleaved_char_impl::complex_to_interleaved_char_impl(bool vector,
+ float scale_factor)
: sync_interpolator(
"complex_to_interleaved_char",
io_signature::make(1, 1, sizeof(gr_complex)),
io_signature::make(1, 1, vector ? 2 * sizeof(char) : sizeof(char)),
vector ? 1 : 2),
+ d_scalar(scale_factor),
d_vector(vector)
{
}
@@ -37,14 +42,11 @@ int complex_to_interleaved_char_impl::work(int noutput_items,
gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items)
{
- const gr_complex* in = (const gr_complex*)input_items[0];
- char* out = (char*)output_items[0];
-
- int npairs = (d_vector ? noutput_items : noutput_items / 2);
- for (int i = 0; i < npairs; i++) {
- *out++ = (char)lrintf(in[i].real()); // FIXME saturate?
- *out++ = (char)lrintf(in[i].imag());
- }
+ const float* in = (const float*)input_items[0];
+ int8_t* out = (int8_t*)output_items[0];
+
+ volk_32f_s32f_convert_8i(
+ out, in, d_scalar, d_vector ? noutput_items * 2 : noutput_items);
return noutput_items;
}