SDRPlusPlus/core/src/dsp/math.h

146 lines
4.0 KiB
C
Raw Normal View History

2020-06-22 16:45:57 +02:00
#pragma once
2020-11-02 03:57:44 +01:00
#include <dsp/block.h>
#include <volk/volk.h>
2020-06-22 16:45:57 +02:00
namespace dsp {
2020-11-02 03:57:44 +01:00
template <class T>
class Add : public generic_block<Add<T>> {
2020-06-22 16:45:57 +02:00
public:
2020-11-02 03:57:44 +01:00
Add() {}
Add(stream<T>* a, stream<T>* b) { init(a, b); }
void init(stream<T>* a, stream<T>* b) {
2020-06-22 16:45:57 +02:00
_a = a;
_b = b;
2021-02-20 15:27:43 +01:00
generic_block<Add<T>>::registerInput(a);
generic_block<Add<T>>::registerInput(b);
generic_block<Add<T>>::registerOutput(&out);
2020-06-22 16:45:57 +02:00
}
2020-11-02 03:57:44 +01:00
int run() {
2021-03-29 21:53:43 +02:00
int a_count = _a->read();
2020-11-02 03:57:44 +01:00
if (a_count < 0) { return -1; }
2021-03-29 21:53:43 +02:00
int b_count = _b->read();
2020-11-02 03:57:44 +01:00
if (b_count < 0) { return -1; }
if (a_count != b_count) {
_a->flush();
_b->flush();
return 0;
}
if constexpr (std::is_same_v<T, complex_t> || std::is_same_v<T, stereo_t>) {
2021-02-20 15:27:43 +01:00
volk_32fc_x2_add_32fc((lv_32fc_t*)out.writeBuf, (lv_32fc_t*)_a->readBuf, (lv_32fc_t*)_b->readBuf, a_count);
}
else {
volk_32f_x2_add_32f(out.writeBuf, _a->readBuf, _b->readBuf, a_count);
}
_a->flush();
_b->flush();
if (!out.swap(a_count)) { return -1; }
return a_count;
}
stream<T> out;
private:
stream<T>* _a;
stream<T>* _b;
};
template <class T>
class Substract : public generic_block<Substract<T>> {
public:
Substract() {}
Substract(stream<T>* a, stream<T>* b) { init(a, b); }
void init(stream<T>* a, stream<T>* b) {
_a = a;
_b = b;
generic_block<Substract<T>>::registerInput(a);
generic_block<Substract<T>>::registerInput(b);
generic_block<Substract<T>>::registerOutput(&out);
}
int run() {
2021-03-29 21:53:43 +02:00
int a_count = _a->read();
2021-02-20 15:27:43 +01:00
if (a_count < 0) { return -1; }
2021-03-29 21:53:43 +02:00
int b_count = _b->read();
2021-02-20 15:27:43 +01:00
if (b_count < 0) { return -1; }
if (a_count != b_count) {
_a->flush();
_b->flush();
return 0;
}
if constexpr (std::is_same_v<T, complex_t> || std::is_same_v<T, stereo_t>) {
volk_32f_x2_subtract_32f((float*)out.writeBuf, (float*)_a->readBuf, (float*)_b->readBuf, a_count * 2);
2020-11-02 03:57:44 +01:00
}
else {
2021-03-29 21:53:43 +02:00
volk_32f_x2_subtract_32f(out.writeBuf, _a->readBuf, _b->readBuf, a_count);
2020-11-02 03:57:44 +01:00
}
_a->flush();
_b->flush();
if (!out.swap(a_count)) { return -1; }
2020-11-02 03:57:44 +01:00
return a_count;
}
stream<T> out;
private:
stream<T>* _a;
stream<T>* _b;
};
template <class T>
class Multiply : public generic_block<Multiply<T>> {
public:
Multiply() {}
Multiply(stream<T>* a, stream<T>* b) { init(a, b); }
void init(stream<T>* a, stream<T>* b) {
2020-06-22 16:45:57 +02:00
_a = a;
_b = b;
2020-11-02 03:57:44 +01:00
generic_block<Multiply>::registerInput(a);
generic_block<Multiply>::registerInput(b);
generic_block<Multiply>::registerOutput(&out);
2020-06-22 16:45:57 +02:00
}
2020-11-02 03:57:44 +01:00
int run() {
2021-03-29 21:53:43 +02:00
int a_count = _a->read();
2020-11-02 03:57:44 +01:00
if (a_count < 0) { return -1; }
2021-03-29 21:53:43 +02:00
int b_count = _b->read();
2020-11-02 03:57:44 +01:00
if (b_count < 0) { return -1; }
if (a_count != b_count) {
_a->flush();
_b->flush();
return 0;
2020-06-22 16:45:57 +02:00
}
2020-11-02 03:57:44 +01:00
if constexpr (std::is_same_v<T, complex_t>) {
2021-03-29 22:28:26 +02:00
volk_32fc_x2_multiply_32fc((lv_32fc_t*)out.writeBuf, (lv_32fc_t*)_a->readBuf, (lv_32fc_t*)_b->readBuf, a_count);
2020-06-22 16:45:57 +02:00
}
2020-11-02 03:57:44 +01:00
else {
volk_32f_x2_multiply_32f(out.writeBuf, _a->readBuf, _b->readBuf, a_count);
2020-06-22 16:45:57 +02:00
}
2020-11-02 03:57:44 +01:00
_a->flush();
_b->flush();
if (!out.swap(a_count)) { return -1; }
2020-11-02 03:57:44 +01:00
return a_count;
2020-06-22 16:45:57 +02:00
}
2020-11-02 03:57:44 +01:00
stream<T> out;
2020-06-22 16:45:57 +02:00
private:
2020-11-02 03:57:44 +01:00
stream<T>* _a;
stream<T>* _b;
2020-06-22 16:45:57 +02:00
};
2020-11-02 03:57:44 +01:00
}