mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-24 10:31:13 +00:00
176 lines
4.3 KiB
C
176 lines
4.3 KiB
C
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
/* encode.c - Encoding function for the iSAC coder */
|
|
|
|
#include "structs.h"
|
|
#include "codec.h"
|
|
#include "pitch_estimator.h"
|
|
|
|
#include <math.h>
|
|
|
|
void WebRtcIsac_InitMasking(MaskFiltstr *maskdata) {
|
|
|
|
int k;
|
|
|
|
for (k = 0; k < WINLEN; k++) {
|
|
maskdata->DataBufferLo[k] = 0.0;
|
|
maskdata->DataBufferHi[k] = 0.0;
|
|
}
|
|
for (k = 0; k < ORDERLO+1; k++) {
|
|
maskdata->CorrBufLo[k] = 0.0;
|
|
maskdata->PreStateLoF[k] = 0.0;
|
|
maskdata->PreStateLoG[k] = 0.0;
|
|
maskdata->PostStateLoF[k] = 0.0;
|
|
maskdata->PostStateLoG[k] = 0.0;
|
|
}
|
|
for (k = 0; k < ORDERHI+1; k++) {
|
|
maskdata->CorrBufHi[k] = 0.0;
|
|
maskdata->PreStateHiF[k] = 0.0;
|
|
maskdata->PreStateHiG[k] = 0.0;
|
|
maskdata->PostStateHiF[k] = 0.0;
|
|
maskdata->PostStateHiG[k] = 0.0;
|
|
}
|
|
|
|
maskdata->OldEnergy = 10.0;
|
|
|
|
/* fill tables for transforms */
|
|
WebRtcIsac_InitTransform();
|
|
|
|
return;
|
|
}
|
|
|
|
void WebRtcIsac_InitPreFilterbank(PreFiltBankstr *prefiltdata)
|
|
{
|
|
int k;
|
|
|
|
for (k = 0; k < QLOOKAHEAD; k++) {
|
|
prefiltdata->INLABUF1[k] = 0;
|
|
prefiltdata->INLABUF2[k] = 0;
|
|
|
|
prefiltdata->INLABUF1_float[k] = 0;
|
|
prefiltdata->INLABUF2_float[k] = 0;
|
|
}
|
|
for (k = 0; k < 2*(QORDER-1); k++) {
|
|
prefiltdata->INSTAT1[k] = 0;
|
|
prefiltdata->INSTAT2[k] = 0;
|
|
prefiltdata->INSTATLA1[k] = 0;
|
|
prefiltdata->INSTATLA2[k] = 0;
|
|
|
|
prefiltdata->INSTAT1_float[k] = 0;
|
|
prefiltdata->INSTAT2_float[k] = 0;
|
|
prefiltdata->INSTATLA1_float[k] = 0;
|
|
prefiltdata->INSTATLA2_float[k] = 0;
|
|
}
|
|
|
|
/* High pass filter states */
|
|
prefiltdata->HPstates[0] = 0.0;
|
|
prefiltdata->HPstates[1] = 0.0;
|
|
|
|
prefiltdata->HPstates_float[0] = 0.0f;
|
|
prefiltdata->HPstates_float[1] = 0.0f;
|
|
|
|
return;
|
|
}
|
|
|
|
void WebRtcIsac_InitPostFilterbank(PostFiltBankstr *postfiltdata)
|
|
{
|
|
int k;
|
|
|
|
for (k = 0; k < 2*POSTQORDER; k++) {
|
|
postfiltdata->STATE_0_LOWER[k] = 0;
|
|
postfiltdata->STATE_0_UPPER[k] = 0;
|
|
|
|
postfiltdata->STATE_0_LOWER_float[k] = 0;
|
|
postfiltdata->STATE_0_UPPER_float[k] = 0;
|
|
}
|
|
|
|
/* High pass filter states */
|
|
postfiltdata->HPstates1[0] = 0.0;
|
|
postfiltdata->HPstates1[1] = 0.0;
|
|
|
|
postfiltdata->HPstates2[0] = 0.0;
|
|
postfiltdata->HPstates2[1] = 0.0;
|
|
|
|
postfiltdata->HPstates1_float[0] = 0.0f;
|
|
postfiltdata->HPstates1_float[1] = 0.0f;
|
|
|
|
postfiltdata->HPstates2_float[0] = 0.0f;
|
|
postfiltdata->HPstates2_float[1] = 0.0f;
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void WebRtcIsac_InitPitchFilter(PitchFiltstr *pitchfiltdata)
|
|
{
|
|
int k;
|
|
|
|
for (k = 0; k < PITCH_BUFFSIZE; k++) {
|
|
pitchfiltdata->ubuf[k] = 0.0;
|
|
}
|
|
pitchfiltdata->ystate[0] = 0.0;
|
|
for (k = 1; k < (PITCH_DAMPORDER); k++) {
|
|
pitchfiltdata->ystate[k] = 0.0;
|
|
}
|
|
pitchfiltdata->oldlagp[0] = 50.0;
|
|
pitchfiltdata->oldgainp[0] = 0.0;
|
|
}
|
|
|
|
void WebRtcIsac_InitWeightingFilter(WeightFiltstr *wfdata)
|
|
{
|
|
int k;
|
|
double t, dtmp, dtmp2, denum, denum2;
|
|
|
|
for (k=0;k<PITCH_WLPCBUFLEN;k++)
|
|
wfdata->buffer[k]=0.0;
|
|
|
|
for (k=0;k<PITCH_WLPCORDER;k++) {
|
|
wfdata->istate[k]=0.0;
|
|
wfdata->weostate[k]=0.0;
|
|
wfdata->whostate[k]=0.0;
|
|
}
|
|
|
|
/* next part should be in Matlab, writing to a global table */
|
|
t = 0.5;
|
|
denum = 1.0 / ((double) PITCH_WLPCWINLEN);
|
|
denum2 = denum * denum;
|
|
for (k=0;k<PITCH_WLPCWINLEN;k++) {
|
|
dtmp = PITCH_WLPCASYM * t * denum + (1-PITCH_WLPCASYM) * t * t * denum2;
|
|
dtmp *= 3.14159265;
|
|
dtmp2 = sin(dtmp);
|
|
wfdata->window[k] = dtmp2 * dtmp2;
|
|
t++;
|
|
}
|
|
}
|
|
|
|
/* clear all buffers */
|
|
void WebRtcIsac_InitPitchAnalysis(PitchAnalysisStruct *State)
|
|
{
|
|
int k;
|
|
|
|
for (k = 0; k < PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2; k++)
|
|
State->dec_buffer[k] = 0.0;
|
|
for (k = 0; k < 2*ALLPASSSECTIONS+1; k++)
|
|
State->decimator_state[k] = 0.0;
|
|
for (k = 0; k < 2; k++)
|
|
State->hp_state[k] = 0.0;
|
|
for (k = 0; k < QLOOKAHEAD; k++)
|
|
State->whitened_buf[k] = 0.0;
|
|
for (k = 0; k < QLOOKAHEAD; k++)
|
|
State->inbuf[k] = 0.0;
|
|
|
|
WebRtcIsac_InitPitchFilter(&(State->PFstr_wght));
|
|
|
|
WebRtcIsac_InitPitchFilter(&(State->PFstr));
|
|
|
|
WebRtcIsac_InitWeightingFilter(&(State->Wghtstr));
|
|
}
|