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