Hi Joel - IIRC UHD takes and provides std::complex<float> values that are
in (-1.0,+1.0), meaning that the minimum (most negative) value is
-1.0+epsilon and the maximum (most positive) value is 1.0-epsilon, where
"epsilon" is the smallest positive 32-bit float value (approximately
1.17549e-38).

If you're looking just for conversion from sc16 (aka
"std::complex<int16_t>") to std::complex<float> in C++ (note that "float"
is 32-bits in C++), you could do something like the following (which should
work with pretty much any C++ standard):

{{{
#include <complex>
#include <limits>
#include <sys/types.h>

static float scale_factor = float(1) /
   float(std::min(int16_t(-std::numeric_limits<int16_t>::min()),
           std::numeric_limits<int16_t>::max()));

std::complex<float> sc16_to_float (const std::complex<int16_t>& input) {
    return std::complex<float>
      (std::real(input) * scale_factor,
       std::imag (input) * scale_factor);
}
}}}

There are, obviously, more efficient ways to do this. I believe that VOLK
provides CPU optimized functions something along the lines of the above
code. Hope this is useful! - MLD

On Fri, Sep 6, 2019 at 8:47 AM J Subash via USRP-users <
usrp-users@lists.ettus.com> wrote:

> Hi Imad,
>
>
> Thanks very much for your reply. Unfortunately that solution does not
> work.
>
> Because if it reads 4 bytes (two int16_t in C/C++ parlance; <i2 in numpy
> world) which for argument sake holds 15, 16 (which are integers). These are
> then cast as floats which makes them 15.0 and 16.0 and then when viewed as
> np.complex64 becomes 15.0 + 16.0j.
>
>
> I have had a look at the converters section in the uhd API (
> https://github.com/EttusResearch/uhd/tree/master/host/lib/convert) but
> can't get my head around the code.
>
>
> Thanks.
>
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to