FERS 0.1.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
fers_signal::DownsamplingSink Class Reference

Stateful FIR decimator for chunked streaming output. More...

#include "dsp_filters.h"

Public Member Functions

 DownsamplingSink ()
 
void consume (std::span< const ComplexType > block)
 
void finish ()
 
std::vector< ComplexTypetakeOutput ()
 
void reset ()
 
std::uint64_t inputSampleCount () const noexcept
 
std::uint64_t outputSampleCount () const noexcept
 
unsigned ratio () const noexcept
 

Detailed Description

Stateful FIR decimator for chunked streaming output.

This sink uses the same Blackman-windowed FIR design as downsample, but keeps filter history across input blocks and only zero-pads when finish() is called.

Definition at line 50 of file dsp_filters.h.

Constructor & Destructor Documentation

◆ DownsamplingSink()

fers_signal::DownsamplingSink::DownsamplingSink ( )

Definition at line 216 of file dsp_filters.cpp.

216 : _ratio(params::oversampleRatio())
217 {
219 if (_ratio <= 1)
220 {
221 return;
222 }
223
224 const unsigned filter_length = params::renderFilterLength();
225 const auto design = blackmanFir(1 / static_cast<RealType>(_ratio), _ratio, filter_length);
226 _coeffs = design.coeffs;
227 _line.assign(_coeffs.size(), ComplexType{0.0, 0.0});
228 _delay = _coeffs.size() / 2u;
229 }
double RealType
Type for real numbers.
Definition config.h:27
std::complex< RealType > ComplexType
Type for complex numbers.
Definition config.h:35
unsigned oversampleRatio() noexcept
Get the oversampling ratio.
Definition parameters.h:151
unsigned renderFilterLength() noexcept
Get the render filter length.
Definition parameters.h:139
math::Vec3 max

References max, and params::renderFilterLength().

+ Here is the call graph for this function:

Member Function Documentation

◆ consume()

void fers_signal::DownsamplingSink::consume ( std::span< const ComplexType block)

Definition at line 231 of file dsp_filters.cpp.

232 {
233 if (_finished)
234 {
235 throw std::logic_error("Cannot consume downsampler input after finish");
236 }
237 if (block.empty())
238 {
239 return;
240 }
241
242 if (_ratio <= 1)
243 {
244 _pending.insert(_pending.end(), block.begin(), block.end());
245 _input_sample_count += block.size();
246 _processed_sample_count += block.size();
247 _next_output_index += block.size();
248 return;
249 }
250
251 for (const auto& sample : block)
252 {
253 const auto filtered = processOne(sample);
254 ++_input_sample_count;
255 maybeEmit(filtered);
256 ++_processed_sample_count;
257 }
258 }

References max.

◆ finish()

void fers_signal::DownsamplingSink::finish ( )

Definition at line 260 of file dsp_filters.cpp.

261 {
262 if (_finished)
263 {
264 return;
265 }
266 _finished = true;
267 if (_ratio <= 1)
268 {
269 return;
270 }
271
272 _target_output_count = _input_sample_count / _ratio;
273 while (_next_output_index < _target_output_count)
274 {
275 const auto filtered = processOne(ComplexType{0.0, 0.0});
276 maybeEmit(filtered);
277 ++_processed_sample_count;
278 }
279 }

References max.

◆ inputSampleCount()

std::uint64_t fers_signal::DownsamplingSink::inputSampleCount ( ) const
noexcept

Definition at line 60 of file dsp_filters.h.

60{ return _input_sample_count; }

◆ outputSampleCount()

std::uint64_t fers_signal::DownsamplingSink::outputSampleCount ( ) const
noexcept

Definition at line 61 of file dsp_filters.h.

61{ return _next_output_index; }

◆ ratio()

unsigned fers_signal::DownsamplingSink::ratio ( ) const
noexcept

Definition at line 62 of file dsp_filters.h.

62{ return _ratio; }

◆ reset()

void fers_signal::DownsamplingSink::reset ( )

Definition at line 288 of file dsp_filters.cpp.

289 {
290 std::ranges::fill(_line, ComplexType{0.0, 0.0});
291 _pending.clear();
292 _input_sample_count = 0;
293 _processed_sample_count = 0;
294 _next_output_index = 0;
295 _target_output_count = 0;
296 _finished = false;
297 }

◆ takeOutput()

std::vector< ComplexType > fers_signal::DownsamplingSink::takeOutput ( )

Definition at line 281 of file dsp_filters.cpp.

282 {
283 std::vector<ComplexType> out;
284 out.swap(_pending);
285 return out;
286 }

References max.


The documentation for this class was generated from the following files: