diff --git a/src/autocast.hh b/src/autocast.hh index cbac8ad..64a0fd5 100644 --- a/src/autocast.hh +++ b/src/autocast.hh @@ -7,7 +7,7 @@ namespace sdr { -/** This class performs some automatic casts to a certain buffer type if possible specified by +/** This class performs some automatic casts to a certain buffer type (if possible) specified by * the template argument. Currently only integer casts are supported. */ template class AutoCast: public SinkBase, public Source @@ -28,9 +28,9 @@ public: // Check type cast combination if (Config::Type_s8 == Traits::scalarId) { switch (src_cfg.type()) { - case Config::Type_u8: + case Config::Type_u8: _cast = _uint8_int8; break; case Config::Type_s8: _cast = _identity; break; - case Config::Type_u16: + case Config::Type_u16: _cast = _uint16_int8; break; case Config::Type_s16: _cast = _int16_int8; break; default: break; } @@ -38,17 +38,19 @@ public: switch (src_cfg.type()) { case Config::Type_u8: _cast = _uint8_cint8; break; case Config::Type_s8: _cast = _int8_cint8; break; - case Config::Type_cu8: _cast = _cuint8_cint8; break; + case Config::Type_cu8: _cast = _uint8_int8; break; case Config::Type_cs8: _cast = _identity; break; - case Config::Type_u16: + case Config::Type_u16: _cast = _uint16_cint8; break; case Config::Type_s16: _cast = _int16_cint8; break; + case Config::Type_cu16: _cast = _uint16_int8; break; + case Config::Type_cs16: _cast = _int16_int8; break; default: break; } } else if (Config::Type_s16 == Traits::scalarId) { switch (src_cfg.type()) { - case Config::Type_u8: + case Config::Type_u8: _cast = _uint8_int16; break; case Config::Type_s8: _cast = _int8_int16; break; - case Config::Type_u16: + case Config::Type_u16: _cast = _uint16_int16; break; case Config::Type_s16: _cast = _identity; break; default: break; } @@ -56,11 +58,11 @@ public: switch (src_cfg.type()) { case Config::Type_u8: _cast = _uint8_cint16; break; case Config::Type_s8: _cast = _int8_cint16; break; - case Config::Type_cu8: _cast = _cuint8_cint16; break; - case Config::Type_cs8: _cast = _cint8_cint16; break; + case Config::Type_cu8: _cast = _uint8_int16; break; + case Config::Type_cs8: _cast = _int8_int16; break; case Config::Type_u16: _cast = _uint16_cint16; break; case Config::Type_s16: _cast = _int16_cint16; break; - case Config::Type_cu16: + case Config::Type_cu16: _cast = _uint16_int16; break; case Config::Type_cs16: _cast = _identity; break; default: break; } @@ -110,11 +112,32 @@ protected: return in.bytesLen(); } + /** uint8_t -> int8_t */ + static size_t _uint8_int8(const RawBuffer &in, const RawBuffer &out) { + size_t N = in.bytesLen(); + for (size_t i=0; i(out.data())[i] = + int16_t(reinterpret_cast(in.data())[i]) - 127; + } + return N; + } + + /** uint16 -> int8 */ + static size_t _uint16_int8(const RawBuffer &in, const RawBuffer &out) { + size_t N = in.bytesLen()/2; + for (size_t i=0; i(out.data())[i] = + int16_t(reinterpret_cast(in.data())[i]>>8) - 127; + } + return N; + } + /** int16 -> int8 */ static size_t _int16_int8(const RawBuffer &in, const RawBuffer &out) { size_t N = in.bytesLen()/2; for (size_t i=0; i(out.data())[i] = reinterpret_cast(in.data())[i]>>8; + reinterpret_cast(out.data())[i] = + reinterpret_cast(in.data())[i]>>8; } return N; } @@ -134,18 +157,18 @@ protected: static size_t _int8_cint8(const RawBuffer &in, const RawBuffer &out) { size_t N = in.bytesLen(); for (size_t i=0; i *>(out.data())[i] = reinterpret_cast(in.data())[i]; + reinterpret_cast *>(out.data())[i] = + reinterpret_cast(in.data())[i]; } return 2*N; } - /** std::complex -> std::complex. */ - static size_t _cuint8_cint8(const RawBuffer &in, const RawBuffer &out) { + /** uint16 -> complex int 8. */ + static size_t _uint16_cint8(const RawBuffer &in, const RawBuffer &out) { size_t N = in.bytesLen()/2; - std::complex *values = reinterpret_cast *>(in.data()); for (size_t i=0; i *>(out.data())[i] = - std::complex(int16_t(values[i].real())-127, int16_t(values[i].imag())-127); + reinterpret_cast *>(out.data())[i] + = int32_t(reinterpret_cast(in.data())[i]>>8)-((2<<15)-1); } return 2*N; } @@ -159,12 +182,12 @@ protected: return 2*N; } - /** complex int16 -> complex int 8. */ - static size_t _cint16_cint8(const RawBuffer &in, const RawBuffer &out) { - size_t N = in.bytesLen()/4; - std::complex *values = reinterpret_cast *>(in.data()); + /** uint8 -> int16. */ + static size_t _uint8_int16(const RawBuffer &in, const RawBuffer &out) { + size_t N = in.bytesLen(); + int8_t *values = reinterpret_cast(in.data()); for (size_t i=0; i *>(out.data())[i] = std::complex(values[i].real()>>8, values[i].imag()>>8); + reinterpret_cast(out.data())[i] = (int16_t(values[i])-127)<<8; } return 2*N; } @@ -179,6 +202,16 @@ protected: return 2*N; } + /** uint16 -> int16. */ + static size_t _uint16_int16(const RawBuffer &in, const RawBuffer &out) { + size_t N = in.bytesLen()/2; + uint16_t *values = reinterpret_cast(in.data()); + for (size_t i=0; i(out.data())[i] = int32_t(values[i])-((2<<15)-1); + } + return 2*N; + } + /** unsinged int8 -> complex int16. */ static size_t _uint8_cint16(const RawBuffer &in, const RawBuffer &out) { size_t N = in.bytesLen(); @@ -201,30 +234,6 @@ protected: return 4*N; } - /** complex unsigned int8 -> complex int16. */ - static size_t _cuint8_cint16(const RawBuffer &in, const RawBuffer &out) { - size_t N = in.bytesLen()/2; - std::complex *values = reinterpret_cast *>(in.data()); - for (size_t i=0; i *>(out.data())[i] = - std::complex((int16_t(values[i].real())-127)*(1<<8), - (int16_t(values[i].imag())-127)*(1<<8)); - } - return 4*N; - } - - /** complex int8 -> complex int16. */ - static size_t _cint8_cint16(const RawBuffer &in, const RawBuffer &out) { - size_t N = in.bytesLen()/2; - std::complex *values = reinterpret_cast *>(in.data()); - for (size_t i=0; i *>(out.data())[i] = - std::complex(int16_t(values[i].real())*(1<<8), - int16_t(values[i].imag())*(1<<8)); - } - return 4*N; - } - /** uint16 -> complex int16. */ static size_t _uint16_cint16(const RawBuffer &in, const RawBuffer &out) { size_t N = in.bytesLen()/2;