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

40 lines
1.5 KiB
C++
Raw Permalink Normal View History

2025-03-09 22:57:17 +01:00
#include "cyclostationary_analysis.h"
namespace satdump
{
namespace ndsp
{
2025-08-29 15:04:58 +02:00
CyclostationaryAnalysis::CyclostationaryAnalysis() : Block("cyclostationary_analysis_cf", {{"in", DSP_SAMPLE_TYPE_CF32}}, {{"out", DSP_SAMPLE_TYPE_F32}}) {}
2025-03-09 22:57:17 +01:00
2025-04-15 19:06:12 +01:00
CyclostationaryAnalysis::~CyclostationaryAnalysis() {}
2025-03-09 22:57:17 +01:00
bool CyclostationaryAnalysis::work()
{
2025-08-29 15:04:58 +02:00
DSPBuffer iblk = inputs[0].fifo->wait_dequeue();
2025-03-09 22:57:17 +01: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-03-09 22:57:17 +01:00
return true;
}
2025-09-25 17:25:13 +01:00
auto oblk = outputs[0].fifo->newBufferSamples(iblk.max_size * 2, sizeof(float)); // complex_t = 2 floats
2025-03-09 22:57:17 +01:00
complex_t *ibuf = iblk.getSamples<complex_t>();
complex_t *obuf = oblk.getSamples<complex_t>();
2025-05-18 18:21:16 -03:00
float *obuff = oblk.getSamples<float>();
2025-03-09 22:57:17 +01:00
volk_32fc_conjugate_32fc((lv_32fc_t *)obuf, (const lv_32fc_t *)ibuf, iblk.size);
volk_32fc_x2_multiply_32fc((lv_32fc_t *)obuf, (const lv_32fc_t *)obuf, (const lv_32fc_t *)ibuf, iblk.size);
2025-05-18 18:21:16 -03:00
volk_32fc_magnitude_32f(obuff, (const lv_32fc_t *)obuf, iblk.size);
2025-03-09 22:57:17 +01:00
oblk.size = iblk.size;
outputs[0].fifo->wait_enqueue(oblk);
2025-08-29 15:04:58 +02:00
inputs[0].fifo->free(iblk);
2025-03-09 22:57:17 +01:00
return false;
}
2025-04-15 19:06:12 +01:00
} // namespace ndsp
} // namespace satdump