Skip to content

Commit

Permalink
Add SampleAdapters for real samples
Browse files Browse the repository at this point in the history
  • Loading branch information
miek committed May 27, 2020
1 parent 1ca8440 commit e75fe61
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 2 deletions.
87 changes: 85 additions & 2 deletions inputsource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class ComplexS8SampleAdapter : public SampleAdapter {
size_t sampleSize() override {
return sizeof(std::complex<int8_t>);
}

void copyRange(const void* const src, size_t start, size_t length, std::complex<float>* const dest) override {
auto s = reinterpret_cast<const std::complex<int8_t>*>(src);
std::transform(&s[start], &s[start + length], dest,
Expand All @@ -80,7 +80,7 @@ class ComplexU8SampleAdapter : public SampleAdapter {
size_t sampleSize() override {
return sizeof(std::complex<uint8_t>);
}

void copyRange(const void* const src, size_t start, size_t length, std::complex<float>* const dest) override {
auto s = reinterpret_cast<const std::complex<uint8_t>*>(src);
std::transform(&s[start], &s[start + length], dest,
Expand All @@ -92,6 +92,73 @@ class ComplexU8SampleAdapter : public SampleAdapter {
}
};

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<float>* const dest) override {
auto s = reinterpret_cast<const float*>(src);
std::transform(&s[start], &s[start + length], dest,
[](const float& v) -> std::complex<float> {
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<float>* const dest) override {
auto s = reinterpret_cast<const int16_t*>(src);
std::transform(&s[start], &s[start + length], dest,
[](const int16_t& v) -> std::complex<float> {
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<float>* const dest) override {
auto s = reinterpret_cast<const int8_t*>(src);
std::transform(&s[start], &s[start + length], dest,
[](const int8_t& v) -> std::complex<float> {
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<float>* const dest) override {
auto s = reinterpret_cast<const uint8_t*>(src);
std::transform(&s[start], &s[start + length], dest,
[](const uint8_t& v) -> std::complex<float> {
const float k = 1.0f / 128.0f;
return { (v - 127.4f) * k, 0 };
}
);
}
};

InputSource::InputSource()
{
}
Expand Down Expand Up @@ -131,6 +198,22 @@ void InputSource::openFile(const char *filename)
else if ((suffix == "cu8") || (suffix == "uc8")) {
sampleAdapter = std::unique_ptr<SampleAdapter>(new ComplexU8SampleAdapter());
}
else if (suffix == "f32") {
sampleAdapter = std::unique_ptr<SampleAdapter>(new RealF32SampleAdapter());
_realSignal = true;
}
else if (suffix == "s16") {
sampleAdapter = std::unique_ptr<SampleAdapter>(new RealS16SampleAdapter());
_realSignal = true;
}
else if (suffix == "s8") {
sampleAdapter = std::unique_ptr<SampleAdapter>(new RealS8SampleAdapter());
_realSignal = true;
}
else if (suffix == "u8") {
sampleAdapter = std::unique_ptr<SampleAdapter>(new RealU8SampleAdapter());
_realSignal = true;
}
else {
sampleAdapter = std::unique_ptr<SampleAdapter>(new ComplexF32SampleAdapter());
}
Expand Down
4 changes: 4 additions & 0 deletions inputsource.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class InputSource : public SampleSource<std::complex<float>>
uchar *mmapData = nullptr;
std::unique_ptr<SampleAdapter> sampleAdapter;
std::string _fmt;
bool _realSignal = false;

public:
InputSource();
Expand All @@ -52,6 +53,9 @@ class InputSource : public SampleSource<std::complex<float>>
void setSampleRate(double rate);
void setFormat(std::string fmt);
double rate();
bool realSignal() {
return _realSignal;
};
float relativeBandwidth() {
return 1;
}
Expand Down
1 change: 1 addition & 0 deletions samplesource.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ class SampleSource : public AbstractSampleSource
virtual double rate() = 0;
virtual float relativeBandwidth() = 0;
std::type_index sampleType() override;
virtual bool realSignal() { return false; };
};

0 comments on commit e75fe61

Please sign in to comment.