Files
SDRPlusPlus/core/src/dsp/noise_reduction/squelch.h
2022-06-20 19:55:13 +02:00

65 lines
1.8 KiB
C++

#pragma once
#include "../processor.h"
// TODO: Rewrite better!!!!!
namespace dsp::noise_reduction {
class Squelch : public Processor<complex_t, complex_t> {
using base_type = Processor<complex_t, complex_t>;
public:
Squelch() {}
Squelch(stream<complex_t>* in, double level) {}
~Squelch() {
if (!base_type::_block_init) { return; }
base_type::stop();
buffer::free(normBuffer);
}
void init(stream<complex_t>* in, double level) {
_level = level;
normBuffer = buffer::alloc<float>(STREAM_BUFFER_SIZE);
base_type::init(in);
}
void setLevel(double level) {
assert(base_type::_block_init);
std::lock_guard<std::recursive_mutex> lck(base_type::ctrlMtx);
_level = level;
}
inline int process(int count, const complex_t* in, complex_t* out) {
float sum;
volk_32fc_magnitude_32f(normBuffer, (lv_32fc_t*)in, count);
volk_32f_accumulator_s32f(&sum, normBuffer, count);
sum /= (float)count;
if (10.0f * log10f(sum) >= _level) {
memcpy(out, in, count * sizeof(complex_t));
}
else {
memset(out, 0, count * sizeof(complex_t));
}
return count;
}
//DEFAULT_PROC_RUN();
int run() {
int count = base_type::_in->read();
if (count < 0) { return -1; }
process(count, base_type::_in->readBuf, base_type::out.writeBuf);
base_type::_in->flush();
if (!base_type::out.swap(count)) { return -1; }
return count;
}
private:
float* normBuffer;
float _level = -50.0f;
};
}