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

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h"
       7             : #include "prot_fx.h"
       8             : 
       9             : /*-------------------------------------------------------------------*
      10             :  * swb_hr_nonzero_subband_noise_fill()
      11             :  *
      12             :  * SWB BWE HR noise filling of zero subbands
      13             :  *-------------------------------------------------------------------*/
      14         861 : static void swb_hr_nonzero_subband_noise_fill_fx(
      15             :     const Word16 tilt_wb_fx,   /* i  : tilt of wideband signal        Q11      */
      16             :     Word16 *t_audio_fx,        /* i/o: mdct spectrum                  Q_audio  */
      17             :     Word16 *bwe_highrate_seed, /* i/o: seed of random noise                    */
      18             :     const Word16 N,            /* i  : length of subband                       */
      19             :     const Word16 Nsv,          /* i  : number of subband                       */
      20             :     Word16 Q_audio )
      21             : {
      22             :     Word16 i, j;
      23             :     Word16 *ptr_fx;
      24             :     Word16 min_bwe_fx, max_bwe_fx, tmpF_fx;
      25             :     Word16 tmp;
      26             : 
      27         861 :     IF( GT_16( tilt_wb_fx, 10240 /* 5 in Q11 */ ) )
      28             :     {
      29        2215 :         FOR( i = 0; i < Nsv; i++ )
      30             :         {
      31        2122 :             min_bwe_fx = MAX_16;
      32        2122 :             move16();
      33        2122 :             max_bwe_fx = 0;
      34        2122 :             move16();
      35        2122 :             tmp = i_mult2( i, N );
      36       19098 :             FOR( j = 0; j < N; j++ )
      37             :             {
      38       16976 :                 tmpF_fx = abs_s( t_audio_fx[tmp + j] ); // Q_audio
      39             : 
      40       16976 :                 max_bwe_fx = s_max( tmpF_fx, max_bwe_fx );
      41       16976 :                 if ( tmpF_fx > 0 )
      42             :                 {
      43       11560 :                     min_bwe_fx = s_min( tmpF_fx, min_bwe_fx );
      44             :                 }
      45             :             }
      46             : 
      47        2122 :             test();
      48        2122 :             if ( EQ_16( max_bwe_fx, min_bwe_fx ) && GT_16( min_bwe_fx, shl( 1, Q_audio ) ) )
      49             :             {
      50         891 :                 min_bwe_fx = mult_r( min_bwe_fx, 16384 /* 0.5 in Q15 */ ); // Q_audio + Q15 - Q15 -> Q_audio
      51             :             }
      52             : 
      53        2122 :             ptr_fx = &t_audio_fx[tmp];
      54       19098 :             FOR( j = 0; j < N; j++ )
      55             :             {
      56       16976 :                 IF( *ptr_fx == 0 )
      57             :                 {
      58        5416 :                     tmp = mult_r( min_bwe_fx, 16384 /* 0.5 in Q15 */ );
      59        5416 :                     if ( Random( bwe_highrate_seed ) <= 0 ) // Q_audio + Q15 - Q15 -> Q_audio
      60             :                     {
      61        2705 :                         tmp = negate( tmp );
      62             :                     }
      63        5416 :                     *ptr_fx = tmp; // Q_audio
      64        5416 :                     move16();
      65             :                 }
      66       16976 :                 ptr_fx++;
      67             :             }
      68             :         }
      69             :     }
      70             : 
      71         861 :     return;
      72             : }
      73             : 
      74             : /*-------------------------------------------------------------------*
      75             :  * swb_hr_noise_fill()
      76             :  *
      77             :  * SWB BWE HR noise filling
      78             :  *-------------------------------------------------------------------*/
      79         861 : void swb_hr_noise_fill_fx(
      80             :     const Word16 is_transient, /* i  : transient flag                                   */
      81             :     const Word16 spect_start,  /* i  : spectrum start point                             */
      82             :     const Word16 spect_end,    /* i  : spectrum end point                               */
      83             :     const Word16 tilt_wb_fx,   /* i  : tilt of wideband signal     Q11                  */
      84             :     const Word16 pitch_fx,     /* i  : pitch value                 Q4                   */
      85             :     const Word16 nq[],         /* i  : AVQ nq index                                     */
      86             :     Word16 Nsv,                /* i  : number of subband                                */
      87             :     Word16 *bwe_highrate_seed, /* i/o: seed of random noise                             */
      88             :     Word16 *t_audio_fx,        /* i/o: mdct spectrum               Q_audio              */
      89             :     Word16 Q_audio )
      90             : {
      91             :     Word16 i, j, k;
      92             :     Word16 pos_start, pos_end, incr;
      93             :     Word16 tmp, tmp1, tmp2, tmp3, tmp_exp;
      94             :     Word16 alpha_fx, beta_fx;
      95             : 
      96         861 :     IF( is_transient )
      97             :     {
      98         256 :         tmp_exp = sub( 16, Q_audio );
      99        2304 :         FOR( i = 0; i < Nsv; i++ )
     100             :         {
     101        2048 :             IF( nq[i] == 0 )
     102             :             {
     103         568 :                 tmp = i_mult( i, WIDTH_BAND );
     104        5112 :                 FOR( j = 0; j < WIDTH_BAND; j++ )
     105             :                 {
     106        4544 :                     t_audio_fx[tmp + j] = shr( Random( bwe_highrate_seed ), tmp_exp );
     107        4544 :                     move16(); /*Q_audio */
     108             :                 }
     109             :             }
     110             :         }
     111             :     }
     112             :     ELSE
     113             :     {
     114         605 :         tmp_exp = sub( 15, Q_audio );
     115             : 
     116         605 :         Nsv = shr( sub( spect_end, spect_start ), 3 );
     117         605 :         alpha_fx = 8192;
     118         605 :         move16(); /*Q15 */
     119         605 :         IF( GT_16( tilt_wb_fx, 10240 /* 5 in Q11 */ ) )
     120             :         {
     121          53 :             beta_fx = 8192;
     122          53 :             move16(); /*Q15 */
     123             :         }
     124             :         ELSE
     125             :         {
     126         552 :             IF( GT_16( 6400 /* 400 in Q4 */, pitch_fx ) )
     127             :             {
     128         249 :                 beta_fx = 8192;
     129         249 :                 move16(); /*Q15 */
     130             :             }
     131             :             ELSE
     132             :             {
     133         303 :                 beta_fx = div_s( 1600, pitch_fx ); /*Q15+4-4 ->Q15 */
     134             :             }
     135             :         }
     136             : 
     137         605 :         i = 0;
     138         605 :         move16();
     139         605 :         IF( nq[i] == 0 )
     140             :         {
     141           4 :             i = 1;
     142           4 :             move16();
     143           4 :             test();
     144           8 :             WHILE( LT_16( i, Nsv ) && nq[i] == 0 )
     145             :             {
     146           4 :                 i++;
     147           4 :                 move16();
     148           4 :                 test();
     149             :             }
     150             : 
     151           4 :             pos_start = i;
     152           4 :             move16();
     153           4 :             test();
     154          49 :             WHILE( LT_16( i, Nsv ) && nq[i] != 0 )
     155             :             {
     156          45 :                 i++;
     157          45 :                 move16();
     158          45 :                 test();
     159             :             }
     160             : 
     161           4 :             pos_end = sub( i, 1 );
     162           4 :             move16();
     163             : 
     164           4 :             IF( GT_16( pos_end, shl( pos_start, 1 ) ) )
     165             :             {
     166           3 :                 pos_end = sub( shl( pos_start, 1 ), 1 );
     167           3 :                 move16();
     168             :             }
     169             : 
     170           4 :             incr = pos_end;
     171           4 :             move16();
     172             : 
     173          12 :             FOR( j = sub( pos_start, 1 ); j >= 0; j-- )
     174             :             {
     175           8 :                 tmp = shl( j, 3 );
     176           8 :                 tmp1 = shl( incr, 3 );
     177          72 :                 FOR( k = 0; k < WIDTH_BAND; k++ )
     178             :                 {
     179          64 :                     tmp2 = mult_r( alpha_fx, t_audio_fx[tmp1 + k] );                       // Q_audio + Q15 - Q15 -> Q_audio
     180          64 :                     tmp3 = mult_r( beta_fx, shr( Random( bwe_highrate_seed ), tmp_exp ) ); // Q_audio + Q15 - Q15 -> Q_audio
     181          64 :                     t_audio_fx[tmp + k] = add( tmp2, tmp3 );                               // Q_audio
     182          64 :                     move16();
     183             :                 }
     184             : 
     185             :                 /*incr = sub(incr, pos_start) < 0 ? pos_end : sub(incr, 1); move16(); */
     186           8 :                 IF( LT_16( incr, pos_start ) )
     187             :                 {
     188           0 :                     incr = pos_end;
     189           0 :                     move16();
     190             :                 }
     191             :                 ELSE
     192             :                 {
     193           8 :                     incr = sub( incr, 1 );
     194             :                 }
     195             :             }
     196             :         }
     197             : 
     198       20820 :         WHILE( LT_16( i, Nsv ) )
     199             :         {
     200       20215 :             IF( nq[i] == 0 )
     201             :             {
     202         875 :                 pos_start = i;
     203         875 :                 move16();
     204         875 :                 pos_end = i;
     205         875 :                 move16();
     206             : 
     207        2052 :                 FOR( j = pos_start; j < Nsv; j++ )
     208             :                 {
     209        1926 :                     IF( nq[j] != 0 )
     210             :                     {
     211         749 :                         i = j;
     212         749 :                         move16();
     213         749 :                         pos_end = j;
     214         749 :                         move16();
     215         749 :                         BREAK;
     216             :                     }
     217             :                 }
     218             : 
     219         875 :                 IF( EQ_16( pos_start, pos_end ) )
     220             :                 {
     221         126 :                     i = Nsv;
     222         126 :                     move16();
     223         126 :                     pos_end = Nsv;
     224         126 :                     move16();
     225             :                 }
     226             : 
     227         875 :                 incr = sub( pos_start, 1 );
     228         875 :                 move16();
     229             : 
     230             : 
     231        2052 :                 FOR( j = sub( pos_end, 1 ); j >= pos_start; j-- )
     232             :                 {
     233        1177 :                     tmp = shl( j, 3 );
     234        1177 :                     tmp1 = shl( incr, 3 );
     235       10593 :                     FOR( k = 0; k < WIDTH_BAND; k++ )
     236             :                     {
     237        9416 :                         tmp2 = mult_r( alpha_fx, t_audio_fx[tmp1 + k] );                       // // Q_audio + Q15 - Q15 -> Q_audio
     238        9416 :                         tmp3 = mult_r( beta_fx, shr( Random( bwe_highrate_seed ), tmp_exp ) ); // // Q_audio + Q15 - Q15 -> Q_audio
     239        9416 :                         t_audio_fx[tmp + k] = add( tmp2, tmp3 );                               // Q_audio
     240        9416 :                         move16();
     241             :                     }
     242             :                     /*incr = (incr == 0) ? sub(pos_start, 1) : sub(incr, 1); */
     243        1177 :                     incr = sub( incr, 1 );
     244        1177 :                     if ( incr < 0 )
     245             :                     {
     246          17 :                         incr = sub( pos_start, 1 );
     247             :                     }
     248             :                 }
     249             :             }
     250             :             ELSE
     251             :             {
     252       19340 :                 i++;
     253             :             }
     254             :         }
     255             :     }
     256             : 
     257         861 :     swb_hr_nonzero_subband_noise_fill_fx( tilt_wb_fx, t_audio_fx, bwe_highrate_seed, WIDTH_BAND, Nsv, Q_audio );
     258             : 
     259         861 :     return;
     260             : }

Generated by: LCOV version 1.14