shithub: opus

Download patch

ref: 744e59ef01f228923f35a504d9552dd1c8d7a23c
parent: 96739ad35e57706a69b9198b4862a5814f8e98bd
author: Gregory Maxwell <[email protected]>
date: Wed Sep 28 08:40:06 EDT 2011

More resampler cleanups.

--- a/silk/SigProc_FIX.h
+++ b/silk/SigProc_FIX.h
@@ -75,16 +75,6 @@
 );
 
 /*!
- Upsample 2x, low quality
- */
-void silk_resampler_up2(
-    opus_int32                           *S,         /* I/O: State vector [ 2 ]                  */
-    opus_int16                           *out,       /* O:   Output signal [ 2 * len ]           */
-    const opus_int16                     *in,        /* I:   Input signal [ len ]                */
-    opus_int32                           len         /* I:   Number of input samples             */
-);
-
-/*!
 * Downsample 2x, mediocre quality
 */
 void silk_resampler_down2(
@@ -93,7 +83,6 @@
     const opus_int16                     *in,        /* I:   Input signal [ floor(len/2) ]       */
     opus_int32                           inLen       /* I:   Number of input samples             */
 );
-
 
 /*!
  * Downsample by a factor 2/3, low quality
--- a/silk/resampler.c
+++ b/silk/resampler.c
@@ -30,16 +30,14 @@
 #endif
 
 /* Matrix of resampling methods used:
- *                                        Fs_out (kHz)
- *                        8      12     16     24     32     44.1   48
+ *                                 Fs_out (kHz)
+ *                        8      12     16     24    48
  *
- *               8        C      UF     U      UF     UF     UF     UF
- *              12        AF     C      UF     U      UF     UF     UF
- *              16        D      AF     C      UF     U      UF     UF
- * Fs_in (kHz)  24        AIF    D      AF     C      UF     UF     U
- *              32        UF     AF     D      AF     C      UF     UF
- *              44.1      AMI    AMI    AMI    AMI    AMI    C      UF
- *              48        DAF    DAF    AF     D      AF     UF     C
+ *               8        C      UF     U      UF     UF
+ *              12        AF     C      UF     U      UF
+ * Fs_in (kHz)  16        D      AF     C      UF     UF
+ *              24        AIF    D      AF     C      U
+ *              48        DAF    DAF    AF     D      C
  *
  * default method: UF
  *
@@ -48,30 +46,13 @@
  * U   -> Allpass-based 2x upsampling
  * DAF -> Allpass-based 2x downsampling followed by AR2 filter followed by FIR interpolation
  * UF  -> Allpass-based 2x upsampling followed by FIR interpolation
- * AMI -> ARMA4 filter followed by FIR interpolation
  * AF  -> AR2 filter followed by FIR interpolation
  *
- * Input signals sampled above 48 kHz are first downsampled to at most 48 kHz.
- * Output signals sampled above 48 kHz are upsampled from at most 48 kHz.
+ * Signals sampled above 48 kHz are not supported.
  */
 
 #include "resampler_private.h"
 
-/* Greatest common divisor */
-static opus_int32 gcd(
-    opus_int32 a,
-    opus_int32 b
-)
-{
-    opus_int32 tmp;
-    while( b > 0 ) {
-        tmp = a - b * silk_DIV32( a, b );
-        a   = b;
-        b   = tmp;
-    }
-    return a;
-}
-
 #define USE_silk_resampler_copy (0)
 #define USE_silk_resampler_private_up2_HQ_wrapper (1)
 #define USE_silk_resampler_private_IIR_FIR (2)
