Todo
Insert todo’s here
B123VCC-OSPPFB Channeliser
This block is an oversampling polyphase filter bank (OSPPFB). It breaks a ‘wideband’ signal into multiple (e.g. 10) channels each representing an equal proportion of the input spectrum.
The oversampling_factor (e.g. 10/9). This means that the total bandwidth out is (e.g. 1.1111 times) more than the input. The transition bands (where the filter frequency response transitions from the stop band to the pass band) of a output channels’ spectrum, overlaps with the pass band of the adjacent channel. This allows the recover of the full bandwidth across the “frequency slices”, ignoring the transition bands.
Data Path Interface
Input
receives complex valued samples
with an input sample rate of approximately 3.96e9 samples per second.
input sample rate must be a multiple of 18.
there are two polarisations, X and Y, (the samples are interleaved).
Output
10 parallel complex valued streams. number_of_output_streams = 10
each output stream
output_sample_rate = input_sample_rate * oversampling_factor / number_of_output_streams / 2. This is approximately 220e6 samples per second.
dual polarisation output (interleaved).
complex values.
Behaviour
Channeliser is always running (has no external reset). Samples input generate samples out at the output sample rate (according to the input sample rate). Since it is oversampling the aggregate output rate across all outputs is more than the input rate.
If the input sample rate is not the same as the expected sample rate, then the output samples are ‘flagged’ as invalid.
The expected number of samples is provided by a FW register. The default expected sample rate is 3.96e9. This should be configured by the control software to match the sample rate expected from the receptor upstream.
FW block determines the received sample rate by counting samples between PPS inputs.
It must see two PPS inputs, with the correct number of samples between, for it to output correct (non-flagged) samples.
If an input sample is flagged then X samples at the output are flagged, X/2 before and X/2 after. Where X is TBD (on the order of 20).
The last stage of the channeliser FW applies a gain value to the output samples on a per channel, and per polarisation basis (20 different gains).
If that gain causes the output sample’s value to saturate (-1.0 <= sample <= 1.0) then the sample is flagged.
Common Terms
‘sample’ * one value of data - usually complex (real and imaginary). * values usually look gaussian distributed, with a mean of 0, and standard deviation. * has a precision in bits - usually fixed-point and less than 18b. * has an associated timestamp. This timestamp is represented as a count of samples since some epoch at the current sample rate. Will be a big number - u_int64_t. * has a PPS (pulse per second) marker - marks the first sample at the start of a new second. * has an associated flag (see ‘flagged’) * is part of a ‘stream’ with an associated sample rate. This sample rate is guaranteed to be an integer number of samples per second.
‘flagged’ * sample is valid, but contains questionable data. * samples maintain the timing, but their flag is contagious. If used in signal processing, any samples that are calculated using a flagged sample are also flagged. For example in a FIR filter of length 15, The flagged sample will infect 15 other output samples (7 before and 7 after) as it moves through the FIR filter’s delay line. * flagging is contagious between polarisations, if one polarisation is flagged, then both are flagged.
Low-level Driver API
Structs
struct config
- sample_rateu_int32_t
zero = no-config
pol: u_int8_t, valid 0 = ‘X’, 1 = ‘Y’
channel : u_int16_t, valid 0 to num_channels-1
gain: float32
struct status
sample_rate : sample_rate : u_int32_t
num_channels : int
num_polarisations : int
gains : array[num_channels * num_polarisations] config
Standard methods
Constructor()
Set identity (name, address)
recover()
Set gains to 1.0
Set default expected sample rate.
configure(struct config)
Set expected sample rate.
Set gain for one (pol, channel).
start()
Do nothing
stop(bool force = False)
Do nothing
deconfigure(struct config)
Set gain to default (1.0)
status(bool clear, struct &status)
return sample rate and gains mapping.