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).

(4)\[\begin{split}f_k = f_c + \begin{cases} k \cdot \dfrac{f_s}{N} & 0 \le k \le N/2 - 1 \\[6pt] (k - N) \cdot \dfrac{f_s}{N} & N/2 \le k \le N - 1 \end{cases}\end{split}\]

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:.

Table 10: Representative channels for \(f_c\) = 440 MHz, \(f_s\) = 10 MHz

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-prot

    • Optional: False

Outputs:

  • output_0

    • Protocol: complex_short_timed_sample-prot

    • Optional: False

  • output_1

    • Protocol: complex_short_timed_sample-prot

    • Optional: True

  • output_2

    • Protocol: complex_short_timed_sample-prot

    • Optional: True

  • output_3

    • Protocol: complex_short_timed_sample-prot

    • Optional: 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 = 64 channels, M = 16 decimation, 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_short output via the out_shift property; the observation gain must be set appropriately for the signal level.

  • Output is delayed by one channelizer frame relative to the input frame (frame N bins emerge during frame N+1).

Testing

Tested platforms: None