@@ -84,34 +65,21 @@
     opus_int32                            Fs_Hz_out    /* I:    Output sampling rate (Hz)    */
 )
 {
-    opus_int32 cycleLen, cyclesPerBatch, up2 = 0, down2 = 0;
+    opus_int32 up2 = 0, down2 = 0;
 
     /* Clear state */
     silk_memset( S, 0, sizeof( silk_resampler_state_struct ) );
 
     /* Input checking */
-    if( Fs_Hz_in < 8000 || Fs_Hz_in >  48000 || Fs_Hz_out < 8000 || Fs_Hz_out >  48000 ) {
+    if( (Fs_Hz_in!=8000 && Fs_Hz_in!=12000 && Fs_Hz_in!=16000 && Fs_Hz_in!=24000 && Fs_Hz_in!=48000) ||
+        (Fs_Hz_out!=8000 && Fs_Hz_out!=12000 && Fs_Hz_out!=16000 && Fs_Hz_out!=24000 && Fs_Hz_out!=48000) ) {
         silk_assert( 0 );
         return -1;
     }
 
     /* Number of samples processed per batch */
-    /* First, try 10 ms frames */
     S->batchSize = silk_DIV32_16( Fs_Hz_in, 100 );
-    if( ( silk_MUL( S->batchSize, 100 ) != Fs_Hz_in ) || ( Fs_Hz_in % 100 != 0 ) ) {
-        /* No integer number of input or output samples with 10 ms frames, use greatest common divisor */
-        cycleLen = silk_DIV32( Fs_Hz_in, gcd( Fs_Hz_in, Fs_Hz_out ) );
-        cyclesPerBatch = silk_DIV32( RESAMPLER_MAX_BATCH_SIZE_IN, cycleLen );
-        if( cyclesPerBatch == 0 ) {
-            /* cycleLen too big, let's just use the maximum batch size. Some distortion will result. */
-            S->batchSize = RESAMPLER_MAX_BATCH_SIZE_IN;
-            silk_assert( 0 );
-        } else {
-            S->batchSize = silk_MUL( cyclesPerBatch, cycleLen );
-        }
-    }
 
-
     /* Find resampler with the right sampling ratio */
     if( Fs_Hz_out > Fs_Hz_in ) {
         /* Upsample */
@@ -122,7 +90,6 @@
             /* Default resampler */
             S->resampler_function = USE_silk_resampler_private_IIR_FIR;
             up2 = 1;
-            S->up2_hq = Fs_Hz_in <= 24000;
         }
     } else if ( Fs_Hz_out < Fs_Hz_in ) {
         /* Downsample */
@@ -138,10 +105,6 @@
             S->FIR_Fracs = 1;
             S->Coefs = silk_Resampler_1_2_COEFS;
             S->resampler_function = USE_silk_resampler_private_down_FIR;
-        } else if( silk_MUL( Fs_Hz_out, 8 ) == silk_MUL( Fs_Hz_in, 3 ) ) {        /* Fs_out : Fs_in = 3 : 8 */
-            S->FIR_Fracs = 3;
-            S->Coefs = silk_Resampler_3_8_COEFS;
-            S->resampler_function = USE_silk_resampler_private_down_FIR;
         } else if( silk_MUL( Fs_Hz_out, 3 ) == Fs_Hz_in ) {                      /* Fs_out : Fs_in = 1 : 3 */
             S->FIR_Fracs = 1;
             S->Coefs = silk_Resampler_1_3_COEFS;
@@ -156,26 +119,10 @@
             down2 = 1;
             S->Coefs = silk_Resampler_1_3_COEFS;
             S->resampler_function = USE_silk_resampler_private_down_FIR;
-        } else if( silk_MUL( Fs_Hz_out, 441 ) == silk_MUL( Fs_Hz_in, 80 ) ) {     /* Fs_out : Fs_in = 80 : 441 */
-            S->Coefs = silk_Resampler_80_441_ARMA4_COEFS;
-            S->resampler_function = USE_silk_resampler_private_IIR_FIR;
-        } else if( silk_MUL( Fs_Hz_out, 441 ) == silk_MUL( Fs_Hz_in, 120 ) ) {    /* Fs_out : Fs_in = 120 : 441 */
-            S->Coefs = silk_Resampler_120_441_ARMA4_COEFS;
-            S->resampler_function = USE_silk_resampler_private_IIR_FIR;
-        } else if( silk_MUL( Fs_Hz_out, 441 ) == silk_MUL( Fs_Hz_in, 160 ) ) {    /* Fs_out : Fs_in = 160 : 441 */
-            S->Coefs = silk_Resampler_160_441_ARMA4_COEFS;
-            S->resampler_function = USE_silk_resampler_private_IIR_FIR;
-        } else if( silk_MUL( Fs_Hz_out, 441 ) == silk_MUL( Fs_Hz_in, 240 ) ) {    /* Fs_out : Fs_in = 240 : 441 */
-            S->Coefs = silk_Resampler_240_441_ARMA4_COEFS;
-            S->resampler_function = USE_silk_resampler_private_IIR_FIR;
-        } else if( silk_MUL( Fs_Hz_out, 441 ) == silk_MUL( Fs_Hz_in, 320 ) ) {    /* Fs_out : Fs_in = 320 : 441 */
-            S->Coefs = silk_Resampler_320_441_ARMA4_COEFS;
-            S->resampler_function = USE_silk_resampler_private_IIR_FIR;
         } else {
-            /* Default resampler */
-            S->resampler_function = USE_silk_resampler_private_IIR_FIR;
-            up2 = 1;
-            S->up2_hq = Fs_Hz_in <= 24000;
+            /* None available */
+            silk_assert( 0 );
+            return -1;
         }
     } else {
         /* Input and output sampling rates are equal: copy */
@@ -191,8 +138,6 @@
         S->invRatio_Q16++;
     }
 
