Line data Source code
1 : /*------------------------------------------------------------------------------
2 : -- Solar Orbiter's Low Frequency Receiver Flight Software (LFR FSW),
3 : -- This file is a part of the LFR FSW
4 : -- Copyright (C) 2021, Plasma Physics Laboratory - CNRS
5 : --
6 : -- This program is free software; you can redistribute it and/or modify
7 : -- it under the terms of the GNU General Public License as published by
8 : -- the Free Software Foundation; either version 2 of the License, or
9 : -- (at your option) any later version.
10 : --
11 : -- This program is distributed in the hope that it will be useful,
12 : -- but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : -- GNU General Public License for more details.
15 : --
16 : -- You should have received a copy of the GNU General Public License
17 : -- along with this program; if not, write to the Free Software
18 : -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 : -------------------------------------------------------------------------------*/
20 : /*-- Author : Alexis Jeandet
21 : -- Contact : Alexis Jeandet
22 : -- Mail : alexis.jeandet@lpp.polytechnique.fr
23 : ----------------------------------------------------------------------------*/
24 : #include "processing/ASM/spectralmatrices.h"
25 : #include "fsw_debug.h"
26 : #include "mitigations/PAS_filtering.h"
27 : #include "mitigations/reaction_wheel_filtering.h"
28 : #include "processing/calibration_matrices.h"
29 :
30 : inline void clear_spectral_matrix(float* spectral_matrix) __attribute__((always_inline));
31 0 : void clear_spectral_matrix(float* spectral_matrix)
32 : {
33 : DEBUG_CHECK_PTR(spectral_matrix);
34 30473397 : for (int i = 0; i < TOTAL_SIZE_SM; i++)
35 : {
36 30464000 : spectral_matrix[i] = 0.f;
37 : }
38 0 : }
39 :
40 41834 : void SM_average(float* averaged_spec_mat_NORM, float* averaged_spec_mat_SBM,
41 : ring_node* ring_node_tab[], unsigned int nbAverageNORM, unsigned int nbAverageSBM,
42 : asm_msg* msgForMATR, unsigned char channel, unsigned int start_bin, unsigned int bins_count)
43 : {
44 : DEBUG_CHECK_PTR(averaged_spec_mat_NORM);
45 : DEBUG_CHECK_PTR(averaged_spec_mat_SBM);
46 : DEBUG_CHECK_PTR(ring_node_tab);
47 : DEBUG_CHECK_PTR(msgForMATR);
48 :
49 41834 : unsigned int numberOfValidSM = 0U;
50 : int* valid_matrices[8];
51 376994 : for (int SM_index = 0; SM_index < NB_SM_BEFORE_AVF0_F1; SM_index++)
52 : {
53 670322 : if (acquisitionTimeIsValid(
54 670322 : ring_node_tab[SM_index]->coarseTime, ring_node_tab[SM_index]->fineTime, channel))
55 : {
56 298094 : valid_matrices[numberOfValidSM] = (int*)(ring_node_tab[SM_index]->buffer_address);
57 298094 : numberOfValidSM++;
58 : }
59 : }
60 :
61 41833 : if (nbAverageNORM == 0)
62 : {
63 : clear_spectral_matrix(averaged_spec_mat_NORM);
64 1610 : msgForMATR->coarseTimeNORM = ring_node_tab[0]->coarseTime;
65 1610 : msgForMATR->fineTimeNORM = ring_node_tab[0]->fineTime;
66 1610 : msgForMATR->numberOfSMInASMNORM = numberOfValidSM;
67 : }
68 : else
69 : {
70 :
71 40223 : msgForMATR->numberOfSMInASMNORM += numberOfValidSM;
72 : }
73 :
74 41833 : if (nbAverageSBM == 0)
75 : {
76 : clear_spectral_matrix(averaged_spec_mat_SBM);
77 7787 : msgForMATR->coarseTimeSBM = ring_node_tab[0]->coarseTime;
78 7787 : msgForMATR->fineTimeSBM = ring_node_tab[0]->fineTime;
79 7787 : msgForMATR->numberOfSMInASMSBM = numberOfValidSM;
80 : }
81 : else
82 : {
83 34046 : msgForMATR->numberOfSMInASMSBM += numberOfValidSM;
84 : }
85 :
86 41833 : unsigned int block_offset = 0;
87 250693 : for (unsigned int line = 0; line < 5; line++)
88 : {
89 835440 : for (unsigned int column = line; column < 5; column++)
90 : {
91 : // Looping this way is 40% faster ~ 32ms Vs ~54ms
92 : // Skiping discarded frequencies gives another speedup
93 : unsigned int start_index;
94 : unsigned int stop_index;
95 626580 : if (line == column) // pure reals
96 : {
97 207889 : start_index = block_offset + start_bin;
98 207889 : stop_index = start_index + bins_count;
99 : }
100 : else // complexes
101 : {
102 418691 : start_index = block_offset + (start_bin * 2);
103 418691 : stop_index = start_index + (bins_count * 2);
104 : }
105 :
106 47860016 : for (unsigned int i = start_index; i < stop_index; i += 2)
107 : {
108 47233436 : register float sum1 = 0.;
109 47233436 : register float sum2 = 0.;
110 383221557 : for (unsigned int SM_index = 0; SM_index < numberOfValidSM; SM_index++)
111 : {
112 335988121 : sum1 += (float)(valid_matrices[SM_index][i]);
113 335988121 : sum2 += (float)(valid_matrices[SM_index][i + 1]);
114 : }
115 47233436 : averaged_spec_mat_SBM[i] += sum1;
116 47233436 : averaged_spec_mat_NORM[i] += sum1;
117 :
118 47233436 : averaged_spec_mat_SBM[i + 1] += sum2;
119 47233436 : averaged_spec_mat_NORM[i + 1] += sum2;
120 : }
121 626580 : if (line == column) // pure reals
122 : {
123 207940 : block_offset += NB_BINS_PER_SM;
124 : }
125 : else // complexes
126 : {
127 418640 : block_offset += NB_BINS_PER_SM * 2;
128 : }
129 : }
130 : }
131 41833 : }
132 :
133 2904 : void SM_average_f2(float* averaged_spec_mat_f2, ring_node* ring_node, unsigned int nbAverageNormF2,
134 : asm_msg* msgForMATR)
135 : {
136 : DEBUG_CHECK_PTR(averaged_spec_mat_f2);
137 : DEBUG_CHECK_PTR(ring_node);
138 : DEBUG_CHECK_PTR(msgForMATR);
139 : DEBUG_PRINTF("in SM_average_f2");
140 : float sm_bin;
141 : unsigned char keepMatrix;
142 :
143 : // test acquisitionTime validity
144 2904 : keepMatrix = acquisitionTimeIsValid(ring_node->coarseTime, ring_node->fineTime, CHANNELF2);
145 :
146 9202875 : for (unsigned int i = 0; i < TOTAL_SIZE_SM; i++)
147 : {
148 9200000 : sm_bin = (float)(((int*)(ring_node->buffer_address))[i]);
149 9200000 : if (nbAverageNormF2 == 0) // average initialization
150 : {
151 2559349 : if (keepMatrix == MATRIX_IS_NOT_POLLUTED) // keep the matrix and add it to the average
152 : {
153 1829749 : averaged_spec_mat_f2[i] = sm_bin;
154 : }
155 : else // drop the matrix and initialize the average
156 : {
157 729600 : averaged_spec_mat_f2[i] = INIT_FLOAT;
158 : }
159 2559349 : msgForMATR->coarseTimeNORM = ring_node->coarseTime;
160 2559349 : msgForMATR->fineTimeNORM = ring_node->fineTime;
161 : }
162 : else
163 : {
164 6640651 : if (keepMatrix == MATRIX_IS_NOT_POLLUTED) // keep the matrix and add it to the average
165 : {
166 5425089 : averaged_spec_mat_f2[i] = (averaged_spec_mat_f2[i] + sm_bin);
167 : }
168 : else
169 : {
170 : // nothing to do, the matrix is not valid
171 : }
172 : }
173 : }
174 :
175 2875 : if (keepMatrix == MATRIX_IS_NOT_POLLUTED)
176 : {
177 2261 : if (nbAverageNormF2 == 0)
178 : {
179 571 : msgForMATR->numberOfSMInASMNORM = 1;
180 : }
181 : else
182 : {
183 1690 : msgForMATR->numberOfSMInASMNORM++;
184 : }
185 : }
186 : else
187 : {
188 614 : if (nbAverageNormF2 == 0)
189 : {
190 228 : msgForMATR->numberOfSMInASMNORM = 0;
191 : }
192 : else
193 : {
194 : // nothing to do
195 : }
196 : }
197 : DEBUG_PRINTF("leaving SM_average_f2");
198 2875 : }
199 :
200 :
201 6992 : void ASM_compress_divide_and_mask(const float* const averaged_spec_mat, float* compressed_spec_mat,
202 : const float divider, const unsigned char nbBinsCompressedMatrix,
203 : const unsigned char nbBinsToAverage, const unsigned char ASMIndexStart,
204 : const unsigned char channel)
205 : {
206 : DEBUG_CHECK_PTR(averaged_spec_mat);
207 : DEBUG_CHECK_PTR(compressed_spec_mat);
208 : //*************
209 : // input format
210 : // matr0[0 .. 24] matr1[0 .. 24] .. matr127[0 .. 24]
211 : //************
212 : // compression
213 : // matr0[0 .. 24] matr1[0 .. 24] .. matr11[0 .. 24] => f0 NORM
214 : // matr0[0 .. 24] matr1[0 .. 24] .. matr22[0 .. 24] => f0 BURST,
215 : // SBM
216 :
217 : // BUILD DATA
218 : // Just zero the whole compressed ASM
219 : // has to be done either way if divider==0. or to initialize average
220 : {
221 3739567 : for (int i = 0; i < nbBinsCompressedMatrix * NB_FLOATS_PER_SM; i++)
222 : {
223 3732575 : compressed_spec_mat[i] = 0.;
224 : }
225 : }
226 6992 : if (divider != 0.f)
227 : {
228 6669 : int freq_offset = ASMIndexStart;
229 6669 : const float* input_asm_ptr = averaged_spec_mat + (ASMIndexStart * NB_FLOATS_PER_SM);
230 6669 : float* compressed_asm_ptr = compressed_spec_mat;
231 155535 : for (int compressed_frequency_bin = 0; compressed_frequency_bin < nbBinsCompressedMatrix;
232 142197 : compressed_frequency_bin++)
233 : {
234 766221 : for (int frequency_bin = 0; frequency_bin < nbBinsToAverage; frequency_bin++)
235 : {
236 624024 : int fBinMask = getFBinMask(freq_offset, channel);
237 624024 : compressed_asm_ptr
238 624024 : = compressed_spec_mat + (compressed_frequency_bin * NB_FLOATS_PER_SM);
239 16224624 : for (int asm_component = 0; asm_component < NB_FLOATS_PER_SM; asm_component++)
240 : {
241 15600600 : *compressed_asm_ptr += (*input_asm_ptr * (float)fBinMask);
242 15600600 : compressed_asm_ptr++;
243 15600600 : input_asm_ptr++;
244 : }
245 624024 : freq_offset++;
246 : }
247 : }
248 3561594 : for (int i = 0; i < nbBinsCompressedMatrix * NB_FLOATS_PER_SM; i++)
249 : {
250 3554925 : compressed_spec_mat[i] = compressed_spec_mat[i] / (divider * nbBinsToAverage);
251 : }
252 : }
253 6992 : }
254 :
255 45 : void ASM_divide(const float* averaged_spec_mat, float* averaged_spec_mat_normalized,
256 : const float divider, unsigned int start_indice, unsigned int stop_indice)
257 : {
258 : DEBUG_CHECK_PTR(averaged_spec_mat);
259 : DEBUG_CHECK_PTR(averaged_spec_mat_normalized);
260 : // BUILD DATA
261 45 : if (divider == 0.)
262 : {
263 0 : for (unsigned int i = (start_indice * NB_FLOATS_PER_SM);
264 0 : i < (stop_indice * NB_FLOATS_PER_SM); i++)
265 : {
266 0 : averaged_spec_mat_normalized[i] = 0.;
267 : }
268 : }
269 : else
270 : {
271 45 : const float coef = 1.f / divider;
272 108090 : for (unsigned int i = (start_indice * NB_FLOATS_PER_SM);
273 108000 : i < (stop_indice * NB_FLOATS_PER_SM); i++)
274 : {
275 108000 : averaged_spec_mat_normalized[i] = averaged_spec_mat[i] * coef;
276 : }
277 : }
278 45 : }
279 :
280 :
281 : // clang-format off
282 : /*
283 : * This function performs a specific 5x5 matrix change of basis with the folowing assumptions
284 : T*
285 : output_matrix mag_transition_matrix input_matrix mag_transition_matrix
286 : | | | |
287 : v v v v
288 : | |SM11| SM12 SM13 SM14 SM15 | | B11 B21 B31 0 0 | | |SM11| SM12 SM13 SM14 SM15 | | B11 B12 B13 0 0 |
289 : | |SM22| SM23 SM24 SM25 | | B12 B22 B32 0 0 | | |SM22| SM23 SM24 SM25 | | B21 B22 B23 0 0 |
290 : | |SM33| SM34 SM35 | = | B13 B23 B33 0 0 | X | |SM33| SM34 SM35 | X | B31 B32 B33 0 0 |
291 : | |SM44| SM45 | | 0 0 0 E11 E21 | | |SM44| SM45 | | 0 0 0 E11 E12 |
292 : | |SM55| | | 0 0 0 E12 E22 | | |SM55| | | 0 0 0 E21 E22 |
293 : ^ ^
294 : | | T*
295 : elec_transition_matrix elec_transition_matrix
296 : Where each matrix product is done sequencialy for mag and elec transition matrices
297 : Note that this code is generated with LFR_Flight_Software/python_scripts/Matrix_calibration_code_gen.ipynb
298 : */
299 : // clang-format on
300 652448 : void Matrix_change_of_basis(_Complex float _intermediary[25], const float* input_matrix,
301 : const float* mag_transition_matrix, const float* elec_transition_matrix, float* output_matrix)
302 : {
303 : DEBUG_CHECK_PTR(_intermediary);
304 : DEBUG_CHECK_PTR(input_matrix);
305 : DEBUG_CHECK_PTR(mag_transition_matrix);
306 : DEBUG_CHECK_PTR(elec_transition_matrix);
307 : DEBUG_CHECK_PTR(output_matrix);
308 :
309 652448 : float* intermediary = (float*)_intermediary;
310 1304896 : intermediary[0] = input_matrix[0] * mag_transition_matrix[0]
311 652448 : + input_matrix[1] * mag_transition_matrix[2] + input_matrix[3] * mag_transition_matrix[4]
312 652448 : - (-input_matrix[2]) * mag_transition_matrix[3]
313 652448 : - (-input_matrix[4]) * mag_transition_matrix[5];
314 1304896 : intermediary[1] = input_matrix[0] * mag_transition_matrix[1]
315 652448 : + input_matrix[1] * mag_transition_matrix[3] + input_matrix[3] * mag_transition_matrix[5]
316 652448 : + mag_transition_matrix[2] * (-input_matrix[2])
317 652448 : + mag_transition_matrix[4] * (-input_matrix[4]);
318 1304896 : intermediary[2] = input_matrix[9] * mag_transition_matrix[2]
319 652448 : + input_matrix[1] * mag_transition_matrix[0] + input_matrix[10] * mag_transition_matrix[4]
320 652448 : - input_matrix[2] * mag_transition_matrix[1]
321 652448 : - (-input_matrix[11]) * mag_transition_matrix[5];
322 1304896 : intermediary[3] = input_matrix[9] * mag_transition_matrix[3]
323 652448 : + input_matrix[1] * mag_transition_matrix[1] + input_matrix[10] * mag_transition_matrix[5]
324 652448 : + mag_transition_matrix[0] * input_matrix[2]
325 652448 : + mag_transition_matrix[4] * (-input_matrix[11]);
326 1304896 : intermediary[4] = input_matrix[16] * mag_transition_matrix[4]
327 652448 : + input_matrix[3] * mag_transition_matrix[0] + input_matrix[10] * mag_transition_matrix[2]
328 652448 : - input_matrix[4] * mag_transition_matrix[1] - input_matrix[11] * mag_transition_matrix[3];
329 1304896 : intermediary[5] = input_matrix[16] * mag_transition_matrix[5]
330 652448 : + input_matrix[3] * mag_transition_matrix[1] + input_matrix[10] * mag_transition_matrix[3]
331 652448 : + mag_transition_matrix[0] * input_matrix[4] + mag_transition_matrix[2] * input_matrix[11];
332 1304896 : intermediary[6] = input_matrix[5] * mag_transition_matrix[0]
333 652448 : + input_matrix[12] * mag_transition_matrix[2] + input_matrix[17] * mag_transition_matrix[4]
334 652448 : - input_matrix[6] * mag_transition_matrix[1] - input_matrix[13] * mag_transition_matrix[3]
335 652448 : - input_matrix[18] * mag_transition_matrix[5];
336 1304896 : intermediary[7] = input_matrix[5] * mag_transition_matrix[1]
337 652448 : + input_matrix[12] * mag_transition_matrix[3] + input_matrix[17] * mag_transition_matrix[5]
338 652448 : + mag_transition_matrix[0] * input_matrix[6] + mag_transition_matrix[2] * input_matrix[13]
339 652448 : + mag_transition_matrix[4] * input_matrix[18];
340 1304896 : intermediary[8] = input_matrix[7] * mag_transition_matrix[0]
341 652448 : + input_matrix[14] * mag_transition_matrix[2] + input_matrix[19] * mag_transition_matrix[4]
342 652448 : - input_matrix[8] * mag_transition_matrix[1] - input_matrix[15] * mag_transition_matrix[3]
343 652448 : - input_matrix[20] * mag_transition_matrix[5];
344 1304896 : intermediary[9] = input_matrix[7] * mag_transition_matrix[1]
345 652448 : + input_matrix[14] * mag_transition_matrix[3] + input_matrix[19] * mag_transition_matrix[5]
346 652448 : + mag_transition_matrix[0] * input_matrix[8] + mag_transition_matrix[2] * input_matrix[15]
347 652448 : + mag_transition_matrix[4] * input_matrix[20];
348 1304896 : intermediary[10] = input_matrix[0] * mag_transition_matrix[6]
349 652448 : + input_matrix[1] * mag_transition_matrix[8] + input_matrix[3] * mag_transition_matrix[10]
350 652448 : - (-input_matrix[2]) * mag_transition_matrix[9]
351 652448 : - (-input_matrix[4]) * mag_transition_matrix[11];
352 1304896 : intermediary[11] = input_matrix[0] * mag_transition_matrix[7]
353 652448 : + input_matrix[1] * mag_transition_matrix[9] + input_matrix[3] * mag_transition_matrix[11]
354 652448 : + mag_transition_matrix[8] * (-input_matrix[2])
355 652448 : + mag_transition_matrix[10] * (-input_matrix[4]);
356 1304896 : intermediary[12] = input_matrix[9] * mag_transition_matrix[8]
357 652448 : + input_matrix[1] * mag_transition_matrix[6] + input_matrix[10] * mag_transition_matrix[10]
358 652448 : - input_matrix[2] * mag_transition_matrix[7]
359 652448 : - (-input_matrix[11]) * mag_transition_matrix[11];
360 1304896 : intermediary[13] = input_matrix[9] * mag_transition_matrix[9]
361 652448 : + input_matrix[1] * mag_transition_matrix[7] + input_matrix[10] * mag_transition_matrix[11]
362 652448 : + mag_transition_matrix[6] * input_matrix[2]
363 652448 : + mag_transition_matrix[10] * (-input_matrix[11]);
364 1304896 : intermediary[14] = input_matrix[16] * mag_transition_matrix[10]
365 652448 : + input_matrix[3] * mag_transition_matrix[6] + input_matrix[10] * mag_transition_matrix[8]
366 652448 : - input_matrix[4] * mag_transition_matrix[7] - input_matrix[11] * mag_transition_matrix[9];
367 1304896 : intermediary[15] = input_matrix[16] * mag_transition_matrix[11]
368 652448 : + input_matrix[3] * mag_transition_matrix[7] + input_matrix[10] * mag_transition_matrix[9]
369 652448 : + mag_transition_matrix[6] * input_matrix[4] + mag_transition_matrix[8] * input_matrix[11];
370 1304896 : intermediary[16] = input_matrix[5] * mag_transition_matrix[6]
371 652448 : + input_matrix[12] * mag_transition_matrix[8] + input_matrix[17] * mag_transition_matrix[10]
372 652448 : - input_matrix[6] * mag_transition_matrix[7] - input_matrix[13] * mag_transition_matrix[9]
373 652448 : - input_matrix[18] * mag_transition_matrix[11];
374 1304896 : intermediary[17] = input_matrix[5] * mag_transition_matrix[7]
375 652448 : + input_matrix[12] * mag_transition_matrix[9] + input_matrix[17] * mag_transition_matrix[11]
376 652448 : + mag_transition_matrix[6] * input_matrix[6] + mag_transition_matrix[8] * input_matrix[13]
377 652448 : + mag_transition_matrix[10] * input_matrix[18];
378 1304896 : intermediary[18] = input_matrix[7] * mag_transition_matrix[6]
379 652448 : + input_matrix[14] * mag_transition_matrix[8] + input_matrix[19] * mag_transition_matrix[10]
380 652448 : - input_matrix[8] * mag_transition_matrix[7] - input_matrix[15] * mag_transition_matrix[9]
381 652448 : - input_matrix[20] * mag_transition_matrix[11];
382 1304896 : intermediary[19] = input_matrix[7] * mag_transition_matrix[7]
383 652448 : + input_matrix[14] * mag_transition_matrix[9] + input_matrix[19] * mag_transition_matrix[11]
384 652448 : + mag_transition_matrix[6] * input_matrix[8] + mag_transition_matrix[8] * input_matrix[15]
385 652448 : + mag_transition_matrix[10] * input_matrix[20];
386 1304896 : intermediary[20] = input_matrix[0] * mag_transition_matrix[12]
387 652448 : + input_matrix[1] * mag_transition_matrix[14] + input_matrix[3] * mag_transition_matrix[16]
388 652448 : - (-input_matrix[2]) * mag_transition_matrix[15]
389 652448 : - (-input_matrix[4]) * mag_transition_matrix[17];
390 1304896 : intermediary[21] = input_matrix[0] * mag_transition_matrix[13]
391 652448 : + input_matrix[1] * mag_transition_matrix[15] + input_matrix[3] * mag_transition_matrix[17]
392 652448 : + mag_transition_matrix[14] * (-input_matrix[2])
393 652448 : + mag_transition_matrix[16] * (-input_matrix[4]);
394 1304896 : intermediary[22] = input_matrix[9] * mag_transition_matrix[14]
395 652448 : + input_matrix[1] * mag_transition_matrix[12] + input_matrix[10] * mag_transition_matrix[16]
396 652448 : - input_matrix[2] * mag_transition_matrix[13]
397 652448 : - (-input_matrix[11]) * mag_transition_matrix[17];
398 1304896 : intermediary[23] = input_matrix[9] * mag_transition_matrix[15]
399 652448 : + input_matrix[1] * mag_transition_matrix[13] + input_matrix[10] * mag_transition_matrix[17]
400 652448 : + mag_transition_matrix[12] * input_matrix[2]
401 652448 : + mag_transition_matrix[16] * (-input_matrix[11]);
402 1304896 : intermediary[24] = input_matrix[16] * mag_transition_matrix[16]
403 652448 : + input_matrix[3] * mag_transition_matrix[12] + input_matrix[10] * mag_transition_matrix[14]
404 652448 : - input_matrix[4] * mag_transition_matrix[13]
405 652448 : - input_matrix[11] * mag_transition_matrix[15];
406 1304896 : intermediary[25] = input_matrix[16] * mag_transition_matrix[17]
407 652448 : + input_matrix[3] * mag_transition_matrix[13] + input_matrix[10] * mag_transition_matrix[15]
408 652448 : + mag_transition_matrix[12] * input_matrix[4]
409 652448 : + mag_transition_matrix[14] * input_matrix[11];
410 1304896 : intermediary[26] = input_matrix[5] * mag_transition_matrix[12]
411 652448 : + input_matrix[12] * mag_transition_matrix[14]
412 652448 : + input_matrix[17] * mag_transition_matrix[16] - input_matrix[6] * mag_transition_matrix[13]
413 652448 : - input_matrix[13] * mag_transition_matrix[15]
414 652448 : - input_matrix[18] * mag_transition_matrix[17];
415 1304896 : intermediary[27] = input_matrix[5] * mag_transition_matrix[13]
416 652448 : + input_matrix[12] * mag_transition_matrix[15]
417 652448 : + input_matrix[17] * mag_transition_matrix[17] + mag_transition_matrix[12] * input_matrix[6]
418 652448 : + mag_transition_matrix[14] * input_matrix[13]
419 652448 : + mag_transition_matrix[16] * input_matrix[18];
420 1304896 : intermediary[28] = input_matrix[7] * mag_transition_matrix[12]
421 652448 : + input_matrix[14] * mag_transition_matrix[14]
422 652448 : + input_matrix[19] * mag_transition_matrix[16] - input_matrix[8] * mag_transition_matrix[13]
423 652448 : - input_matrix[15] * mag_transition_matrix[15]
424 652448 : - input_matrix[20] * mag_transition_matrix[17];
425 1304896 : intermediary[29] = input_matrix[7] * mag_transition_matrix[13]
426 652448 : + input_matrix[14] * mag_transition_matrix[15]
427 652448 : + input_matrix[19] * mag_transition_matrix[17] + mag_transition_matrix[12] * input_matrix[8]
428 652448 : + mag_transition_matrix[14] * input_matrix[15]
429 652448 : + mag_transition_matrix[16] * input_matrix[20];
430 1304896 : intermediary[30] = elec_transition_matrix[0] * input_matrix[5]
431 652448 : + elec_transition_matrix[2] * input_matrix[7]
432 652448 : - elec_transition_matrix[1] * (-input_matrix[6])
433 652448 : - elec_transition_matrix[3] * (-input_matrix[8]);
434 1304896 : intermediary[31] = elec_transition_matrix[0] * (-input_matrix[6])
435 652448 : + elec_transition_matrix[2] * (-input_matrix[8])
436 652448 : + input_matrix[5] * elec_transition_matrix[1] + input_matrix[7] * elec_transition_matrix[3];
437 1304896 : intermediary[32] = elec_transition_matrix[0] * input_matrix[12]
438 652448 : + elec_transition_matrix[2] * input_matrix[14]
439 652448 : - elec_transition_matrix[1] * (-input_matrix[13])
440 652448 : - elec_transition_matrix[3] * (-input_matrix[15]);
441 1304896 : intermediary[33] = elec_transition_matrix[0] * (-input_matrix[13])
442 652448 : + elec_transition_matrix[2] * (-input_matrix[15])
443 652448 : + input_matrix[12] * elec_transition_matrix[1]
444 652448 : + input_matrix[14] * elec_transition_matrix[3];
445 1304896 : intermediary[34] = elec_transition_matrix[0] * input_matrix[17]
446 652448 : + elec_transition_matrix[2] * input_matrix[19]
447 652448 : - elec_transition_matrix[1] * (-input_matrix[18])
448 652448 : - elec_transition_matrix[3] * (-input_matrix[20]);
449 1304896 : intermediary[35] = elec_transition_matrix[0] * (-input_matrix[18])
450 652448 : + elec_transition_matrix[2] * (-input_matrix[20])
451 652448 : + input_matrix[17] * elec_transition_matrix[1]
452 652448 : + input_matrix[19] * elec_transition_matrix[3];
453 1304896 : intermediary[36] = input_matrix[21] * elec_transition_matrix[0]
454 652448 : + elec_transition_matrix[2] * input_matrix[22]
455 652448 : - elec_transition_matrix[3] * (-input_matrix[23]);
456 1304896 : intermediary[37] = input_matrix[21] * elec_transition_matrix[1]
457 652448 : + elec_transition_matrix[2] * (-input_matrix[23])
458 652448 : + input_matrix[22] * elec_transition_matrix[3];
459 1304896 : intermediary[38] = input_matrix[24] * elec_transition_matrix[2]
460 652448 : + elec_transition_matrix[0] * input_matrix[22]
461 652448 : - elec_transition_matrix[1] * input_matrix[23];
462 1304896 : intermediary[39] = input_matrix[24] * elec_transition_matrix[3]
463 652448 : + elec_transition_matrix[0] * input_matrix[23]
464 652448 : + input_matrix[22] * elec_transition_matrix[1];
465 1304896 : intermediary[40] = elec_transition_matrix[4] * input_matrix[5]
466 652448 : + elec_transition_matrix[6] * input_matrix[7]
467 652448 : - elec_transition_matrix[5] * (-input_matrix[6])
468 652448 : - elec_transition_matrix[7] * (-input_matrix[8]);
469 1304896 : intermediary[41] = elec_transition_matrix[4] * (-input_matrix[6])
470 652448 : + elec_transition_matrix[6] * (-input_matrix[8])
471 652448 : + input_matrix[5] * elec_transition_matrix[5] + input_matrix[7] * elec_transition_matrix[7];
472 1304896 : intermediary[42] = elec_transition_matrix[4] * input_matrix[12]
473 652448 : + elec_transition_matrix[6] * input_matrix[14]
474 652448 : - elec_transition_matrix[5] * (-input_matrix[13])
475 652448 : - elec_transition_matrix[7] * (-input_matrix[15]);
476 1304896 : intermediary[43] = elec_transition_matrix[4] * (-input_matrix[13])
477 652448 : + elec_transition_matrix[6] * (-input_matrix[15])
478 652448 : + input_matrix[12] * elec_transition_matrix[5]
479 652448 : + input_matrix[14] * elec_transition_matrix[7];
480 1304896 : intermediary[44] = elec_transition_matrix[4] * input_matrix[17]
481 652448 : + elec_transition_matrix[6] * input_matrix[19]
482 652448 : - elec_transition_matrix[5] * (-input_matrix[18])
483 652448 : - elec_transition_matrix[7] * (-input_matrix[20]);
484 1304896 : intermediary[45] = elec_transition_matrix[4] * (-input_matrix[18])
485 652448 : + elec_transition_matrix[6] * (-input_matrix[20])
486 652448 : + input_matrix[17] * elec_transition_matrix[5]
487 652448 : + input_matrix[19] * elec_transition_matrix[7];
488 1304896 : intermediary[46] = input_matrix[21] * elec_transition_matrix[4]
489 652448 : + elec_transition_matrix[6] * input_matrix[22]
490 652448 : - elec_transition_matrix[7] * (-input_matrix[23]);
491 1304896 : intermediary[47] = input_matrix[21] * elec_transition_matrix[5]
492 652448 : + elec_transition_matrix[6] * (-input_matrix[23])
493 652448 : + input_matrix[22] * elec_transition_matrix[7];
494 1304896 : intermediary[48] = input_matrix[24] * elec_transition_matrix[6]
495 652448 : + elec_transition_matrix[4] * input_matrix[22]
496 652448 : - elec_transition_matrix[5] * input_matrix[23];
497 1304896 : intermediary[49] = input_matrix[24] * elec_transition_matrix[7]
498 652448 : + elec_transition_matrix[4] * input_matrix[23]
499 652448 : + input_matrix[22] * elec_transition_matrix[5];
500 1304896 : output_matrix[0] = mag_transition_matrix[0] * intermediary[0]
501 652448 : + mag_transition_matrix[2] * intermediary[2] + mag_transition_matrix[4] * intermediary[4]
502 652448 : + mag_transition_matrix[1] * intermediary[1] + mag_transition_matrix[3] * intermediary[3]
503 652448 : + mag_transition_matrix[5] * intermediary[5];
504 1304896 : output_matrix[1] = mag_transition_matrix[6] * intermediary[0]
505 652448 : + mag_transition_matrix[8] * intermediary[2] + mag_transition_matrix[10] * intermediary[4]
506 652448 : + mag_transition_matrix[7] * intermediary[1] + mag_transition_matrix[9] * intermediary[3]
507 652448 : + mag_transition_matrix[11] * intermediary[5];
508 1304896 : output_matrix[2] = mag_transition_matrix[6] * intermediary[1]
509 652448 : + mag_transition_matrix[8] * intermediary[3] + mag_transition_matrix[10] * intermediary[5]
510 652448 : - intermediary[0] * mag_transition_matrix[7] - intermediary[2] * mag_transition_matrix[9]
511 652448 : - intermediary[4] * mag_transition_matrix[11];
512 1304896 : output_matrix[3] = mag_transition_matrix[12] * intermediary[0]
513 652448 : + mag_transition_matrix[14] * intermediary[2] + mag_transition_matrix[16] * intermediary[4]
514 652448 : + mag_transition_matrix[13] * intermediary[1] + mag_transition_matrix[15] * intermediary[3]
515 652448 : + mag_transition_matrix[17] * intermediary[5];
516 1304896 : output_matrix[4] = mag_transition_matrix[12] * intermediary[1]
517 652448 : + mag_transition_matrix[14] * intermediary[3] + mag_transition_matrix[16] * intermediary[5]
518 652448 : - intermediary[0] * mag_transition_matrix[13] - intermediary[2] * mag_transition_matrix[15]
519 652448 : - intermediary[4] * mag_transition_matrix[17];
520 1304896 : output_matrix[5] = elec_transition_matrix[0] * intermediary[6]
521 652448 : + elec_transition_matrix[2] * intermediary[8] + elec_transition_matrix[1] * intermediary[7]
522 652448 : + elec_transition_matrix[3] * intermediary[9];
523 1304896 : output_matrix[6] = elec_transition_matrix[0] * intermediary[7]
524 652448 : + elec_transition_matrix[2] * intermediary[9] - intermediary[6] * elec_transition_matrix[1]
525 652448 : - intermediary[8] * elec_transition_matrix[3];
526 1304896 : output_matrix[7] = elec_transition_matrix[4] * intermediary[6]
527 652448 : + elec_transition_matrix[6] * intermediary[8] + elec_transition_matrix[5] * intermediary[7]
528 652448 : + elec_transition_matrix[7] * intermediary[9];
529 1304896 : output_matrix[8] = elec_transition_matrix[4] * intermediary[7]
530 652448 : + elec_transition_matrix[6] * intermediary[9] - intermediary[6] * elec_transition_matrix[5]
531 652448 : - intermediary[8] * elec_transition_matrix[7];
532 1304896 : output_matrix[9] = mag_transition_matrix[6] * intermediary[10]
533 652448 : + mag_transition_matrix[8] * intermediary[12] + mag_transition_matrix[10] * intermediary[14]
534 652448 : + mag_transition_matrix[7] * intermediary[11] + mag_transition_matrix[9] * intermediary[13]
535 652448 : + mag_transition_matrix[11] * intermediary[15];
536 1304896 : output_matrix[10] = mag_transition_matrix[12] * intermediary[10]
537 652448 : + mag_transition_matrix[14] * intermediary[12]
538 652448 : + mag_transition_matrix[16] * intermediary[14]
539 652448 : + mag_transition_matrix[13] * intermediary[11]
540 652448 : + mag_transition_matrix[15] * intermediary[13]
541 652448 : + mag_transition_matrix[17] * intermediary[15];
542 1304896 : output_matrix[11] = mag_transition_matrix[12] * intermediary[11]
543 652448 : + mag_transition_matrix[14] * intermediary[13]
544 652448 : + mag_transition_matrix[16] * intermediary[15]
545 652448 : - intermediary[10] * mag_transition_matrix[13]
546 652448 : - intermediary[12] * mag_transition_matrix[15]
547 652448 : - intermediary[14] * mag_transition_matrix[17];
548 1304896 : output_matrix[12] = elec_transition_matrix[0] * intermediary[16]
549 652448 : + elec_transition_matrix[2] * intermediary[18]
550 652448 : + elec_transition_matrix[1] * intermediary[17]
551 652448 : + elec_transition_matrix[3] * intermediary[19];
552 1304896 : output_matrix[13] = elec_transition_matrix[0] * intermediary[17]
553 652448 : + elec_transition_matrix[2] * intermediary[19]
554 652448 : - intermediary[16] * elec_transition_matrix[1]
555 652448 : - intermediary[18] * elec_transition_matrix[3];
556 1304896 : output_matrix[14] = elec_transition_matrix[4] * intermediary[16]
557 652448 : + elec_transition_matrix[6] * intermediary[18]
558 652448 : + elec_transition_matrix[5] * intermediary[17]
559 652448 : + elec_transition_matrix[7] * intermediary[19];
560 1304896 : output_matrix[15] = elec_transition_matrix[4] * intermediary[17]
561 652448 : + elec_transition_matrix[6] * intermediary[19]
562 652448 : - intermediary[16] * elec_transition_matrix[5]
563 652448 : - intermediary[18] * elec_transition_matrix[7];
564 1304896 : output_matrix[16] = mag_transition_matrix[12] * intermediary[20]
565 652448 : + mag_transition_matrix[14] * intermediary[22]
566 652448 : + mag_transition_matrix[16] * intermediary[24]
567 652448 : + mag_transition_matrix[13] * intermediary[21]
568 652448 : + mag_transition_matrix[15] * intermediary[23]
569 652448 : + mag_transition_matrix[17] * intermediary[25];
570 1304896 : output_matrix[17] = elec_transition_matrix[0] * intermediary[26]
571 652448 : + elec_transition_matrix[2] * intermediary[28]
572 652448 : + elec_transition_matrix[1] * intermediary[27]
573 652448 : + elec_transition_matrix[3] * intermediary[29];
574 1304896 : output_matrix[18] = elec_transition_matrix[0] * intermediary[27]
575 652448 : + elec_transition_matrix[2] * intermediary[29]
576 652448 : - intermediary[26] * elec_transition_matrix[1]
577 652448 : - intermediary[28] * elec_transition_matrix[3];
578 1304896 : output_matrix[19] = elec_transition_matrix[4] * intermediary[26]
579 652448 : + elec_transition_matrix[6] * intermediary[28]
580 652448 : + elec_transition_matrix[5] * intermediary[27]
581 652448 : + elec_transition_matrix[7] * intermediary[29];
582 1304896 : output_matrix[20] = elec_transition_matrix[4] * intermediary[27]
583 652448 : + elec_transition_matrix[6] * intermediary[29]
584 652448 : - intermediary[26] * elec_transition_matrix[5]
585 652448 : - intermediary[28] * elec_transition_matrix[7];
586 1304896 : output_matrix[21] = elec_transition_matrix[0] * intermediary[36]
587 652448 : + elec_transition_matrix[2] * intermediary[38]
588 652448 : + elec_transition_matrix[1] * intermediary[37]
589 652448 : + elec_transition_matrix[3] * intermediary[39];
590 1304896 : output_matrix[22] = elec_transition_matrix[4] * intermediary[36]
591 652448 : + elec_transition_matrix[6] * intermediary[38]
592 652448 : + elec_transition_matrix[5] * intermediary[37]
593 652448 : + elec_transition_matrix[7] * intermediary[39];
594 1304896 : output_matrix[23] = elec_transition_matrix[4] * intermediary[37]
595 652448 : + elec_transition_matrix[6] * intermediary[39]
596 652448 : - intermediary[36] * elec_transition_matrix[5]
597 652448 : - intermediary[38] * elec_transition_matrix[7];
598 1304896 : output_matrix[24] = elec_transition_matrix[4] * intermediary[46]
599 652448 : + elec_transition_matrix[6] * intermediary[48]
600 652448 : + elec_transition_matrix[5] * intermediary[47]
601 652448 : + elec_transition_matrix[7] * intermediary[49];
602 652448 : }
603 :
604 6992 : void SM_calibrate_and_reorder(_Complex float intermediary[25], float work_matrix[NB_FLOATS_PER_SM],
605 : const float* input_asm, const float* mag_calibration_matrices, const float* elec_calibration_matrices,
606 : float* output_asm, unsigned int start_indice, unsigned int stop_indice)
607 : {
608 : DEBUG_CHECK_PTR(intermediary);
609 : DEBUG_CHECK_PTR(work_matrix);
610 : DEBUG_CHECK_PTR(mag_calibration_matrices);
611 : DEBUG_CHECK_PTR(elec_calibration_matrices);
612 : DEBUG_CHECK_PTR(output_asm);
613 6992 : output_asm += (start_indice * NB_FLOATS_PER_SM);
614 666432 : for (unsigned int frequency_offset = start_indice; frequency_offset < stop_indice;
615 652448 : frequency_offset++)
616 : {
617 652448 : extract_bin_vhdl_repr(input_asm, work_matrix, frequency_offset);
618 652448 : Matrix_change_of_basis(intermediary, work_matrix, mag_calibration_matrices,
619 : elec_calibration_matrices, output_asm);
620 :
621 652448 : mag_calibration_matrices += (3 * 3 * 2);
622 652448 : elec_calibration_matrices += (2 * 2 * 2);
623 652448 : output_asm += NB_FLOATS_PER_SM;
624 : }
625 6992 : }
626 :
627 4479 : void SM_calibrate_and_reorder_f0(float* input_asm, float* output_asm)
628 : {
629 : DEBUG_CHECK_PTR(input_asm);
630 : DEBUG_CHECK_PTR(output_asm);
631 : static float work_matrix[NB_FLOATS_PER_SM];
632 : static _Complex float intermediary[25];
633 4479 : SM_calibrate_and_reorder(intermediary, work_matrix, input_asm, mag_calibration_matrices_f0,
634 : elec_calibration_matrices_f0, output_asm, ASM_F0_INDICE_START,
635 : ASM_F0_INDICE_START + ASM_F0_KEEP_BINS);
636 4479 : }
637 :
638 2131 : void SM_calibrate_and_reorder_f1(float* input_asm, float* output_asm)
639 : {
640 : DEBUG_CHECK_PTR(input_asm);
641 : DEBUG_CHECK_PTR(output_asm);
642 : static float work_matrix[NB_FLOATS_PER_SM];
643 : static _Complex float intermediary[25];
644 2131 : SM_calibrate_and_reorder(intermediary, work_matrix, input_asm, mag_calibration_matrices_f1,
645 : elec_calibration_matrices_f1, output_asm, ASM_F1_INDICE_START,
646 : ASM_F1_INDICE_START + ASM_F1_KEEP_BINS);
647 2131 : }
648 :
649 382 : void SM_calibrate_and_reorder_f2(float* input_asm, float* output_asm)
650 : {
651 : DEBUG_CHECK_PTR(input_asm);
652 : DEBUG_CHECK_PTR(output_asm);
653 : static float work_matrix[NB_FLOATS_PER_SM];
654 : static _Complex float intermediary[25];
655 382 : SM_calibrate_and_reorder(intermediary, work_matrix, input_asm, mag_calibration_matrices_f2,
656 : elec_calibration_matrices_f2, output_asm, ASM_F2_INDICE_START,
657 : ASM_F2_INDICE_START + ASM_F2_KEEP_BINS);
658 382 : }
|