LCOV - code coverage report
Current view: top level - src/processing/ASM - spectralmatrices.c (source / functions) Hit Total Coverage
Test: trace.info Lines: 402 407 98.8 %
Date: 2023-02-20 11:47:18 Functions: 9 10 90.0 %

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

Generated by: LCOV version 1.14