-    S->magic_number = 123456789;
-
     return 0;
 }
 
@@ -216,12 +161,6 @@
     opus_int32                            inLen        /* I:    Number of input samples        */
 )
 {
-    /* Verify that state was initialized and has not been corrupted */
-    if( S->magic_number != 123456789 ) {
-        silk_assert( 0 );
-        return -1;
-    }
-
     /* Input and output sampling rate are at most 48000 Hz */
     switch(S->resampler_function) {
         case USE_silk_resampler_private_up2_HQ_wrapper:
@@ -236,6 +175,5 @@
         default:
             silk_memcpy( out, in, inLen * sizeof( opus_int16 ) );
     }
-
     return 0;
 }
--- a/silk/resampler_private_IIR_FIR.c
+++ b/silk/resampler_private_IIR_FIR.c
@@ -76,11 +76,7 @@
 
         if( S->input2x == 1 ) {
             /* Upsample 2x */
-            if (S->up2_hq) {
                 silk_resampler_private_up2_HQ( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_144 ], in, nSamplesIn );
-            } else {
-                silk_resampler_up2( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_144 ], in, nSamplesIn );
-            }
         } else {
             /* Fourth-order ARMA filter */
             silk_resampler_private_ARMA4( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_144 ], in, S->Coefs, nSamplesIn );
--- a/silk/resampler_rom.c
+++ b/silk/resampler_rom.c
@@ -38,10 +38,6 @@
 const opus_int16 silk_resampler_down2_0 = 9872;
 const opus_int16 silk_resampler_down2_1 = 39809 - 65536;
 
-/* Tables for 2x upsampler, low quality */
-const opus_int16 silk_resampler_up2_lq_0 = 8102;
-const opus_int16 silk_resampler_up2_lq_1 = 36783 - 65536;
-
 /* Tables for 2x upsampler, high quality */
 const opus_int16 silk_resampler_up2_hq_0[ 2 ] = {  4280, 33727 - 65536 };
 const opus_int16 silk_resampler_up2_hq_1[ 2 ] = { 16295, 54015 - 65536 };
@@ -66,13 +62,6 @@
        -91,    162,    169,   -342,   -505,   1332,   5281,   8742,
 };
 
