Skip to content
Snippets Groups Projects
Commit d9eec25e authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Update beamlet header format.

parent 1b64b9c2
No related branches found
No related tags found
No related merge requests found
...@@ -127,7 +127,18 @@ UDP link control ...@@ -127,7 +127,18 @@ UDP link control
24 Byte, Flags (0-23, 1 bit per pol/dish) 24 Byte, Flags (0-23, 1 bit per pol/dish)
--> Total 40 Bytes --> Total 40 Bytes
# Arts SC1
1 Byte, Marker byte
1 Byte, Format version
2 Byte, Source id
2 Byte, Number of channels per block (N channel )
2 Byte, Number of blocks per packet (N block )
8 Byte, Timestamp
24 Byte, Flags
--> Total 40 Bytes
# Arts SC2 # Arts SC2
1 Byte, Marker (= 120) 1 Byte, Marker (= 120)
...@@ -268,7 +279,6 @@ The FPGA has 2713 M20k, so this is 128/2713 ~= 5% of the internal BRAM resources ...@@ -268,7 +279,6 @@ The FPGA has 2713 M20k, so this is 128/2713 ~= 5% of the internal BRAM resources
The total number of streams to CEP then becomes NOF_BEAMSETS * NOF_LANES. The total number of streams to CEP then becomes NOF_BEAMSETS * NOF_LANES.
- 1 Byte, MARKER - 1 Byte, MARKER
. Like in APERTIF and ARTS, may be useful to quickly recognize the data packet. . Like in APERTIF and ARTS, may be useful to quickly recognize the data packet.
. Beamlets: 98 = 0x62 = 'b' . Beamlets: 98 = 0x62 = 'b'
...@@ -290,57 +300,78 @@ The total number of streams to CEP then becomes NOF_BEAMSETS * NOF_LANES. ...@@ -290,57 +300,78 @@ The total number of streams to CEP then becomes NOF_BEAMSETS * NOF_LANES.
- 2 Byte, STATION_ID (idem as LOFAR1) - 2 Byte, STATION_ID (idem as LOFAR1)
==> or 8b because there are only ~50 stations ==> or 8b because there are only ~50 stations
==> use 16b to fit number from station name (e.g. CS001, LV614, see list of stations at ==> Use 16b to fit number from station name (e.g. 1 = CS001, 614 = LV614). The STATION_ID also indirectly reveals whether it is a core, remote or international station.
https://proxy.lofar.eu/array_status/STATIONS/HTML/cs011/index.html) see list of stations at https://proxy.lofar.eu/array_status/STATIONS/HTML/cs011/index.html)
- 4 Byte, SOURCE_INFO - 2 Byte, SOURCE_INFO
Only include info that can be inserted by SDP, without explicit write by SC. Therefore e.g. RCU mode, Only include info that can be inserted by SDP, without explicit write by SC. The packet header does
Nyquist zone, nof antenna in array are not included. not contain all info to derive the RF frequency, because it does not contain:
The packet header does not contain all info to derive the RF frequency, because it does not contain the . the subband-beamlet mapping R_bsub, because that requires many bytes
subband-beamlet mapping R_bsub. Therefore it is not necessary to include the Nyquist zone information in . the frequency_band: 0 = 10-90, 1 = 30-90, 2 = 110-190, 3 = 170-230, 4 = 210-240, 5 = 210-250 MHz,
the header. However, just for information the Nyquist zone is useful to have in the header. because these may differ per RCU2 (= RCU modes)
. 1b f_adc, sample clock frequency of the ADC, 0 = 160 MHz, 1 = 200 MHz . the Nyquist zone information, because that is an implementation detail that is redundant with the
. 2b nyuist_zone frequency_band information
. 1b pfb_type, 0 = critically PFB, 1 = oversampled PFB (rather than p, q for R_os = p/q) . the number nof antenna in array, because that that depends on the beam control which may differ per
- The f_adc and t_pfb are in the header, because this information is sufficent to know the subband beamlet.
frequency grid (f_sub = f_adc / N_fft = 195312.5 or 156250 Hz) and the subband sample rate Try use same fields as for statistics
(R_os * f_sub).
. 1b payload_error, 0 payload ok, 1 one or more blocks in payload have data errors . 1b antenna_band: 0 = LBAS, 1 = HBAS [LOFAR2-3098, 6996]
. 1b f_adc, sample clock frequency of the ADC, 0 = 160 MHz, 1 = 200 MHz [LOFAR2-3578]
. 1b fsub_type: 0 = critically sampled PFB , 1 = oversampled PFB [LOFAR2-2278]
- rather than transporting p, q for R_os = p/q
- the f_adc and fsub_type are in the header, because this information is sufficent to know the subband
frequency grid (f_sub = f_adc / N_fft = 195312.5 or 156250 Hz) and the subband sample rate (R_os * f_sub).
. 1b data_flag: 0 = data ok, 1 = data disturbed, due to repositioning of beam [LOFAR2-3123]
1b payload_error, 0 = payload data is ok, 1 one or more blocks in payload have data errors, indicating
some problem at Station (purpose: fault analysis)
- a single payload error bit means that all blocks in the payload get discarded if only only block - a single payload error bit means that all blocks in the payload get discarded if only only block
has an error. has an error.
- no need for indicator bit per block, assuming errors are rare and will result in loss of - no need for indicator bit per block, assuming errors are rare and will result in loss of
multiple blocks anyway multiple blocks anyway
. 5b beamlet_width in number of bits . 6b reserved (= 0)
- Instead of BM = beamlet mode . 5b pn_id, index of the PN FPGA on UniBoard2 in Station SDP that offloaded the data (purpose: fault analysis)
- Default 8 for W_beamlet = 8 bit
- Use 5 bit to even fit 16b mode like in LOFAR1)
. 6b pn_id = UniBoard2 FPGA ID
- Instead of RSP_ID in LOFAR1 - Instead of RSP_ID in LOFAR1
- 16 FPGAs for LBA, 16 for HBA in International Station, so maximum 32, but use one bit extra - 16 FPGAs for LBA, 16 for HBA in International Station, so maximum index 31 fits in 5 bits
- The PN ID is useful for fault diagnoses, to know the PN in SDP from which the data originated. - The PN ID is useful for fault diagnoses, to know the PN in SDP from which the data originated.
- The pn_id implicitly also reveals the antenna array ID (core station 1 LBA, 2 HBAS, 3 HBA0, 4 HBA1, ...)
Therefore it is not necessary to define an explicit antenna ARRAY_ID field that would need to be - 2 Byte, BEAMLET_INFO
filled in by SC. . 4b beamlet_width in number of bits
- Instead of BM = beamlet mode
- Default 8 for W_beamlet = 8 bit
- Use 0 bit to represent 16b mode like in LOFAR1, if necessary
. 12b beamlet_scale . 12b beamlet_scale
- 18b --> 8b, beamlet_scale = 1 yields lowest bits, beamlet_scale = 1024 (= 11b) yields highest bits - try to fit beamlet_width and beamlet_scale in 2 Bytes
- 18b --> 4b, beamlet_scale = 1 yields lowest bits, beamlet_scale = 4096 (= 13b) yields highest bits
- beamlet_scale = 1 --> suitable if only one antenna input was used for the beamlet
- beamlet_scale = 12, 24, 48, 96 --> to account for number of antennas in beam
- beamlet_scale > 96 --> to have more dynamic range, but less sensitivity. More dynamic range only makes
sense in 8b mode (or 16b mode, but not in 4b or 2b mode), therefore given the
18b beamlet sum the maximum beamlet_scale = 1024.
- In SDP the beamlet beamlet_scale function extracts the lowest 8b from the 18b beamlet sum, after having - In SDP the beamlet beamlet_scale function extracts the lowest 8b from the 18b beamlet sum, after having
multiplied the beamlet sum by 1/beamlet_scale. Internally the beamlet beamlet_scale function uses an 18b multiplied the beamlet sum by 1/beamlet_scale. Same value for all beamlets.
unsigned representation of the 1/beamlet_scale fraction, so 2**18 / beamlet_scale. This yields: - norm = 2**12 / 1024 = 4 to support beamlet_scale values with a resolution of 1/norm = 0.25
beamlet_scale = 1 --> 262144 - 18b --> 8b, beamlet_scale = 1 * norm yields lowest bits, beamlet_scale = 1024 (-1 = 10b) yields highest bits
beamlet_scale = 96 --> 2731 - 18b --> 4b, beamlet_scale = 1 * norm yields lowest bits, beamlet_scale = 4096 (-1 = 12b) yields highest bits
beamlet_scale = 1024 --> 256 - beamlet_scale is typically proportional to sqrt(nof antenna in beam) to maintain sensistivity
- larger beamlet_scale values provide more dynamic range, but less sensitivity. More dynamic range only makes
sense in 8b mode (or 16b mode, but not in 4b or 2b mode), therefore given the 18b beamlet sum the maximum
beamlet_scale = 1024 * norm = 2**10 * 2**2 = 2**12. In practise the dynamic range of beamlet_scale can
be less to have more resolution for the norm. The beamlet_scale needs at to be at least sqrt(192) = 13.4
to support scaling beamlets for a beam with all antenna inputs. For RFI the beam add coherently, so then
beamlet_scale needs to be at least 192. Therefore use 8b.4b for beamlet scale, so norm = 16
- beamlet_scale = sqrt 12 * norm = 1 * norm = 16 --> suitable if only one antenna input was used for the beamlet
sqrt 12 * norm = 3.46 * norm = 55
sqrt 24 * norm = 4.9 * norm = 78
sqrt 48 * norm = 6.93 * norm = 111
sqrt 96 * norm = 9.8 * norm = 157
sqrt 192 * norm = 13.4 * norm = 222 --> to account for number of antennas in beam
- Internally the beamlet beamlet_scale function uses an 18b unsigned representation of the 1/beamlet_scale fraction,
so 2**18 / beamlet_scale. This yields:
beamlet_scale = 1 * norm --> 16384
beamlet_scale = sqrt 96 * norm --> 1670
beamlet_scale = 256 * norm --> 64
After mutliplying the 18b.0b beamlet_sum by 1b.12b 1/beamlet_scale the result is a 24b.12b value that is rounded and
clipped to output the 8b beamlets.
- 1 Byte, reserved (= 0) - 1 Byte, reserved (= 0)
- 2 Byte, BEAMLET_INDEX = beamset_index * nof_beamlets_per_set - 2 Byte, BEAMLET_INDEX of first beamlet in the payload
. nof_beamlets_per_set = S_sub_bf = 488 . sdp_beamset_index * nof_beamlets_per_set
. nof_beamsets = 1, fixed for LOFAR2.0 stage 1 one beamset per antenna array
. beamset_index = 0 in range(nof_beamsets). . beamset_index = 0 in range(nof_beamsets).
. global beamlet index of first beamlet in block . global beamlet index of first beamlet in block
- 0: 487 for beamset 0 - 0: 487 for beamset 0
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment