GNU Radio 3.7.1 C++ API
|
abstract base class for ATSC equalizer More...
#include <equalizer_impl.h>
Public Member Functions | |
atsci_equalizer () | |
virtual | ~atsci_equalizer () |
virtual std::vector< double > | taps () |
virtual void | reset () |
reset state (e.g., on channel change) | |
virtual void | filter (const float *input_samples, const atsc::syminfo *input_tags, float *output_samples, int nsamples) |
produce nsamples of output from given inputs and tags | |
virtual int | ntaps () const =0 |
how much history the input data stream requires. | |
virtual int | npretaps () const =0 |
how many taps are "in the future". | |
Protected Member Functions | |
virtual void | filter_normal (const float *input_samples, float *output_samples, int nsamples)=0 |
virtual void | filter_data_seg_sync (const float *input_samples, float *output_samples, int nsamples, int offset)=0 |
virtual void | filter_field_sync (const float *input_samples, float *output_samples, int nsamples, int offset, int which_field)=0 |
abstract base class for ATSC equalizer
virtual atsci_equalizer::~atsci_equalizer | ( | ) | [virtual] |
virtual void atsci_equalizer::filter | ( | const float * | input_samples, |
const atsc::syminfo * | input_tags, | ||
float * | output_samples, | ||
int | nsamples | ||
) | [virtual] |
produce nsamples
of output from given inputs and tags
This is the main entry point. It examines the input_tags and local state and invokes the appropriate virtual function to handle each sub-segment of the input data.
input_samples
must have (nsamples + ntaps() - 1) valid entries. input_samples[0] .. input_samples[nsamples - 1 + ntaps() - 1] are referenced to compute the output values.
input_tags
must have nsamples valid entries. input_tags[0] .. input_tags[nsamples - 1] are referenced to compute the output values.
virtual void atsci_equalizer::filter_data_seg_sync | ( | const float * | input_samples, |
float * | output_samples, | ||
int | nsamples, | ||
int | offset | ||
) | [protected, pure virtual] |
Input range is known to consist of only a data segment sync or a portion of a data segment sync. nsamples
will be in [1,4]. offset
will be in [0,3]. offset
is the offset of the input from the beginning of the data segment sync pattern.
input_samples
has (nsamples + ntaps() - 1) valid entries. input_samples[0] .. input_samples[nsamples - 1 + ntaps() - 1] may be referenced to compute the output values.
Implemented in atsci_equalizer_lms, atsci_equalizer_nop, and atsci_equalizer_lms2.
virtual void atsci_equalizer::filter_field_sync | ( | const float * | input_samples, |
float * | output_samples, | ||
int | nsamples, | ||
int | offset, | ||
int | which_field | ||
) | [protected, pure virtual] |
Input range is known to consist of only a field sync segment or a portion of a field sync segment. nsamples
will be in [1,832]. offset
will be in [0,831]. offset
is the offset of the input from the beginning of the data segment sync pattern. We consider the 4 symbols of the immediately preceding data segment sync to be the first symbols of the field sync segment. which_field
is in [0,1] and specifies which field (duh).
input_samples
has (nsamples + ntaps() - 1) valid entries. input_samples[0] .. input_samples[nsamples - 1 + ntaps() - 1] may be referenced to compute the output values.
Implemented in atsci_equalizer_lms, atsci_equalizer_nop, and atsci_equalizer_lms2.
virtual void atsci_equalizer::filter_normal | ( | const float * | input_samples, |
float * | output_samples, | ||
int | nsamples | ||
) | [protected, pure virtual] |
Input range is known NOT TO CONTAIN data segment syncs or field syncs. This should be the fast path. In the non decicion directed case, this just runs the input through the filter without adapting it.
input_samples
has (nsamples + ntaps() - 1) valid entries. input_samples[0] .. input_samples[nsamples - 1 + ntaps() - 1] may be referenced to compute the output values.
Implemented in atsci_equalizer_lms, atsci_equalizer_nop, and atsci_equalizer_lms2.
virtual int atsci_equalizer::npretaps | ( | ) | const [pure virtual] |
how many taps are "in the future".
This allows us to handle what the ATSC folks call "pre-ghosts". What it really does is allow the caller to jack with the offset between the tags and the data so that everything magically works out.
npretaps () must return a value between 0 and ntaps() - 1.
If npretaps () returns 0, this means that the equalizer will only handle multipath "in the past." I suspect that a good value would be something like 15% - 20% of ntaps ().
Implemented in atsci_equalizer_nop, atsci_equalizer_lms2, and atsci_equalizer_lms.
virtual int atsci_equalizer::ntaps | ( | ) | const [pure virtual] |
how much history the input data stream requires.
This must return a value >= 1. Think of this as the number of samples you need to look at to compute a single output sample.
Implemented in atsci_equalizer_nop, atsci_equalizer_lms2, and atsci_equalizer_lms.
virtual void atsci_equalizer::reset | ( | ) | [virtual] |
reset state (e.g., on channel change)
Note, subclasses must invoke the superclass's method too!
Reimplemented in atsci_equalizer_nop, atsci_equalizer_lms2, and atsci_equalizer_lms.
virtual std::vector<double> atsci_equalizer::taps | ( | ) | [inline, virtual] |
Reimplemented in atsci_equalizer_lms.