satdump/src-core/dsp/utils/hilbert.cpp

69 lines
1.9 KiB
C++
Raw Permalink Normal View History

2025-04-24 22:34:17 +02:00
#include "hilbert.h"
#include <complex.h>
namespace satdump
{
namespace ndsp
{
2025-06-14 22:27:04 -03:00
HilbertBlock::HilbertBlock() : Block("hilbert_fc", {{"in", DSP_SAMPLE_TYPE_F32}}, {{"out", DSP_SAMPLE_TYPE_CF32}}) {}
2025-04-24 22:34:17 +02:00
HilbertBlock::~HilbertBlock()
{
if (taps != nullptr)
volk_free(taps);
if (buffer != nullptr)
volk_free(buffer);
}
bool HilbertBlock::work()
{
2025-08-29 15:04:58 +02:00
DSPBuffer iblk = inputs[0].fifo->wait_dequeue();
2025-04-24 22:34:17 +02:00
if (iblk.isTerminator())
{
if (iblk.terminatorShouldPropagate())
2025-08-29 15:04:58 +02:00
outputs[0].fifo->wait_enqueue(outputs[0].fifo->newBufferTerminator());
inputs[0].fifo->free(iblk);
2025-04-24 22:34:17 +02:00
return true;
}
if (needs_reinit)
{
needs_reinit = false;
init();
}
float *ibuf = iblk.getSamples<float>();
lbuf_size = iblk.size > buffer_size ? buffer_size : iblk.size;
lbuf_offset = 0;
while (lbuf_offset < iblk.size)
{
2025-09-25 17:25:13 +01:00
DSPBuffer oblk = outputs[0].fifo->newBufferSamples(lbuf_size, sizeof(complex_t));
2025-04-24 22:34:17 +02:00
complex_t *obuf = oblk.getSamples<complex_t>();
2025-06-14 22:27:04 -03:00
memcpy(&buffer[p_ntaps], ibuf + lbuf_offset, lbuf_size * sizeof(float));
2025-04-24 22:34:17 +02:00
for (int i = 0; i < lbuf_size; i++)
{
2025-06-14 22:27:04 -03:00
volk_32f_x2_dot_prod_32f(&obuf[i].imag, &buffer[i], taps, p_ntaps);
obuf[i].real = buffer[i + p_ntaps / 2];
2025-04-24 22:34:17 +02:00
}
oblk.size = lbuf_size;
outputs[0].fifo->wait_enqueue(oblk);
2025-06-14 22:27:04 -03:00
memmove(&buffer[0], &buffer[lbuf_size], p_ntaps * sizeof(float));
2025-04-24 22:34:17 +02:00
lbuf_offset += lbuf_size;
}
2025-08-29 15:04:58 +02:00
inputs[0].fifo->free(iblk);
2025-04-24 22:34:17 +02:00
return false;
}
} // namespace ndsp
2025-06-14 22:27:04 -03:00
} // namespace satdump