Polyphase Channelizer (channelizer)
64-channel uniform polyphase channelizer: splits one complex-baseband input stream into 64 equally spaced sub-channels and forwards a single, runtime-selected channel to the output.
Function
The channelizer decomposes a wideband complex input into N = 64 uniformly
spaced narrowband channels using a polyphase filterbank followed by an
N-point DFT. Conceptually the input is filtered by a low-pass prototype
that has been modulated to each channel’s center and decimated, which the
polyphase identity computes efficiently as one filter bank plus a DFT.
The center frequency of channel k relative to the input center frequency
f_c and complex sample rate f_s is given in
(4).
In (4):
\(k\) is the channel (output bin) index,
0 .. N-1.\(f_c\) is the input center frequency (the tune frequency that was down-converted to complex baseband).
\(f_s\) is the complex input sample rate.
\(N = 64\) is the number of channels.
Channel 0 is the DC bin and therefore sits exactly on f_c. Channels
1 .. 31 are the positive offsets and channels 33 .. 63 are the
negative offsets; channel 32 is the Nyquist bin at the
\(\pm f_s/2\) band edge. The channel spacing is \(f_s / N\) and the
total coverage is \(f_s\) centered on \(f_c\).
The decimation factor M = 16 makes this a 4x-oversampled channelizer
(M < N): each channel is produced at f_s / M samples per second with
guard band, rather than the critically sampled f_s / N.
Worked example (libresdr deployment in the 70 cm / “440” amateur band, \(f_c\) = 440 MHz, \(f_s\) = 10 MHz): channel spacing = 156.25 kHz, total coverage 435 - 445 MHz (inside the 420 - 450 MHz US 70 cm allocation), per-channel output rate 625 ksps. Representative channels from (4) are listed in Table 10:.
Channel |
Offset from center |
Frequency (MHz) |
|---|---|---|
0 |
0 (DC / center) |
440.000000 |
1 |
+156.25 kHz |
440.156250 |
16 |
+2.50 MHz |
442.500000 |
31 |
+4.84375 MHz |
444.843750 |
32 |
+/-5 MHz (Nyquist edge) |
445.000000 / 435.000000 |
33 |
-4.84375 MHz |
435.156250 |
48 |
-2.50 MHz |
437.500000 |
63 |
-156.25 kHz |
439.843750 |
This component forwards one channel at a time, chosen at run time by the
channel_select property (see the worker documentation). Selecting all 64
channels simultaneously is out of scope for this component.
Interface
<?xml version='1.0' encoding='utf-8'?>
<ComponentSpec>
<port name="input" producer="false" protocol="complex_short_timed_sample-prot"/>
<!-- output_0 is always present; output_1..3 are optional so a single
msk_demod_x16 (on output_0) can be instantiated without wiring all four.
Bins routed to an unconnected port are silently dropped in the worker. -->
<port name="output_0" producer="true" protocol="complex_short_timed_sample-prot"/>
<port name="output_1" producer="true" optional="true" protocol="complex_short_timed_sample-prot"/>
<port name="output_2" producer="true" optional="true" protocol="complex_short_timed_sample-prot"/>
<port name="output_3" producer="true" optional="true" protocol="complex_short_timed_sample-prot"/>
</ComponentSpec>
Opcode Handling
On the input port, sample opcodes drive the channelizer. Non-sample
opcodes (time, sample_interval, flush, discontinuity,
metadata) are consumed without being fed to the DSP datapath. The
output port emits only sample opcodes for the selected channel.
Ports
Inputs:
input: Wideband complex-baseband samples (complex_short_timed_sample).Protocol:
complex_short_timed_sample-protOptional:
False
Outputs:
output_0Protocol:
complex_short_timed_sample-protOptional:
False
output_1Protocol:
complex_short_timed_sample-protOptional:
True
output_2Protocol:
complex_short_timed_sample-protOptional:
True
output_3Protocol:
complex_short_timed_sample-protOptional:
True
Properties
Runtime control is defined at the worker level (channel_select,
out_shift, overflow_count); see the implementation documentation.
Implementations
Dependencies
The dependencies to other elements in OpenCPI are:
None outside the worker’s own source files (the polyphase filterbank, R2SDF FFT, and embedded coefficient package are all self-contained).
There is also a dependency on:
ieee.std_logic_1164
ieee.numeric_std
ieee.math_real(twiddle ROM generation at elaboration)
Limitations
Limitations of channelizer are:
Only one channel is forwarded at a time (selected by
channel_select).
N = 64channels,M = 16decimation, and 24 taps/branch are compile-time fixed; the filter coefficients are embedded in a generated package (haifuraiya_coeffs_pkg).The 40-bit internal accumulator is truncated to the 16-bit
complex_shortoutput via theout_shiftproperty; the observation gain must be set appropriately for the signal level.Output is delayed by one channelizer frame relative to the input frame (frame
Nbins emerge during frameN+1).
Testing
Tested platforms: None