/////////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2020 Edouard Griffiths, F4EXB // // // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation as version 3 of the License, or // // (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License V3 for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// #ifndef INCLUDE_SIGMFFILECONVERT_H #define INCLUDE_SIGMFFILECONVERT_H #include "dsp/dsptypes.h" // Convert from Little Endian template T sigMFFromLE(const T in) { return in; // default assumes LE -> LE and is unused anyway } template<> float sigMFFromLE(const float in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) return in; #else float retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[3]; converted[1] = toConvert[2]; converted[2] = toConvert[1]; converted[3] = toConvert[0]; return retVal; #endif } template<> int16_t sigMFFromLE(const int16_t in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) return in; #else int16_t retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[1]; converted[1] = toConvert[0]; return retVal; #endif } template<> uint16_t sigMFFromLE(const uint16_t in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) return in; #else uint16_t retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[1]; converted[1] = toConvert[0]; return retVal; #endif } template<> int32_t sigMFFromLE(const int32_t in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) return in; #else int32_t retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[3]; converted[1] = toConvert[2]; converted[2] = toConvert[1]; converted[3] = toConvert[0]; return retVal; #endif } template<> uint32_t sigMFFromLE(const uint32_t in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) return in; #else uint32_t retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[3]; converted[1] = toConvert[2]; converted[2] = toConvert[1]; converted[3] = toConvert[0]; return retVal; #endif } // Convert from Big Endian template T sigMFFromBE(const T in) { return in; // default assumes BE -> BE and is unused anyway } template<> float sigMFFromBE(const float in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) float retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[3]; converted[1] = toConvert[2]; converted[2] = toConvert[1]; converted[3] = toConvert[0]; return retVal; #else return in; #endif } template<> int16_t sigMFFromBE(const int16_t in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) int16_t retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[1]; converted[1] = toConvert[0]; return retVal; #else return in; #endif } template<> uint16_t sigMFFromBE(const uint16_t in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) uint16_t retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[1]; converted[1] = toConvert[0]; return retVal; #else return in; #endif } template<> int32_t sigMFFromBE(const int32_t in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) int32_t retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[3]; converted[1] = toConvert[2]; converted[2] = toConvert[1]; converted[3] = toConvert[0]; return retVal; #else return in; #endif } template<> uint32_t sigMFFromBE(const uint32_t in) { #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) uint32_t retVal; char *toConvert = ( char* ) & in; char *converted = ( char* ) & retVal; // swap the bytes into a temporary buffer converted[0] = toConvert[3]; converted[1] = toConvert[2]; converted[2] = toConvert[1]; converted[3] = toConvert[0]; return retVal; #else return in; #endif } // Sample conversions class SigMFConverterInterface { public: virtual int convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) = 0; }; template class SigMFConverter : public SigMFConverterInterface { public: virtual int convert(FixReal *convertBuffer, const quint8* buf, int nbBytes); }; template int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const SigMFT *sigMFBuf = (SigMFT *) buf; int nbSamples = nbBytes / ((IsComplex ? 2 : 1) * sizeof(SigMFT)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFBuf[2*is]; convertBuffer[2*is+1] = sigMFBuf[2*is+1]; } return nbSamples; } // Specialized templates // ================= // float input type // ================= // float complex LE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / (2*sizeof(float)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) * 32768.0f; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]) * 32768.0f; } return nbSamples; } // float complex LE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / (2*sizeof(float)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) * 8388608.0f; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]) * 8388608.0f; } return nbSamples; } // float complex LE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / (2*sizeof(float)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is+1]) * 32768.0f; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is]) * 32768.0f; } return nbSamples; } // float complex LE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / (2*sizeof(float)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is+1]) * 8388608.0f; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is]) * 8388608.0f; } return nbSamples; } // float real LE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / sizeof(float); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) * 32768.0f; convertBuffer[2*is+1] = 0; } return nbSamples; } // float real LE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / sizeof(float); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) * 8388608.0f; convertBuffer[2*is+1] = 0; } return nbSamples; } // float complex BE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / (2*sizeof(float)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) * 32768.0f; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is+1]) * 32768.0f; } return nbSamples; } // float complex BE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / (2*sizeof(float)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) * 8388608.0f; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is+1]) * 8388608.0f; } return nbSamples; } // float complex BE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / (2*sizeof(float)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is+1]) * 32768.0f; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is]) * 32768.0f; } return nbSamples; } // float complex BE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / (2*sizeof(float)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is+1]) * 8388608.0f; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is]) * 8388608.0f; } return nbSamples; } // float real BE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / sizeof(float); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) * 32768.0f; convertBuffer[2*is+1] = 0; } return nbSamples; } // float real BE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const float *sigMFBuf = (float *) buf; int nbSamples = nbBytes / sizeof(float); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) * 8388608.0f; convertBuffer[2*is+1] = 0; } return nbSamples; } // ================================ // 8 bit signed integer input type // ================================ // s8 complex IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int8_t *sigMFBuf = (int8_t *) buf; int nbSamples = nbBytes / (2*sizeof(int8_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFBuf[2*is] << 8; convertBuffer[2*is+1] = sigMFBuf[2*is+1] << 8; } return nbSamples; } // s8 complex IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int8_t *sigMFBuf = (int8_t *) buf; int nbSamples = nbBytes / (2*sizeof(int8_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFBuf[2*is] << 16; convertBuffer[2*is+1] = sigMFBuf[2*is+1] << 16; } return nbSamples; } // s8 complex QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int8_t *sigMFBuf = (int8_t *) buf; int nbSamples = nbBytes / (2*sizeof(int8_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFBuf[2*is+1] << 8; convertBuffer[2*is+1] = sigMFBuf[2*is] << 8; } return nbSamples; } // s8 complex QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int8_t *sigMFBuf = (int8_t *) buf; int nbSamples = nbBytes / (2*sizeof(int8_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFBuf[2*is+1] << 16; convertBuffer[2*is+1] = sigMFBuf[2*is] << 16; } return nbSamples; } // s8 real => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int8_t *sigMFBuf = (int8_t *) buf; int nbSamples = nbBytes / sizeof(int8_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFBuf[2*is] << 8; convertBuffer[2*is+1] = 0; } return nbSamples; } // s8 real => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int8_t *sigMFBuf = (int8_t *) buf; int nbSamples = nbBytes / sizeof(int8_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFBuf[2*is] << 16; convertBuffer[2*is+1] = 0; } return nbSamples; } // ================================== // 8 bit unsigned integer input type // ================================== // u8 complex IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* sigMFBuf, int nbBytes) { int nbSamples = nbBytes / (2*sizeof(uint8_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFBuf[2*is] - 128) << 8; convertBuffer[2*is+1] = (sigMFBuf[2*is+1] - 128) << 8; } return nbSamples; } // u8 complex IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* sigMFBuf, int nbBytes) { int nbSamples = nbBytes / (2*sizeof(uint8_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFBuf[2*is] - 128) << 16; convertBuffer[2*is+1] = (sigMFBuf[2*is+1] - 128) << 16; } return nbSamples; } // u8 complex QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* sigMFBuf, int nbBytes) { int nbSamples = nbBytes / (2*sizeof(uint8_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFBuf[2*is+1] - 128) << 8; convertBuffer[2*is+1] = (sigMFBuf[2*is] - 128) << 8; } return nbSamples; } // u8 complex QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* sigMFBuf, int nbBytes) { int nbSamples = nbBytes / (2*sizeof(uint8_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFBuf[2*is+1] - 128) << 16; convertBuffer[2*is+1] = (sigMFBuf[2*is] - 128) << 16; } return nbSamples; } // u8 real => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* sigMFBuf, int nbBytes) { int nbSamples = nbBytes / sizeof(uint8_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFBuf[2*is] - 128) << 8; convertBuffer[2*is+1] = 0; } return nbSamples; } // u8 real => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* sigMFBuf, int nbBytes) { int nbSamples = nbBytes / sizeof(uint8_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFBuf[2*is] - 128) << 16; convertBuffer[2*is+1] = 0; } return nbSamples; } // ================================= // 16 bit signed integer input type // ================================= // i16 complex LE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / (2*sizeof(int16_t)); #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) std::copy(sigMFBuf, sigMFBuf + 2*nbSamples, convertBuffer); return nbSamples; #else for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]); convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]); } return nbSamples; #endif } // i16 complex LE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / (2*sizeof(int16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) << 8; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]) << 8; } return nbSamples; } // i16 complex LE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / (2*sizeof(int16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is+1]); convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is]); } return nbSamples; } // i16 complex LE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / (2*sizeof(int16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is+1] << 8); convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is] << 8); } return nbSamples; } // i16 real LE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / sizeof(int16_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]); convertBuffer[2*is+1] = 0; } return nbSamples; } // i16 real LE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / sizeof(int16_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is] << 8); convertBuffer[2*is+1] = 0; } return nbSamples; } // i16 complex BE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / (2*sizeof(int16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]); convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is+1]); } return nbSamples; } // i16 complex BE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / (2*sizeof(int16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) << 8; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is+1]) << 8; } return nbSamples; } // i16 complex BE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / (2*sizeof(int16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is+1]); convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is]); } return nbSamples; } // i16 complex BE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / (2*sizeof(int16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is+1]) << 8; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is]) << 8; } return nbSamples; } // i16 real BE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / sizeof(int16_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]); convertBuffer[2*is+1] = 0; } return nbSamples; } // i16 real BE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int16_t *sigMFBuf = (int16_t *) buf; int nbSamples = nbBytes / sizeof(int16_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) << 8; convertBuffer[2*is+1] = 0; } return nbSamples; } // =================================== // 16 bit unsigned integer input type // =================================== // u16 complex LE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) - 32768; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]) -32768; } return nbSamples; } // u16 complex LE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is]) - 32768) << 8; convertBuffer[2*is+1] = (sigMFFromLE(sigMFBuf[2*is+1]) - 32768) << 8; convertBuffer[2*is+1] <<= 8; } return nbSamples; } // u16 complex LE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is+1]) - 32768; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is]) -32768; } return nbSamples; } // u16 complex LE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is+1]) - 32768) << 8; convertBuffer[2*is+1] = (sigMFFromLE(sigMFBuf[2*is]) - 32768) << 8; } return nbSamples; } // u16 real LE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / sizeof(uint16_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) - 32768; convertBuffer[2*is+1] = 0; } return nbSamples; } // u16 real LE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / sizeof(uint16_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is]) - 32768) << 8; convertBuffer[2*is+1] = 0; } return nbSamples; } // u16 complex BE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) - 32768; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is+1]) -32768; } return nbSamples; } // u16 complex BE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is]) - 32768) << 8; convertBuffer[2*is+1] = (sigMFFromBE(sigMFBuf[2*is+1]) -32768) << 8; } return nbSamples; } // u16 complex BE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is+1]) - 32768; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is]) -32768; } return nbSamples; } // u16 complex BE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint16_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is+1]) - 32768) << 8; convertBuffer[2*is+1] = (sigMFFromBE(sigMFBuf[2*is]) -32768) << 8; } return nbSamples; } // u16 real BE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / sizeof(uint16_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) - 32768; convertBuffer[2*is+1] = 0; } return nbSamples; } // u16 real BE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint16_t *sigMFBuf = (uint16_t *) buf; int nbSamples = nbBytes / sizeof(uint16_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is]) - 32768) << 8; convertBuffer[2*is+1] = 0; } return nbSamples; } // ====================================================== // 24 bit signed integer input type - SDRangel exclusive // ====================================================== // s24 complex LE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) >> 8; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]) >> 8; } return nbSamples; } // s24 complex LE IQ => FixReal 24 bits - SDRangel only template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); #if defined(__WINDOWS__) || (BYTE_ORDER == LITTLE_ENDIAN) std::copy(sigMFBuf, sigMFBuf + 2*nbSamples, convertBuffer); return nbSamples; #else for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]); convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]); } return nbSamples; #endif } // ================================= // 32 bit signed integer input type // ================================= // s32 complex LE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) >> 16; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]) >> 16; } return nbSamples; } // s32 complex LE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) >> 8; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is+1]) >> 8; } return nbSamples; } // s32 complex LE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is+1]) >> 16; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is]) >> 16; } return nbSamples; } // s32 complex LE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is+1]) >> 8; convertBuffer[2*is+1] = sigMFFromLE(sigMFBuf[2*is]) >> 8; } return nbSamples; } // s32 real LE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / sizeof(int32_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) >> 16; convertBuffer[2*is+1] = 0; } return nbSamples; } // s32 real LE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / sizeof(int32_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromLE(sigMFBuf[2*is]) >> 8; convertBuffer[2*is+1] = 0; } return nbSamples; } // s32 complex BE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) >> 16; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is+1]) >> 16; } return nbSamples; } // s32 complex BE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) >> 8; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is+1]) >> 8; } return nbSamples; } // s32 complex BE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is+1]) >> 16; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is]) >> 16; } return nbSamples; } // s32 complex BE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / (2*sizeof(int32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is+1]) >> 8; convertBuffer[2*is+1] = sigMFFromBE(sigMFBuf[2*is]) >> 8; } return nbSamples; } // s32 real BE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / sizeof(int32_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) >> 16; convertBuffer[2*is+1] = 0; } return nbSamples; } // s32 real BE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const int32_t *sigMFBuf = (int32_t *) buf; int nbSamples = nbBytes / sizeof(int32_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = sigMFFromBE(sigMFBuf[2*is]) >> 8; convertBuffer[2*is+1] = 0; } return nbSamples; } // =================================== // 32 bit unsigned integer input type // =================================== // u32 complex LE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is]) >> 16) - 32768; convertBuffer[2*is+1] = (sigMFFromLE(sigMFBuf[2*is+1]) >> 16) - 32768; } return nbSamples; } // u32 complex LE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is]) >> 8) - 8388608; convertBuffer[2*is+1] = (sigMFFromLE(sigMFBuf[2*is+1]) >> 8) - 8388608; } return nbSamples; } // u32 complex LE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is+1]) >> 16) - 32768; convertBuffer[2*is+1] = (sigMFFromLE(sigMFBuf[2*is]) >> 16) - 32768; } return nbSamples; } // u32 complex LE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is+1]) >> 8) - 8388608; convertBuffer[2*is+1] = (sigMFFromLE(sigMFBuf[2*is]) >> 8) - 8388608; } return nbSamples; } // u32 real LE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / sizeof(uint32_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is]) >> 16) - 32768; convertBuffer[2*is+1] = 0; } return nbSamples; } // u32 real LE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / sizeof(uint32_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromLE(sigMFBuf[2*is]) >> 8) - 8388608; convertBuffer[2*is+1] = 0; } return nbSamples; } // u32 complex BE IQ => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is]) >> 16) - 32768; convertBuffer[2*is+1] = (sigMFFromBE(sigMFBuf[2*is+1]) >> 16) - 32768; } return nbSamples; } // u32 complex BE IQ => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is]) >> 8) - 8388608; convertBuffer[2*is+1] = (sigMFFromBE(sigMFBuf[2*is+1]) >> 8) - 8388608; } return nbSamples; } // u32 complex BE QI => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is+1]) >> 16) - 32768; convertBuffer[2*is+1] = (sigMFFromBE(sigMFBuf[2*is]) >> 16) - 32768; } return nbSamples; } // u32 complex BE QI => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / (2*sizeof(uint32_t)); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is+1]) >> 8) - 8388608; convertBuffer[2*is+1] = (sigMFFromBE(sigMFBuf[2*is]) >> 8) - 8388608; } return nbSamples; } // u32 real BE => FixReal 16 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / sizeof(uint32_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is]) >> 16) - 32768; convertBuffer[2*is+1] = 0; } return nbSamples; } // u32 real BE => FixReal 24 bits template<> int SigMFConverter::convert(FixReal *convertBuffer, const quint8* buf, int nbBytes) { const uint32_t *sigMFBuf = (uint32_t *) buf; int nbSamples = nbBytes / sizeof(uint32_t); for (int is = 0; is < nbSamples; is++) { convertBuffer[2*is] = (sigMFFromBE(sigMFBuf[2*is]) >> 8) - 8388608; convertBuffer[2*is+1] = 0; } return nbSamples; } #endif // INCLUDE_SIGMFFILEDATA_H