#pragma once #include #include namespace dsp { template class Add : public generic_block> { public: Add() {} Add(stream* a, stream* b) { init(a, b); } ~Add() { generic_block::stop(); } void init(stream* a, stream* b) { _a = a; _b = b; generic_block::registerInput(a); generic_block::registerInput(b); generic_block::registerOutput(&out); } int run() { a_count = _a->read(); if (a_count < 0) { return -1; } b_count = _b->read(); if (b_count < 0) { return -1; } if (a_count != b_count) { _a->flush(); _b->flush(); return 0; } if (out.aquire() < 0) { return -1; } if constexpr (std::is_same_v || std::is_same_v) { volk_32fc_x2_add_32fc(out.data, _a->data, _b->data, a_count); } else { volk_32f_x2_add_32f(out.data, _a->data, _b->data, a_count); } _a->flush(); _b->flush(); out.write(a_count); return a_count; } stream out; private: int a_count, b_count; stream* _a; stream* _b; }; template class Multiply : public generic_block> { public: Multiply() {} Multiply(stream* a, stream* b) { init(a, b); } ~Multiply() { generic_block::stop(); } void init(stream* a, stream* b) { _a = a; _b = b; generic_block::registerInput(a); generic_block::registerInput(b); generic_block::registerOutput(&out); } int run() { a_count = _a->read(); if (a_count < 0) { return -1; } b_count = _b->read(); if (b_count < 0) { return -1; } if (a_count != b_count) { _a->flush(); _b->flush(); return 0; } if (out.aquire() < 0) { return -1; } if constexpr (std::is_same_v) { volk_32fc_x2_multiply_32fc(out.data, _a->data, _b->data, a_count); } else { volk_32f_x2_multiply_32f(out.data, _a->data, _b->data, a_count); } _a->flush(); _b->flush(); out.write(a_count); return a_count; } stream out; private: int a_count, b_count; stream* _a; stream* _b; }; }