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