|
|
|
@ -7,7 +7,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
namespace sdr {
|
|
|
|
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. */
|
|
|
|
* the template argument. Currently only integer casts are supported. */
|
|
|
|
template <class Scalar>
|
|
|
|
template <class Scalar>
|
|
|
|
class AutoCast: public SinkBase, public Source
|
|
|
|
class AutoCast: public SinkBase, public Source
|
|
|
|
@ -28,9 +28,9 @@ public:
|
|
|
|
// Check type cast combination
|
|
|
|
// Check type cast combination
|
|
|
|
if (Config::Type_s8 == Traits<Scalar>::scalarId) {
|
|
|
|
if (Config::Type_s8 == Traits<Scalar>::scalarId) {
|
|
|
|
switch (src_cfg.type()) {
|
|
|
|
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_s8: _cast = _identity; break;
|
|
|
|
case Config::Type_u16:
|
|
|
|
case Config::Type_u16: _cast = _uint16_int8; break;
|
|
|
|
case Config::Type_s16: _cast = _int16_int8; break;
|
|
|
|
case Config::Type_s16: _cast = _int16_int8; break;
|
|
|
|
default: break;
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -38,17 +38,19 @@ public:
|
|
|
|
switch (src_cfg.type()) {
|
|
|
|
switch (src_cfg.type()) {
|
|
|
|
case Config::Type_u8: _cast = _uint8_cint8; break;
|
|
|
|
case Config::Type_u8: _cast = _uint8_cint8; break;
|
|
|
|
case Config::Type_s8: _cast = _int8_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_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_s16: _cast = _int16_cint8; break;
|
|
|
|
|
|
|
|
case Config::Type_cu16: _cast = _uint16_int8; break;
|
|
|
|
|
|
|
|
case Config::Type_cs16: _cast = _int16_int8; break;
|
|
|
|
default: break;
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (Config::Type_s16 == Traits<Scalar>::scalarId) {
|
|
|
|
} else if (Config::Type_s16 == Traits<Scalar>::scalarId) {
|
|
|
|
switch (src_cfg.type()) {
|
|
|
|
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_s8: _cast = _int8_int16; break;
|
|
|
|
case Config::Type_u16:
|
|
|
|
case Config::Type_u16: _cast = _uint16_int16; break;
|
|
|
|
case Config::Type_s16: _cast = _identity; break;
|
|
|
|
case Config::Type_s16: _cast = _identity; break;
|
|
|
|
default: break;
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -56,11 +58,11 @@ public:
|
|
|
|
switch (src_cfg.type()) {
|
|
|
|
switch (src_cfg.type()) {
|
|
|
|
case Config::Type_u8: _cast = _uint8_cint16; break;
|
|
|
|
case Config::Type_u8: _cast = _uint8_cint16; break;
|
|
|
|
case Config::Type_s8: _cast = _int8_cint16; break;
|
|
|
|
case Config::Type_s8: _cast = _int8_cint16; break;
|
|
|
|
case Config::Type_cu8: _cast = _cuint8_cint16; break;
|
|
|
|
case Config::Type_cu8: _cast = _uint8_int16; break;
|
|
|
|
case Config::Type_cs8: _cast = _cint8_cint16; break;
|
|
|
|
case Config::Type_cs8: _cast = _int8_int16; break;
|
|
|
|
case Config::Type_u16: _cast = _uint16_cint16; break;
|
|
|
|
case Config::Type_u16: _cast = _uint16_cint16; break;
|
|
|
|
case Config::Type_s16: _cast = _int16_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;
|
|
|
|
case Config::Type_cs16: _cast = _identity; break;
|
|
|
|
default: break;
|
|
|
|
default: break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -110,11 +112,32 @@ protected:
|
|
|
|
return in.bytesLen();
|
|
|
|
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<N; i++) {
|
|
|
|
|
|
|
|
reinterpret_cast<int8_t *>(out.data())[i] =
|
|
|
|
|
|
|
|
int16_t(reinterpret_cast<uint8_t *>(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<N; i++) {
|
|
|
|
|
|
|
|
reinterpret_cast<int8_t *>(out.data())[i] =
|
|
|
|
|
|
|
|
int16_t(reinterpret_cast<uint16_t *>(in.data())[i]>>8) - 127;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return N;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** int16 -> int8 */
|
|
|
|
/** int16 -> int8 */
|
|
|
|
static size_t _int16_int8(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
static size_t _int16_int8(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
size_t N = in.bytesLen()/2;
|
|
|
|
size_t N = in.bytesLen()/2;
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
reinterpret_cast<int8_t *>(out.data())[i] = reinterpret_cast<int16_t *>(in.data())[i]>>8;
|
|
|
|
reinterpret_cast<int8_t *>(out.data())[i] =
|
|
|
|
|
|
|
|
reinterpret_cast<int16_t *>(in.data())[i]>>8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return N;
|
|
|
|
return N;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -134,18 +157,18 @@ protected:
|
|
|
|
static size_t _int8_cint8(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
static size_t _int8_cint8(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
size_t N = in.bytesLen();
|
|
|
|
size_t N = in.bytesLen();
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
reinterpret_cast<std::complex<int8_t> *>(out.data())[i] = reinterpret_cast<int8_t *>(in.data())[i];
|
|
|
|
reinterpret_cast<std::complex<int8_t> *>(out.data())[i] =
|
|
|
|
|
|
|
|
reinterpret_cast<int8_t *>(in.data())[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 2*N;
|
|
|
|
return 2*N;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** std::complex<uint8_t> -> std::complex<int8_t>. */
|
|
|
|
/** uint16 -> complex int 8. */
|
|
|
|
static size_t _cuint8_cint8(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
static size_t _uint16_cint8(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
size_t N = in.bytesLen()/2;
|
|
|
|
size_t N = in.bytesLen()/2;
|
|
|
|
std::complex<uint8_t> *values = reinterpret_cast<std::complex<uint8_t> *>(in.data());
|
|
|
|
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
reinterpret_cast<std::complex<int8_t> *>(out.data())[i] =
|
|
|
|
reinterpret_cast<std::complex<int8_t> *>(out.data())[i]
|
|
|
|
std::complex<int8_t>(int16_t(values[i].real())-127, int16_t(values[i].imag())-127);
|
|
|
|
= int32_t(reinterpret_cast<int16_t *>(in.data())[i]>>8)-((2<<15)-1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 2*N;
|
|
|
|
return 2*N;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -159,12 +182,12 @@ protected:
|
|
|
|
return 2*N;
|
|
|
|
return 2*N;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** complex int16 -> complex int 8. */
|
|
|
|
/** uint8 -> int16. */
|
|
|
|
static size_t _cint16_cint8(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
static size_t _uint8_int16(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
size_t N = in.bytesLen()/4;
|
|
|
|
size_t N = in.bytesLen();
|
|
|
|
std::complex<int16_t> *values = reinterpret_cast<std::complex<int16_t> *>(in.data());
|
|
|
|
int8_t *values = reinterpret_cast<int8_t *>(in.data());
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
reinterpret_cast<std::complex<int8_t> *>(out.data())[i] = std::complex<int8_t>(values[i].real()>>8, values[i].imag()>>8);
|
|
|
|
reinterpret_cast<int16_t *>(out.data())[i] = (int16_t(values[i])-127)<<8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 2*N;
|
|
|
|
return 2*N;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -179,6 +202,16 @@ protected:
|
|
|
|
return 2*N;
|
|
|
|
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<uint16_t *>(in.data());
|
|
|
|
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
|
|
|
|
reinterpret_cast<int16_t *>(out.data())[i] = int32_t(values[i])-((2<<15)-1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return 2*N;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** unsinged int8 -> complex int16. */
|
|
|
|
/** unsinged int8 -> complex int16. */
|
|
|
|
static size_t _uint8_cint16(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
static size_t _uint8_cint16(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
size_t N = in.bytesLen();
|
|
|
|
size_t N = in.bytesLen();
|
|
|
|
@ -201,30 +234,6 @@ protected:
|
|
|
|
return 4*N;
|
|
|
|
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<uint8_t> *values = reinterpret_cast<std::complex<uint8_t> *>(in.data());
|
|
|
|
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
|
|
|
|
reinterpret_cast<std::complex<int16_t> *>(out.data())[i] =
|
|
|
|
|
|
|
|
std::complex<int16_t>((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<int8_t> *values = reinterpret_cast<std::complex<int8_t> *>(in.data());
|
|
|
|
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
|
|
|
|
|
|
reinterpret_cast<std::complex<int16_t> *>(out.data())[i] =
|
|
|
|
|
|
|
|
std::complex<int16_t>(int16_t(values[i].real())*(1<<8),
|
|
|
|
|
|
|
|
int16_t(values[i].imag())*(1<<8));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return 4*N;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** uint16 -> complex int16. */
|
|
|
|
/** uint16 -> complex int16. */
|
|
|
|
static size_t _uint16_cint16(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
static size_t _uint16_cint16(const RawBuffer &in, const RawBuffer &out) {
|
|
|
|
size_t N = in.bytesLen()/2;
|
|
|
|
size_t N = in.bytesLen()/2;
|
|
|
|
|