GNU Radio 3.6.3.1 C++ API
|
Polyphase filterbank arbitrary resampler with gr_complex input, gr_complex output and float taps. More...
#include <gr_pfb_arb_resampler_ccf.h>
Public Member Functions | |
~gr_pfb_arb_resampler_ccf () | |
void | print_taps () |
void | set_rate (float rate) |
int | general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) |
compute output items from input items | |
![]() | |
virtual | ~gr_block () |
unsigned | history () const |
void | set_history (unsigned history) |
bool | fixed_rate () const |
Return true if this block has a fixed input to output rate. | |
virtual void | forecast (int noutput_items, gr_vector_int &ninput_items_required) |
Estimate input requirements given output request. | |
virtual bool | start () |
Called to enable drivers, etc for i/o devices. | |
virtual bool | stop () |
Called to disable drivers, etc for i/o devices. | |
void | set_output_multiple (int multiple) |
Constrain the noutput_items argument passed to forecast and general_work. | |
int | output_multiple () const |
bool | output_multiple_set () const |
void | set_alignment (int multiple) |
Constrains buffers to work on a set item alignment (for SIMD) | |
int | alignment () const |
void | set_unaligned (int na) |
int | unaligned () const |
void | set_is_unaligned (bool u) |
bool | is_unaligned () const |
void | consume (int which_input, int how_many_items) |
Tell the scheduler how_many_items of input stream which_input were consumed. | |
void | consume_each (int how_many_items) |
Tell the scheduler how_many_items were consumed on each input stream. | |
void | produce (int which_output, int how_many_items) |
Tell the scheduler how_many_items were produced on output stream which_output . | |
void | set_relative_rate (double relative_rate) |
Set the approximate output rate / input rate. | |
double | relative_rate () const |
return the approximate output rate / input rate | |
virtual int | fixed_rate_ninput_to_noutput (int ninput) |
Given ninput samples, return number of output samples that will be produced. N.B. this is only defined if fixed_rate returns true. Generally speaking, you don't need to override this. | |
virtual int | fixed_rate_noutput_to_ninput (int noutput) |
Given noutput samples, return number of input samples required to produce noutput. N.B. this is only defined if fixed_rate returns true. Generally speaking, you don't need to override this. | |
uint64_t | nitems_read (unsigned int which_input) |
Return the number of items read on input stream which_input. | |
uint64_t | nitems_written (unsigned int which_output) |
Return the number of items written on output stream which_output. | |
tag_propagation_policy_t | tag_propagation_policy () |
Asks for the policy used by the scheduler to moved tags downstream. | |
void | set_tag_propagation_policy (tag_propagation_policy_t p) |
Set the policy by the scheduler to determine how tags are moved downstream. | |
int | max_noutput_items () |
Return the maximum number of output items this block will handle during a call to work. | |
void | set_max_noutput_items (int m) |
Set the maximum number of ouput items htis block will handle during a call to work. | |
void | unset_max_noutput_items () |
Clear the switch for using the max_noutput_items value of this block. | |
bool | is_set_max_noutput_items () |
Ask the block if the flag is or is not set to use the internal value of max_noutput_items during a call to work. | |
void | expand_minmax_buffer (int port) |
long | max_output_buffer (size_t i) |
Returns max buffer size on output port i . | |
void | set_max_output_buffer (long max_output_buffer) |
Sets max buffer size on all output ports. | |
void | set_max_output_buffer (int port, long max_output_buffer) |
Sets max buffer size on output port port . | |
long | min_output_buffer (size_t i) |
Returns min buffer size on output port i . | |
void | set_min_output_buffer (long min_output_buffer) |
Sets min buffer size on all output ports. | |
void | set_min_output_buffer (int port, long min_output_buffer) |
Sets min buffer size on output port port . | |
gr_block_detail_sptr | detail () const |
void | set_detail (gr_block_detail_sptr detail) |
![]() | |
virtual | ~gr_basic_block () |
long | unique_id () const |
long | symbolic_id () const |
std::string | name () const |
std::string | symbol_name () const |
gr_io_signature_sptr | input_signature () const |
gr_io_signature_sptr | output_signature () const |
gr_basic_block_sptr | to_basic_block () |
bool | alias_set () |
std::string | alias () |
pmt::pmt_t | alias_pmt () |
void | set_block_alias (std::string name) |
void | message_port_register_in (pmt::pmt_t port_id) |
void | message_port_register_out (pmt::pmt_t port_id) |
void | message_port_pub (pmt::pmt_t port_id, pmt::pmt_t msg) |
void | message_port_sub (pmt::pmt_t port_id, pmt::pmt_t target) |
void | message_port_unsub (pmt::pmt_t port_id, pmt::pmt_t target) |
virtual bool | message_port_is_hier (pmt::pmt_t port_id) |
virtual bool | message_port_is_hier_in (pmt::pmt_t port_id) |
virtual bool | message_port_is_hier_out (pmt::pmt_t port_id) |
pmt::pmt_t | message_ports_in () |
Get input message port names. | |
pmt::pmt_t | message_ports_out () |
Get output message port names. | |
void | _post (pmt::pmt_t which_port, pmt::pmt_t msg) |
bool | empty_p (pmt::pmt_t which_port) |
is the queue empty? | |
bool | empty_p () |
void | insert_tail (pmt::pmt_t which_port, pmt::pmt_t msg) |
pmt::pmt_t | delete_head_nowait (pmt::pmt_t which_port) |
pmt::pmt_t | delete_head_blocking (pmt::pmt_t which_port) |
msg_queue_t::iterator | get_iterator (pmt::pmt_t which_port) |
void | erase_msg (pmt::pmt_t which_port, msg_queue_t::iterator it) |
virtual bool | has_msg_port (pmt::pmt_t which_port) |
virtual bool | check_topology (int ninputs, int noutputs) |
Confirm that ninputs and noutputs is an acceptable combination. | |
template<typename T > | |
void | set_msg_handler (pmt::pmt_t which_port, T msg_handler) |
Set the callback that is fired when messages are available. | |
![]() | |
gr_msg_accepter () | |
~gr_msg_accepter () | |
void | post (pmt::pmt_t which_port, pmt::pmt_t msg) |
send msg to msg_accepter on port which_port | |
![]() | |
msg_accepter () | |
virtual | ~msg_accepter () |
Friends | |
GR_CORE_API gr_pfb_arb_resampler_ccf_sptr | gr_make_pfb_arb_resampler_ccf (float rate, const std::vector< float > &taps, unsigned int filter_size) |
Additional Inherited Members | |
![]() | |
enum | { WORK_CALLED_PRODUCE = -2, WORK_DONE = -1 } |
Magic return values from general_work. More... | |
enum | tag_propagation_policy_t { TPP_DONT = 0, TPP_ALL_TO_ALL = 1, TPP_ONE_TO_ONE = 2 } |
![]() | |
enum | vcolor { WHITE, GREY, BLACK } |
![]() | |
gr_block (void) | |
gr_block (const std::string &name, gr_io_signature_sptr input_signature, gr_io_signature_sptr output_signature) | |
void | set_fixed_rate (bool fixed_rate) |
void | add_item_tag (unsigned int which_output, uint64_t abs_offset, const pmt::pmt_t &key, const pmt::pmt_t &value, const pmt::pmt_t &srcid=pmt::PMT_F) |
Adds a new tag onto the given output buffer. | |
void | add_item_tag (unsigned int which_output, const gr_tag_t &tag) |
Adds a new tag onto the given output buffer. | |
void | get_tags_in_range (std::vector< gr_tag_t > &v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end) |
Given a [start,end), returns a vector of all tags in the range. | |
void | get_tags_in_range (std::vector< gr_tag_t > &v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end, const pmt::pmt_t &key) |
Given a [start,end), returns a vector of all tags in the range with a given key. | |
![]() | |
std::vector< long > | d_max_output_buffer |
std::vector< long > | d_min_output_buffer |
Polyphase filterbank arbitrary resampler with gr_complex input, gr_complex output and float taps.
This block takes in a signal stream and performs arbitrary resampling. The resampling rate can be any real number r. The resampling is done by constructing N filters where N is the interpolation rate. We then calculate D where D = floor(N/r).
Using N and D, we can perform rational resampling where N/D is a rational number close to the input rate r where we have N filters and we cycle through them as a polyphase filterbank with a stride of D so that i+1 = (i + D) % N.
To get the arbitrary rate, we want to interpolate between two points. For each value out, we take an output from the current filter, i, and the next filter i+1 and then linearly interpolate between the two based on the real resampling rate we want.
The linear interpolation only provides us with an approximation to the real sampling rate specified. The error is a quantization error between the two filters we used as our interpolation points. To this end, the number of filters, N, used determines the quantization error; the larger N, the smaller the noise. You can design for a specified noise floor by setting the filter size (parameters filter_size). The size defaults to 32 filters, which is about as good as most implementations need.
The trick with designing this filter is in how to specify the taps of the prototype filter. Like the PFB interpolator, the taps are specified using the interpolated filter rate. In this case, that rate is the input sample rate multiplied by the number of filters in the filterbank, which is also the interpolation rate. All other values should be relative to this rate.
For example, for a 32-filter arbitrary resampler and using the GNU Radio's firdes utility to build the filter, we build a low-pass filter with a sampling rate of fs, a 3-dB bandwidth of BW and a transition bandwidth of TB. We can also specify the out-of-band attenuation to use, ATT, and the filter window function (a Blackman-harris window in this case). The first input is the gain of the filter, which we specify here as the interpolation rate (32).
<B><EM>self._taps = gr.firdes.low_pass_2(32, 32*fs, BW, TB, attenuation_dB=ATT, window=gr.firdes.WIN_BLACKMAN_hARRIS)</EM></B>
The theory behind this block can be found in Chapter 7.5 of the following book.
f. harris, "Multirate Signal Processing for Communication Systems", Upper Saddle River, NJ: Prentice Hall, Inc. 2004.
gr_pfb_arb_resampler_ccf::~gr_pfb_arb_resampler_ccf | ( | ) |
|
virtual |
compute output items from input items
noutput_items | number of output items to write on each output stream |
ninput_items | number of input items available on each input stream |
input_items | vector of pointers to the input items, one entry per input stream |
output_items | vector of pointers to the output items, one entry per output stream |
general_work must call consume or consume_each to indicate how many items were consumed on each input stream.
Reimplemented from gr_block.
void gr_pfb_arb_resampler_ccf::print_taps | ( | ) |
Print all of the filterbank taps to screen.
|
inline |
References gr_block::set_relative_rate().
|
friend |
Build the polyphase filterbank arbitray resampler.
rate | (float) Specifies the resampling rate to use |
taps | (vector/list of floats) The prototype filter to populate the filterbank. The taps should be generated at the filter_size sampling rate. |
filter_size | (unsigned int) The number of filters in the filter bank. This is directly related to quantization noise introduced during the resampling. Defaults to 32 filters. |