LCOV - code coverage report
Current view: top level - lib_dec - ivas_stereo_dft_dec.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 183 196 93.4 %
Date: 2025-05-03 01:55:50 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : #include <assert.h>
      34             : #include <stdint.h>
      35             : #include "options.h"
      36             : #include <math.h>
      37             : #include "cnst.h"
      38             : #include "rom_com.h"
      39             : #include "rom_dec.h"
      40             : #include "prot_fx.h"
      41             : #include "ivas_cnst.h"
      42             : #include "ivas_rom_com.h"
      43             : #include "ivas_rom_com_fx.h"
      44             : #include "ivas_rom_dec.h"
      45             : #include "wmc_auto.h"
      46             : #include "ivas_prot_fx.h"
      47             : 
      48             : /*-------------------------------------------------------------------*
      49             :  * Local constants
      50             :  *-------------------------------------------------------------------*/
      51             : 
      52             : #define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX
      53             : 
      54             : #define STEREO_DFT_RES_RATIO_LIMIT_FX  ( Word32 )( 0x170A3D71 )
      55             : #define STEREO_DFT_STEFFI_DELAY_SHORT  2
      56             : #define STEREO_DFT_STEFFI_DELAY_LONG   4
      57             : #define STEREO_DFT_STEFFI_DELAY_OFFSET 2
      58             : 
      59             : 
      60             : #define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/
      61             : 
      62             : 
      63             : /*-------------------------------------------------------------------------
      64             :  * Local function prototypes
      65             :  *-------------------------------------------------------------------------*/
      66             : 
      67             : 
      68             : /*-------------------------------------------------------------------------
      69             :  * stereo_dft_dec_create()
      70             :  *
      71             :  * Create DFT stereo handle
      72             :  *------------------------------------------------------------------------*/
      73             : 
      74             : 
      75             : /*-------------------------------------------------------------------------
      76             :  * stereo_dft_dec_open()
      77             :  *
      78             :  * Open DFT decoder stereo handle
      79             :  *-------------------------------------------------------------------------*/
      80             : 
      81             : 
      82             : /*-------------------------------------------------------------------------
      83             :  * stereo_dft_dec_reset()
      84             :  *
      85             :  * Reset DFT stereo memories
      86             :  *------------------------------------------------------------------------*/
      87             : 
      88             : /*-------------------------------------------------------------------------
      89             :  * stereo_dft_dec_update()
      90             :  *
      91             :  * Update DFT memories for new frame
      92             :  *-------------------------------------------------------------------------*/
      93             : 
      94             : /*-------------------------------------------------------------------------
      95             :  * stereo_dft_dec_destroy()
      96             :  *
      97             :  * destroy DFT stereo handle
      98             :  *-------------------------------------------------------------------------*/
      99             : 
     100         908 : void stereo_dft_dec_destroy(
     101             :     STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle     */
     102             : )
     103             : {
     104             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
     105             : 
     106         908 :     hStereoDft = *hStereoDft_glob;
     107             : 
     108         908 :     IF( hStereoDft->hConfig != NULL )
     109             :     {
     110         908 :         free( hStereoDft->hConfig );
     111         908 :         hStereoDft->hConfig = NULL;
     112             :     }
     113             : 
     114         908 :     IF( hStereoDft->hBpf != NULL )
     115             :     {
     116         908 :         free( hStereoDft->hBpf );
     117         908 :         hStereoDft->hBpf = NULL;
     118             :     }
     119             : 
     120         908 :     IF( hStereoDft->hTcxLtpDec != NULL )
     121             :     {
     122         908 :         free( hStereoDft->hTcxLtpDec );
     123         908 :         hStereoDft->hTcxLtpDec = NULL;
     124             :     }
     125             : 
     126         908 :     free( hStereoDft );
     127         908 :     hStereoDft = NULL;
     128             : 
     129         908 :     return;
     130             : }
     131             : 
     132             : 
     133             : /*-------------------------------------------------------------------------
     134             :  * stereo_dft_dec_analyze()
     135             :  *
     136             :  * DFT analysis on a 20ms frame
     137             :  *-------------------------------------------------------------------------*/
     138             : 
     139      195208 : void stereo_dft_dec_analyze_fx(
     140             :     CPE_DEC_HANDLE hCPE,                                 /* i/o: CPE decoder structure             */
     141             :     const Word32 *input_fx,                              /* i  : input signal                                                           q*/
     142             :     Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o  : DFT buffers                                            q_out_DFT*/
     143             :     const Word16 chan,                                   /* i  : channel number                                                    Q0*/
     144             :     const Word16 input_frame,                            /* i  : input frame size                                                  Q0*/
     145             :     const Word16 output_frame,                           /* i  : output frame size                                                 Q0*/
     146             :     const DFT_STEREO_DEC_ANA_TYPE ana_type,              /* i  : type of signal to analyse                                       */
     147             :     const Word16 k_offset,                               /* i  : offset of DFT                                                     Q0*/
     148             :     const Word16 delay,                                  /* i  : delay in samples FOR input signal                 Q0*/
     149             :     Word16 *q,
     150             :     Word16 *q_out_DFT )
     151             : {
     152             : 
     153             :     Word16 i, k;
     154             :     STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
     155             :     Word32 *pInput_fx, *pInput_buff_fx;
     156             :     Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k];
     157             :     Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx;
     158             :     Word16 NFFT, NFFT_core, ovl, zp;
     159             :     Word16 offset;
     160             :     Word32 fac_fx;
     161             :     const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx;
     162             :     Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1];
     163             :     Word16 trigo_step;
     164             :     Word32 inputFs;
     165             :     Word16 delay_dec;
     166             :     Word16 mem_size;
     167             :     Word16 ovl2;
     168             : 
     169      195208 :     push_wmops( "DFT_analysis" );
     170             : 
     171      195208 :     hStereoDft = hCPE->hStereoDft;
     172             : 
     173      195208 :     assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N );
     174             : 
     175             :     /*-----------------------------------------------------------------*
     176             :      * Initialization
     177             :      *-----------------------------------------------------------------*/
     178             : 
     179      195208 :     IF( EQ_16( input_frame, output_frame ) )
     180             :     {
     181       72286 :         trigo_fx = hStereoDft->dft_trigo_fx;
     182       72286 :         trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
     183       72286 :         win_right_fx = hStereoDft->win32ms_fx;                                        /* Q15 */
     184       72286 :         win_left_fx = hStereoDft->win32ms_fx;                                         /* Q15 */
     185       72286 :         win2_fx = hStereoDft->win232ms_fx;                                            /* Q15 */
     186             : 
     187       72286 :         test();
     188       72286 :         IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     189             :         {
     190        5085 :             assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
     191        5085 :             mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
     192             :         }
     193       67201 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
     194             :         {
     195        3436 :             mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
     196             :         }
     197             :         ELSE
     198             :         {
     199       63765 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     200             :         }
     201             :     }
     202      122922 :     ELSE IF( EQ_16( input_frame, L_FRAME ) )
     203             :     {
     204       59225 :         trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */
     205       59225 :         trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     206       59225 :         move16();
     207       59225 :         win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */
     208       59225 :         win_left_fx = hStereoDft->win32ms_12k8_fx;  /* Q15 */
     209       59225 :         win2_fx = hStereoDft->win232ms_12k8_fx;     /* Q15 */
     210             : 
     211       59225 :         test();
     212       59225 :         IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     213             :         {
     214       20955 :             assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
     215       20955 :             mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
     216             :         }
     217       38270 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
     218             :         {
     219       18516 :             mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
     220             :         }
     221             :         ELSE
     222             :         {
     223       19754 :             assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" );
     224       19754 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     225             :         }
     226             :     }
     227       63697 :     ELSE IF( EQ_16( input_frame, L_FRAME16k ) )
     228             :     {
     229       46867 :         trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */
     230       46867 :         trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     231       46867 :         move16();
     232       46867 :         win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */
     233       46867 :         win_left_fx = hStereoDft->win32ms_16k_fx;  /* Q15 */
     234       46867 :         win2_fx = hStereoDft->win232ms_16k_fx;     /* Q15 */
     235             : 
     236       46867 :         test();
     237       46867 :         IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     238             :         {
     239       22157 :             assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
     240       22157 :             mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
     241             :         }
     242       24710 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
     243             :         {
     244       14901 :             mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
     245             :         }
     246             :         ELSE
     247             :         {
     248        9809 :             assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" );
     249        9809 :             mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
     250             :         }
     251             :     }
     252       16830 :     ELSE IF( EQ_16( input_frame, L_FRAME8k ) )
     253             :     {
     254       16830 :         assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" );
     255       16830 :         trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */
     256       16830 :         trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
     257       16830 :         move16();
     258       16830 :         win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */
     259       16830 :         win_left_fx = hStereoDft->win32ms_8k_fx;  /* Q15 */
     260       16830 :         win2_fx = hStereoDft->win232ms_8k_fx;     /* Q15 */
     261       16830 :         mem_fx = hCPE->input_mem_fx[chan];        /* Q11 */
     262             :     }
     263             :     ELSE
     264             :     {
     265           0 :         IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" );
     266           0 :         mem_fx = NULL;   /* to avoid compilation warning */
     267           0 :         trigo_fx = NULL; /* to avoid compilation warning */
     268           0 :         trigo_step = -1; /* to avoid compilation warning */
     269           0 :         move16();
     270           0 :         win_right_fx = NULL; /* to avoid compilation warning */
     271           0 :         win_left_fx = NULL;  /* to avoid compilation warning */
     272           0 :         win2_fx = NULL;      /* to avoid compilation warning */
     273             :     }
     274             : 
     275      195208 :     inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */
     276      195208 :     delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
     277      195208 :     move16();
     278      195208 :     zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS );
     279      195208 :     move16();
     280      195208 :     ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
     281      195208 :     move16();
     282      195208 :     NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS );
     283             :     Word16 qfac_fx;
     284      195208 :     fac_fx = BASOP_Util_Divide3232_Scale_newton( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */
     285      195208 :     qfac_fx = sub( 31, qfac_fx );
     286      195208 :     ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS );
     287      195208 :     move16();
     288             : 
     289             :     /* Offset FOR the time buffers */
     290      195208 :     assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) );
     291      195208 :     mem_size = add( delay_dec, delay );
     292             : 
     293             :     /* Update buffers */
     294      195208 :     Copy32( mem_fx, input_buff_fx, mem_size );                 /* Q11 */
     295      195208 :     Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */
     296      195208 :     Copy32( input_buff_fx + input_frame, mem_fx, mem_size );   /* q */
     297      195208 :     pInput_buff_fx = input_buff_fx;                            /* q */
     298             : 
     299      195208 :     test();
     300      195208 :     IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) )
     301             :     {
     302       39593 :         pop_wmops();
     303       39593 :         return;
     304             :     }
     305             : 
     306             : 
     307             :     /*-----------------------------------------------------------------*
     308             :      * DFT Analysis: loop over frame
     309             :      *-----------------------------------------------------------------*/
     310             : 
     311      155615 :     assert( ( k_offset <= STEREO_DFT_NBDIV ) );
     312             : 
     313    16215071 :     FOR( i = 0; i < NFFT / 4; i++ )
     314             :     {
     315    16059456 :         trigo_dec_fx[i] = trigo_fx[i * trigo_step];
     316    16059456 :         move16();
     317    16059456 :         trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step];
     318    16059456 :         move16();
     319             :     }
     320      155615 :     trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step];
     321      155615 :     move16();
     322             : 
     323      396608 :     FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ )
     324             :     {
     325      240993 :         set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX );
     326      240993 :         IF( k == 0 )
     327             :         {
     328      121442 :             offset = 0;
     329      121442 :             move16();
     330             :         }
     331             :         ELSE
     332             :         {
     333             :             /* If OVL2 = OVL offset = 10ms */
     334      119551 :             offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 );
     335      119551 :             move16();
     336             :         }
     337             : 
     338      240993 :         pInput_fx = pInput_buff_fx + offset;                                /* q */
     339      240993 :         pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* q_out_DFT */
     340             : 
     341             :         /*Forwards FFT:  L and R*/
     342             :         /* Zero Padding & Flat Portion */
     343      240993 :         Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */
     344             : 
     345             :         /* Overlapping portions */
     346      240993 :         IF( k == 0 )
     347             :         {
     348     7278692 :             FOR( i = 0; i < ovl; i++ )
     349             :             {
     350     7157250 :                 DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */
     351     7157250 :                 move32();
     352             :             }
     353    21593192 :             FOR( i = 0; i < ovl2; i++ )
     354             :             {
     355    21471750 :                 DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */
     356    21471750 :                 move32();
     357             :             }
     358             :         }
     359             :         ELSE
     360             :         {
     361    21153421 :             FOR( i = 0; i < ovl2; i++ )
     362             :             {
     363    21033870 :                 DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */
     364    21033870 :                 move32();
     365             :             }
     366     7130841 :             FOR( i = 0; i < ovl; i++ )
     367             :             {
     368     7011290 :                 DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); /* q */
     369     7011290 :                 move32();
     370             :             }
     371             :         }
     372             :         Word16 q_DFT, q_shift, guarded_bits;
     373      240993 :         q_DFT = *q;
     374      240993 :         move16();
     375      240993 :         guarded_bits = find_guarded_bits_fx( NFFT );
     376      240993 :         q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits );
     377             : 
     378    90919649 :         FOR( Word16 j = 0; j < NFFT; j++ )
     379             :         {
     380    90678656 :             DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/
     381    90678656 :             move32();
     382             :         }
     383             : 
     384      240993 :         q_DFT = add( q_DFT, q_shift );
     385             : 
     386      240993 :         rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 );
     387             : 
     388      240993 :         q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) );
     389    90919649 :         FOR( Word16 j = 0; j < NFFT; j++ )
     390             :         {
     391    90678656 :             DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */
     392    90678656 :             move32();
     393             :         }
     394      240993 :         q_DFT = add( q_DFT, q_shift );
     395      240993 :         IF( sub( q_out_DFT[chan], q_DFT ) > 0 )
     396             :         {
     397           0 :             FOR( Word32 j = 0; j < NFFT; j++ )
     398             :             {
     399           0 :                 out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); /* q_DFT */
     400           0 :                 move32();
     401             :             }
     402           0 :             q_out_DFT[chan] = q_DFT;
     403           0 :             move16();
     404             :         }
     405             :         ELSE
     406             :         {
     407    90919649 :             FOR( Word32 j = 0; j < NFFT; j++ )
     408             :             {
     409    90678656 :                 DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */
     410    90678656 :                 move32();
     411             :             }
     412      240993 :             q_DFT = q_out_DFT[chan];
     413      240993 :             move16();
     414             :         }
     415             : 
     416             :         /*Resampling: filtering+scaling*/
     417      240993 :         test();
     418      240993 :         test();
     419      240993 :         IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) )
     420             :         {
     421      188526 :             pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */
     422      188526 :             move32();
     423      188526 :             IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
     424             :             {
     425       63290 :                 pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
     426       63290 :                 move32();
     427             :             }
     428             :             ELSE
     429             :             {
     430      125236 :                 pDFT_out_fx[1] = 0;
     431      125236 :                 move32();
     432             :             }
     433    74510738 :             FOR( i = 2; i < NFFT; i++ )
     434             :             {
     435    74322212 :                 pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
     436    74322212 :                 move32();
     437             :             }
     438    55163502 :             FOR( i = NFFT; i < hStereoDft->NFFT; i++ )
     439             :             {
     440    54974976 :                 pDFT_out_fx[i] = 0; /* qDFT */
     441    54974976 :                 move32();
     442             :             }
     443             :         }
     444       52467 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
     445             :         {
     446       50394 :             pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); /* qDFT */
     447       50394 :             move32();
     448             : 
     449     2015760 :             FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ )
     450             :             {
     451     1965366 :                 pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */
     452     1965366 :                 move32();
     453     1965366 :                 pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */
     454     1965366 :                 move32();
     455             :             }
     456             :         }
     457        2073 :         ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) )
     458             :         {
     459          80 :             NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */
     460          80 :             move16();
     461             : 
     462       43536 :             FOR( i = NFFT_core; i < NFFT; i++ )
     463             :             {
     464       43456 :                 pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */
     465       43456 :                 move32();
     466             :             }
     467             :         }
     468             :         ELSE
     469             :         {
     470        1993 :             pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ /* qDFT */
     471        1993 :             move32();
     472        1993 :             IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
     473             :             {
     474        1101 :                 pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); /* qDFT */
     475        1101 :                 move32();
     476             :             }
     477     1039351 :             FOR( i = 2; i < NFFT; i++ )
     478             :             {
     479     1037358 :                 pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */
     480     1037358 :                 move32();
     481             :             }
     482             :         }
     483             :     }
     484             : 
     485      155615 :     pop_wmops();
     486      155615 :     return;
     487             : }
     488             : 
     489             : 
     490             : /*---------------------------------------------------------------
     491             :  * stereo_dft_dec_smooth_parameters()
     492             :  *
     493             :  *
     494             :  * ---------------------------------------------------------------*/

Generated by: LCOV version 1.14