diff --git a/inputsource.cpp b/inputsource.cpp index a413f78..6a7ebac 100644 --- a/inputsource.cpp +++ b/inputsource.cpp @@ -63,7 +63,7 @@ public: size_t sampleSize() override { return sizeof(std::complex); } - + void copyRange(const void* const src, size_t start, size_t length, std::complex* const dest) override { auto s = reinterpret_cast*>(src); std::transform(&s[start], &s[start + length], dest, @@ -80,7 +80,7 @@ public: size_t sampleSize() override { return sizeof(std::complex); } - + void copyRange(const void* const src, size_t start, size_t length, std::complex* const dest) override { auto s = reinterpret_cast*>(src); std::transform(&s[start], &s[start + length], dest, @@ -92,6 +92,73 @@ public: } }; +class RealF32SampleAdapter : public SampleAdapter { +public: + size_t sampleSize() override { + return sizeof(float); + } + + void copyRange(const void* const src, size_t start, size_t length, std::complex* const dest) override { + auto s = reinterpret_cast(src); + std::transform(&s[start], &s[start + length], dest, + [](const float& v) -> std::complex { + return {v, 0.0f}; + } + ); + } +}; + +class RealS16SampleAdapter : public SampleAdapter { +public: + size_t sampleSize() override { + return sizeof(int16_t); + } + + void copyRange(const void* const src, size_t start, size_t length, std::complex* const dest) override { + auto s = reinterpret_cast(src); + std::transform(&s[start], &s[start + length], dest, + [](const int16_t& v) -> std::complex { + const float k = 1.0f / 32768.0f; + return { v * k, 0.0f }; + } + ); + } +}; + +class RealS8SampleAdapter : public SampleAdapter { +public: + size_t sampleSize() override { + return sizeof(int8_t); + } + + void copyRange(const void* const src, size_t start, size_t length, std::complex* const dest) override { + auto s = reinterpret_cast(src); + std::transform(&s[start], &s[start + length], dest, + [](const int8_t& v) -> std::complex { + const float k = 1.0f / 128.0f; + return { v * k, 0.0f }; + } + ); + } +}; + +class RealU8SampleAdapter : public SampleAdapter { +public: + size_t sampleSize() override { + return sizeof(uint8_t); + } + + void copyRange(const void* const src, size_t start, size_t length, std::complex* const dest) override { + auto s = reinterpret_cast(src); + std::transform(&s[start], &s[start + length], dest, + [](const uint8_t& v) -> std::complex { + const float k = 1.0f / 128.0f; + return { (v - 127.4f) * k, 0 }; + } + ); + } +}; + InputSource::InputSource() { } @@ -131,6 +198,22 @@ void InputSource::openFile(const char *filename) else if ((suffix == "cu8") || (suffix == "uc8")) { sampleAdapter = std::unique_ptr(new ComplexU8SampleAdapter()); } + else if (suffix == "f32") { + sampleAdapter = std::unique_ptr(new RealF32SampleAdapter()); + _realSignal = true; + } + else if (suffix == "s16") { + sampleAdapter = std::unique_ptr(new RealS16SampleAdapter()); + _realSignal = true; + } + else if (suffix == "s8") { + sampleAdapter = std::unique_ptr(new RealS8SampleAdapter()); + _realSignal = true; + } + else if (suffix == "u8") { + sampleAdapter = std::unique_ptr(new RealU8SampleAdapter()); + _realSignal = true; + } else { sampleAdapter = std::unique_ptr(new ComplexF32SampleAdapter()); } diff --git a/inputsource.h b/inputsource.h index 716f38f..d6d76e0 100644 --- a/inputsource.h +++ b/inputsource.h @@ -39,6 +39,7 @@ private: uchar *mmapData = nullptr; std::unique_ptr sampleAdapter; std::string _fmt; + bool _realSignal = false; public: InputSource(); @@ -52,6 +53,9 @@ public: void setSampleRate(double rate); void setFormat(std::string fmt); double rate(); + bool realSignal() { + return _realSignal; + }; float relativeBandwidth() { return 1; } diff --git a/samplesource.h b/samplesource.h index d5e3c9d..ed0c0e3 100644 --- a/samplesource.h +++ b/samplesource.h @@ -36,4 +36,5 @@ public: virtual double rate() = 0; virtual float relativeBandwidth() = 0; std::type_index sampleType() override; + virtual bool realSignal() { return false; }; };