-silk_DWORD_ALIGN const opus_int16 silk_Resampler_3_8_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ] = {
-     12634, -14550,
-       246,   -175,   -326,   -113,    764,   2209,   3664,   4402,
-       171,      3,   -301,   -258,    391,   1693,   3227,   4272,
-        88,    138,   -236,   -327,     95,   1203,   2733,   4022,
-};
-
 silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR / 2 ] = {
      16306, -14409,
         99,   -201,   -220,    -16,    572,   1483,   2433,   3043,
@@ -82,35 +71,6 @@
      -2797,  -6507,
       4697,  10739,
       1567,   8276,
-};
-
-silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_3_COEFS_LQ[ 2 + 3 ] = {
-     16777,  -9792,
-       890,   1614,   2148,
-};
-
-
-/* Tables with coefficients for 4th order ARMA filter (35 Words), in a packed format:       */
-/*    { B1_Q14[1], B2_Q14[1], -A1_Q14[1], -A1_Q14[2], -A2_Q14[1], -A2_Q14[2], gain_Q16 }    */
-/* where it is assumed that B*_Q14[0], B*_Q14[2], A*_Q14[0] are all 16384                   */
-silk_DWORD_ALIGN const opus_int16 silk_Resampler_320_441_ARMA4_COEFS[ 7 ] = {
-     31454,  24746,  -9706,  -3386, -17911, -13243,  24797
-};
-
-silk_DWORD_ALIGN const opus_int16 silk_Resampler_240_441_ARMA4_COEFS[ 7 ] = {
-     28721,  11254,   3189,  -2546,  -1495, -12618,  11562
-};
-
-silk_DWORD_ALIGN const opus_int16 silk_Resampler_160_441_ARMA4_COEFS[ 7 ] = {
-     23492,  -6457,  14358,  -4856,  14654, -13008,   4456
-};
-
-silk_DWORD_ALIGN const opus_int16 silk_Resampler_120_441_ARMA4_COEFS[ 7 ] = {
-     19311, -15569,  19489,  -6950,  21441, -13559,   2370
-};
-
-silk_DWORD_ALIGN const opus_int16 silk_Resampler_80_441_ARMA4_COEFS[ 7 ] = {
-     13248, -23849,  24126,  -9486,  26806, -14286,   1065
 };
 
 /* Table with interplation fractions of 1/288 : 2/288 : 287/288 (432 Words) */
--- a/silk/resampler_rom.h
+++ b/silk/resampler_rom.h
@@ -44,10 +44,6 @@
 extern const opus_int16 silk_resampler_down2_0;
 extern const opus_int16 silk_resampler_down2_1;
 
-/* Tables for 2x upsampler, low quality. Values above 32767 intentionally wrap to a negative value. */
-extern const opus_int16 silk_resampler_up2_lq_0;
-extern const opus_int16 silk_resampler_up2_lq_1;
-
 /* Tables for 2x upsampler, high quality. Values above 32767 intentionally wrap to a negative value. */
 extern const opus_int16 silk_resampler_up2_hq_0[ 2 ];
 extern const opus_int16 silk_resampler_up2_hq_1[ 2 ];
@@ -57,17 +53,8 @@
 extern const opus_int16 silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ];
 extern const opus_int16 silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR / 2 ];
 extern const opus_int16 silk_Resampler_1_2_COEFS[ 2 +     RESAMPLER_DOWN_ORDER_FIR / 2 ];
-extern const opus_int16 silk_Resampler_3_8_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR / 2 ];
 extern const opus_int16 silk_Resampler_1_3_COEFS[ 2 +     RESAMPLER_DOWN_ORDER_FIR / 2 ];
 extern const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ];
-extern const opus_int16 silk_Resampler_1_3_COEFS_LQ[ 2 + 3 ];
-
-/* Tables with coefficients for 4th order ARMA filter */
-extern const opus_int16 silk_Resampler_320_441_ARMA4_COEFS[ 7 ];
-extern const opus_int16 silk_Resampler_240_441_ARMA4_COEFS[ 7 ];
-extern const opus_int16 silk_Resampler_160_441_ARMA4_COEFS[ 7 ];
-extern const opus_int16 silk_Resampler_120_441_ARMA4_COEFS[ 7 ];
-extern const opus_int16 silk_Resampler_80_441_ARMA4_COEFS[ 7 ];
 
 /* Table with interplation fractions of 1/288 : 2/288 : 287/288 (432 Words) */
 extern const opus_int16 silk_resampler_frac_FIR_144[ 144 ][ RESAMPLER_ORDER_FIR_144 / 2 ];
