Line data Source code
1 : /*
2 : * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 : *
4 : * Use of this source code is governed by a BSD-style license
5 : * that can be found in the LICENSE file in the root of the source
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 :
11 : /* encode.c - Encoding function for the iSAC coder */
12 :
13 : #include "structs.h"
14 : #include "codec.h"
15 : #include "pitch_estimator.h"
16 :
17 : #include <math.h>
18 :
19 0 : void WebRtcIsac_InitMasking(MaskFiltstr *maskdata) {
20 :
21 : int k;
22 :
23 0 : for (k = 0; k < WINLEN; k++) {
24 0 : maskdata->DataBufferLo[k] = 0.0;
25 0 : maskdata->DataBufferHi[k] = 0.0;
26 : }
27 0 : for (k = 0; k < ORDERLO+1; k++) {
28 0 : maskdata->CorrBufLo[k] = 0.0;
29 0 : maskdata->PreStateLoF[k] = 0.0;
30 0 : maskdata->PreStateLoG[k] = 0.0;
31 0 : maskdata->PostStateLoF[k] = 0.0;
32 0 : maskdata->PostStateLoG[k] = 0.0;
33 : }
34 0 : for (k = 0; k < ORDERHI+1; k++) {
35 0 : maskdata->CorrBufHi[k] = 0.0;
36 0 : maskdata->PreStateHiF[k] = 0.0;
37 0 : maskdata->PreStateHiG[k] = 0.0;
38 0 : maskdata->PostStateHiF[k] = 0.0;
39 0 : maskdata->PostStateHiG[k] = 0.0;
40 : }
41 :
42 0 : maskdata->OldEnergy = 10.0;
43 0 : return;
44 : }
45 :
46 0 : void WebRtcIsac_InitPreFilterbank(PreFiltBankstr *prefiltdata)
47 : {
48 : int k;
49 :
50 0 : for (k = 0; k < QLOOKAHEAD; k++) {
51 0 : prefiltdata->INLABUF1[k] = 0;
52 0 : prefiltdata->INLABUF2[k] = 0;
53 :
54 0 : prefiltdata->INLABUF1_float[k] = 0;
55 0 : prefiltdata->INLABUF2_float[k] = 0;
56 : }
57 0 : for (k = 0; k < 2*(QORDER-1); k++) {
58 0 : prefiltdata->INSTAT1[k] = 0;
59 0 : prefiltdata->INSTAT2[k] = 0;
60 0 : prefiltdata->INSTATLA1[k] = 0;
61 0 : prefiltdata->INSTATLA2[k] = 0;
62 :
63 0 : prefiltdata->INSTAT1_float[k] = 0;
64 0 : prefiltdata->INSTAT2_float[k] = 0;
65 0 : prefiltdata->INSTATLA1_float[k] = 0;
66 0 : prefiltdata->INSTATLA2_float[k] = 0;
67 : }
68 :
69 : /* High pass filter states */
70 0 : prefiltdata->HPstates[0] = 0.0;
71 0 : prefiltdata->HPstates[1] = 0.0;
72 :
73 0 : prefiltdata->HPstates_float[0] = 0.0f;
74 0 : prefiltdata->HPstates_float[1] = 0.0f;
75 :
76 0 : return;
77 : }
78 :
79 0 : void WebRtcIsac_InitPostFilterbank(PostFiltBankstr *postfiltdata)
80 : {
81 : int k;
82 :
83 0 : for (k = 0; k < 2*POSTQORDER; k++) {
84 0 : postfiltdata->STATE_0_LOWER[k] = 0;
85 0 : postfiltdata->STATE_0_UPPER[k] = 0;
86 :
87 0 : postfiltdata->STATE_0_LOWER_float[k] = 0;
88 0 : postfiltdata->STATE_0_UPPER_float[k] = 0;
89 : }
90 :
91 : /* High pass filter states */
92 0 : postfiltdata->HPstates1[0] = 0.0;
93 0 : postfiltdata->HPstates1[1] = 0.0;
94 :
95 0 : postfiltdata->HPstates2[0] = 0.0;
96 0 : postfiltdata->HPstates2[1] = 0.0;
97 :
98 0 : postfiltdata->HPstates1_float[0] = 0.0f;
99 0 : postfiltdata->HPstates1_float[1] = 0.0f;
100 :
101 0 : postfiltdata->HPstates2_float[0] = 0.0f;
102 0 : postfiltdata->HPstates2_float[1] = 0.0f;
103 :
104 0 : return;
105 : }
106 :
107 :
108 0 : void WebRtcIsac_InitPitchFilter(PitchFiltstr *pitchfiltdata)
109 : {
110 : int k;
111 :
112 0 : for (k = 0; k < PITCH_BUFFSIZE; k++) {
113 0 : pitchfiltdata->ubuf[k] = 0.0;
114 : }
115 0 : pitchfiltdata->ystate[0] = 0.0;
116 0 : for (k = 1; k < (PITCH_DAMPORDER); k++) {
117 0 : pitchfiltdata->ystate[k] = 0.0;
118 : }
119 0 : pitchfiltdata->oldlagp[0] = 50.0;
120 0 : pitchfiltdata->oldgainp[0] = 0.0;
121 0 : }
122 :
123 0 : void WebRtcIsac_InitWeightingFilter(WeightFiltstr *wfdata)
124 : {
125 : int k;
126 : double t, dtmp, dtmp2, denum, denum2;
127 :
128 0 : for (k=0;k<PITCH_WLPCBUFLEN;k++)
129 0 : wfdata->buffer[k]=0.0;
130 :
131 0 : for (k=0;k<PITCH_WLPCORDER;k++) {
132 0 : wfdata->istate[k]=0.0;
133 0 : wfdata->weostate[k]=0.0;
134 0 : wfdata->whostate[k]=0.0;
135 : }
136 :
137 : /* next part should be in Matlab, writing to a global table */
138 0 : t = 0.5;
139 0 : denum = 1.0 / ((double) PITCH_WLPCWINLEN);
140 0 : denum2 = denum * denum;
141 0 : for (k=0;k<PITCH_WLPCWINLEN;k++) {
142 0 : dtmp = PITCH_WLPCASYM * t * denum + (1-PITCH_WLPCASYM) * t * t * denum2;
143 0 : dtmp *= 3.14159265;
144 0 : dtmp2 = sin(dtmp);
145 0 : wfdata->window[k] = dtmp2 * dtmp2;
146 0 : t++;
147 : }
148 0 : }
149 :
150 : /* clear all buffers */
151 0 : void WebRtcIsac_InitPitchAnalysis(PitchAnalysisStruct *State)
152 : {
153 : int k;
154 :
155 0 : for (k = 0; k < PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2; k++)
156 0 : State->dec_buffer[k] = 0.0;
157 0 : for (k = 0; k < 2*ALLPASSSECTIONS+1; k++)
158 0 : State->decimator_state[k] = 0.0;
159 0 : for (k = 0; k < 2; k++)
160 0 : State->hp_state[k] = 0.0;
161 0 : for (k = 0; k < QLOOKAHEAD; k++)
162 0 : State->whitened_buf[k] = 0.0;
163 0 : for (k = 0; k < QLOOKAHEAD; k++)
164 0 : State->inbuf[k] = 0.0;
165 :
166 0 : WebRtcIsac_InitPitchFilter(&(State->PFstr_wght));
167 :
168 0 : WebRtcIsac_InitPitchFilter(&(State->PFstr));
169 :
170 0 : WebRtcIsac_InitWeightingFilter(&(State->Wghtstr));
171 0 : }
|