예제 #1
0
 internal void Reset()
 {
     prev_gain_Q16 = 0;
     Arrays.MemSetInt(exc_Q14, 0, SilkConstants.MAX_FRAME_LENGTH);
     Arrays.MemSetInt(sLPC_Q14_buf, 0, SilkConstants.MAX_LPC_ORDER);
     Arrays.MemSetShort(outBuf, 0, SilkConstants.MAX_FRAME_LENGTH + 2 * SilkConstants.MAX_SUB_FRAME_LENGTH);
     lagPrev        = 0;
     LastGainIndex  = 0;
     fs_kHz         = 0;
     fs_API_hz      = 0;
     nb_subfr       = 0;
     frame_length   = 0;
     subfr_length   = 0;
     ltp_mem_length = 0;
     LPC_order      = 0;
     Arrays.MemSetShort(prevNLSF_Q15, 0, SilkConstants.MAX_LPC_ORDER);
     first_frame_after_reset = 0;
     pitch_lag_low_bits_iCDF = null;
     pitch_contour_iCDF      = null;
     nFramesDecoded          = 0;
     nFramesPerPacket        = 0;
     ec_prevSignalType       = 0;
     ec_prevLagIndex         = 0;
     Arrays.MemSetInt(VAD_flags, 0, SilkConstants.MAX_FRAMES_PER_PACKET);
     LBRR_flag = 0;
     Arrays.MemSetInt(LBRR_flags, 0, SilkConstants.MAX_FRAMES_PER_PACKET);
     resampler_state.Reset();
     psNLSF_CB = null;
     indices.Reset();
     sCNG.Reset();
     lossCnt        = 0;
     prevSignalType = 0;
     sPLC.Reset();
 }
예제 #2
0
        /* Set decoder sampling rate */
        internal int silk_decoder_set_fs(
            int fs_kHz,                         /* I    Sampling frequency (kHz)                    */
            int fs_API_Hz                       /* I    API Sampling frequency (Hz)                 */
            )
        {
            int frame_length, ret = 0;

            Inlines.OpusAssert(fs_kHz == 8 || fs_kHz == 12 || fs_kHz == 16);
            Inlines.OpusAssert(this.nb_subfr == SilkConstants.MAX_NB_SUBFR || this.nb_subfr == SilkConstants.MAX_NB_SUBFR / 2);

            /* New (sub)frame length */
            this.subfr_length = Inlines.silk_SMULBB(SilkConstants.SUB_FRAME_LENGTH_MS, fs_kHz);
            frame_length      = Inlines.silk_SMULBB(this.nb_subfr, this.subfr_length);

            /* Initialize resampler when switching internal or external sampling frequency */
            if (this.fs_kHz != fs_kHz || this.fs_API_hz != fs_API_Hz)
            {
                /* Initialize the resampler for dec_API.c preparing resampling from fs_kHz to API_fs_Hz */
                ret += Resampler.silk_resampler_init(this.resampler_state, Inlines.silk_SMULBB(fs_kHz, 1000), fs_API_Hz, 0);

                this.fs_API_hz = fs_API_Hz;
            }

            if (this.fs_kHz != fs_kHz || frame_length != this.frame_length)
            {
                if (fs_kHz == 8)
                {
                    if (this.nb_subfr == SilkConstants.MAX_NB_SUBFR)
                    {
                        this.pitch_contour_iCDF = Tables.silk_pitch_contour_NB_iCDF;
                    }
                    else
                    {
                        this.pitch_contour_iCDF = Tables.silk_pitch_contour_10_ms_NB_iCDF;
                    }
                }
                else
                {
                    if (this.nb_subfr == SilkConstants.MAX_NB_SUBFR)
                    {
                        this.pitch_contour_iCDF = Tables.silk_pitch_contour_iCDF;
                    }
                    else
                    {
                        this.pitch_contour_iCDF = Tables.silk_pitch_contour_10_ms_iCDF;
                    }
                }
                if (this.fs_kHz != fs_kHz)
                {
                    this.ltp_mem_length = Inlines.silk_SMULBB(SilkConstants.LTP_MEM_LENGTH_MS, fs_kHz);
                    if (fs_kHz == 8 || fs_kHz == 12)
                    {
                        this.LPC_order = SilkConstants.MIN_LPC_ORDER;
                        this.psNLSF_CB = Tables.silk_NLSF_CB_NB_MB;
                    }
                    else
                    {
                        this.LPC_order = SilkConstants.MAX_LPC_ORDER;
                        this.psNLSF_CB = Tables.silk_NLSF_CB_WB;
                    }
                    if (fs_kHz == 16)
                    {
                        this.pitch_lag_low_bits_iCDF = Tables.silk_uniform8_iCDF;
                    }
                    else if (fs_kHz == 12)
                    {
                        this.pitch_lag_low_bits_iCDF = Tables.silk_uniform6_iCDF;
                    }
                    else if (fs_kHz == 8)
                    {
                        this.pitch_lag_low_bits_iCDF = Tables.silk_uniform4_iCDF;
                    }
                    else
                    {
                        /* unsupported sampling rate */
                        Inlines.OpusAssert(false);
                    }
                    this.first_frame_after_reset = 1;
                    this.lagPrev        = 100;
                    this.LastGainIndex  = 10;
                    this.prevSignalType = SilkConstants.TYPE_NO_VOICE_ACTIVITY;
                    Arrays.MemSetShort(this.outBuf, 0, SilkConstants.MAX_FRAME_LENGTH + 2 * SilkConstants.MAX_SUB_FRAME_LENGTH);
                    Arrays.MemSetInt(this.sLPC_Q14_buf, 0, SilkConstants.MAX_LPC_ORDER);
                }

                this.fs_kHz       = fs_kHz;
                this.frame_length = frame_length;
            }

            /* Check that settings are valid */
            Inlines.OpusAssert(this.frame_length > 0 && this.frame_length <= SilkConstants.MAX_FRAME_LENGTH);

            return(ret);
        }