--- a/silk/resampler_structs.h
+++ b/silk/resampler_structs.h
@@ -42,13 +42,11 @@
     opus_int32       sFIR[ SILK_RESAMPLER_MAX_FIR_ORDER ];
     opus_int32       sDown2[ 2 ];
     opus_int32       resampler_function;
-    opus_int32       up2_hq;
     opus_int32       batchSize;
     opus_int32       invRatio_Q16;
     opus_int32       FIR_Fracs;
     opus_int32       input2x;
     const opus_int16    *Coefs;
-    opus_int32 magic_number;
 } silk_resampler_state_struct;
 
 #ifdef __cplusplus
--- a/silk/resampler_up2.c
+++ /dev/null
@@ -1,71 +1,0 @@
-/***********************************************************************
-Copyright (c) 2006-2011, Skype Limited. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, (subject to the limitations in the disclaimer below)
-are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-- Neither the name of Skype Limited, nor the names of specific
-contributors, may be used to endorse or promote products derived from
-this software without specific prior written permission.
-NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED
-BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-***********************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "SigProc_FIX.h"
-#include "resampler_rom.h"
-
-/* Upsample by a factor 2, low quality */
-void silk_resampler_up2(
-    opus_int32                           *S,         /* I/O: State vector [ 2 ]                  */
-    opus_int16                           *out,       /* O:   Output signal [ 2 * len ]           */
-    const opus_int16                     *in,        /* I:   Input signal [ len ]                */
-    opus_int32                           len         /* I:   Number of input samples             */
-)
-{
-    opus_int32 k;
-    opus_int32 in32, out32, Y, X;
-
-    silk_assert( silk_resampler_up2_lq_0 > 0 );
-    silk_assert( silk_resampler_up2_lq_1 < 0 );
-    /* Internal variables and state are in Q10 format */
-    for( k = 0; k < len; k++ ) {
-        /* Convert to Q10 */
-        in32 = silk_LSHIFT( (opus_int32)in[ k ], 10 );
-
-        /* All-pass section for even output sample */
-        Y      = silk_SUB32( in32, S[ 0 ] );
-        X      = silk_SMULWB( Y, silk_resampler_up2_lq_0 );
-        out32  = silk_ADD32( S[ 0 ], X );
-        S[ 0 ] = silk_ADD32( in32, X );
-
-        /* Convert back to int16 and store to output */
-        out[ 2 * k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32, 10 ) );
-
-        /* All-pass section for odd output sample */
-        Y      = silk_SUB32( in32, S[ 1 ] );
-        X      = silk_SMLAWB( Y, Y, silk_resampler_up2_lq_1 );
-        out32  = silk_ADD32( S[ 1 ], X );
-        S[ 1 ] = silk_ADD32( in32, X );
-
-        /* Convert back to int16 and store to output */
-        out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32, 10 ) );
-    }
-}
--- a/silk/silk_common.vcxproj
+++ b/silk/silk_common.vcxproj
@@ -151,7 +151,6 @@
     <ClCompile Include="resampler_private_IIR_FIR.c" />
     <ClCompile Include="resampler_private_up2_HQ.c" />
     <ClCompile Include="resampler_rom.c" />
-    <ClCompile Include="resampler_up2.c" />
     <ClCompile Include="scale_copy_vector16.c" />
     <ClCompile Include="scale_vector.c" />
     <ClCompile Include="schur.c" />
--- a/silk/silk_common.vcxproj.filters
+++ b/silk/silk_common.vcxproj.filters
@@ -213,9 +213,6 @@
     <ClCompile Include="resampler_rom.c">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="resampler_up2.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="scale_copy_vector16.c">
       <Filter>Source Files</Filter>
     </ClCompile>
--- a/silk_sources.mk
+++ b/silk_sources.mk
@@ -76,7 +76,6 @@
 silk/resampler_private_IIR_FIR.c \
 silk/resampler_private_up2_HQ.c \
 silk/resampler_rom.c \
-silk/resampler_up2.c \
 silk/scale_copy_vector16.c \
 silk/scale_vector.c \
 silk/schur64.c \