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/* 12 * encode_lpc_swb.h 13 * 14 * This file contains declaration of functions used to 15 * encode LPC parameters (Shape & gain) of the upper band. 16 * 17 */ 18 19#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENCODE_LPC_SWB_H_ 20#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENCODE_LPC_SWB_H_ 21 22#include "typedefs.h" 23#include "settings.h" 24#include "structs.h" 25 26 27/****************************************************************************** 28 * WebRtcIsac_RemoveLarMean() 29 * 30 * Remove the means from LAR coefficients. 31 * 32 * Input: 33 * -lar : pointer to lar vectors. LAR vectors are 34 * concatenated. 35 * -bandwidth : indicates if the given LAR vectors belong 36 * to SWB-12kHz or SWB-16kHz. 37 * 38 * Output: 39 * -lar : pointer to mean-removed LAR:s. 40 * 41 * 42 */ 43WebRtc_Word16 WebRtcIsac_RemoveLarMean( 44 double* lar, 45 WebRtc_Word16 bandwidth); 46 47/****************************************************************************** 48 * WebRtcIsac_DecorrelateIntraVec() 49 * 50 * Remove the correlation amonge the components of LAR vectors. If LAR vectors 51 * of one frame are put in a matrix where each column is a LAR vector of a 52 * sub-frame, then this is equivalent to multiplying the LAR matrix with 53 * a decorrelting mtrix from left. 54 * 55 * Input: 56 * -inLar : pointer to mean-removed LAR vecrtors. 57 * -bandwidth : indicates if the given LAR vectors belong 58 * to SWB-12kHz or SWB-16kHz. 59 * 60 * Output: 61 * -out : decorrelated LAR vectors. 62 */ 63WebRtc_Word16 WebRtcIsac_DecorrelateIntraVec( 64 const double* inLAR, 65 double* out, 66 WebRtc_Word16 bandwidth); 67 68 69/****************************************************************************** 70 * WebRtcIsac_DecorrelateInterVec() 71 * 72 * Remover the correlation among mean-removed LAR vectors. If LAR vectors 73 * of one frame are put in a matrix where each column is a LAR vector of a 74 * sub-frame, then this is equivalent to multiplying the LAR matrix with 75 * a decorrelting mtrix from right. 76 * 77 * Input: 78 * -data : pointer to matrix of LAR vectors. The matrix 79 * is stored column-wise. 80 * -bandwidth : indicates if the given LAR vectors belong 81 * to SWB-12kHz or SWB-16kHz. 82 * 83 * Output: 84 * -out : decorrelated LAR vectors. 85 */ 86WebRtc_Word16 WebRtcIsac_DecorrelateInterVec( 87 const double* data, 88 double* out, 89 WebRtc_Word16 bandwidth); 90 91 92/****************************************************************************** 93 * WebRtcIsac_QuantizeUncorrLar() 94 * 95 * Quantize the uncorrelated parameters. 96 * 97 * Input: 98 * -data : uncorrelated LAR vectors. 99 * -bandwidth : indicates if the given LAR vectors belong 100 * to SWB-12kHz or SWB-16kHz. 101 * 102 * Output: 103 * -data : quantized version of the input. 104 * -idx : pointer to quantization indices. 105 */ 106double WebRtcIsac_QuantizeUncorrLar( 107 double* data, 108 int* idx, 109 WebRtc_Word16 bandwidth); 110 111 112/****************************************************************************** 113 * WebRtcIsac_CorrelateIntraVec() 114 * 115 * This is the inverse of WebRtcIsac_DecorrelateIntraVec(). 116 * 117 * Input: 118 * -data : uncorrelated parameters. 119 * -bandwidth : indicates if the given LAR vectors belong 120 * to SWB-12kHz or SWB-16kHz. 121 * 122 * Output: 123 * -out : correlated parametrs. 124 */ 125WebRtc_Word16 WebRtcIsac_CorrelateIntraVec( 126 const double* data, 127 double* out, 128 WebRtc_Word16 bandwidth); 129 130 131/****************************************************************************** 132 * WebRtcIsac_CorrelateInterVec() 133 * 134 * This is the inverse of WebRtcIsac_DecorrelateInterVec(). 135 * 136 * Input: 137 * -data 138 * -bandwidth : indicates if the given LAR vectors belong 139 * to SWB-12kHz or SWB-16kHz. 140 * 141 * Output: 142 * -out : correlated parametrs. 143 */ 144WebRtc_Word16 WebRtcIsac_CorrelateInterVec( 145 const double* data, 146 double* out, 147 WebRtc_Word16 bandwidth); 148 149 150/****************************************************************************** 151 * WebRtcIsac_AddLarMean() 152 * 153 * This is the inverse of WebRtcIsac_RemoveLarMean() 154 * 155 * Input: 156 * -data : pointer to mean-removed LAR:s. 157 * -bandwidth : indicates if the given LAR vectors belong 158 * to SWB-12kHz or SWB-16kHz. 159 * 160 * Output: 161 * -data : pointer to LARs. 162 */ 163WebRtc_Word16 WebRtcIsac_AddLarMean( 164 double* data, 165 WebRtc_Word16 bandwidth); 166 167 168/****************************************************************************** 169 * WebRtcIsac_DequantizeLpcParam() 170 * 171 * Get the quantized value of uncorrelated LARs given the quantization indices. 172 * 173 * Input: 174 * -idx : pointer to quantiztion indices. 175 * -bandwidth : indicates if the given LAR vectors belong 176 * to SWB-12kHz or SWB-16kHz. 177 * 178 * Output: 179 * -out : pointer to quantized values. 180 */ 181WebRtc_Word16 WebRtcIsac_DequantizeLpcParam( 182 const int* idx, 183 double* out, 184 WebRtc_Word16 bandwidth); 185 186 187/****************************************************************************** 188 * WebRtcIsac_ToLogDomainRemoveMean() 189 * 190 * Transform the LPC gain to log domain then remove the mean value. 191 * 192 * Input: 193 * -lpcGain : pointer to LPC Gain, expecting 6 LPC gains 194 * 195 * Output: 196 * -lpcGain : mean-removed in log domain. 197 */ 198WebRtc_Word16 WebRtcIsac_ToLogDomainRemoveMean( 199 double* lpGains); 200 201 202/****************************************************************************** 203 * WebRtcIsac_DecorrelateLPGain() 204 * 205 * Decorrelate LPC gains. There are 6 LPC Gains per frame. This is like 206 * multiplying gain vector with decorrelating matrix. 207 * 208 * Input: 209 * -data : LPC gain in log-domain with mean removed. 210 * 211 * Output: 212 * -out : decorrelated parameters. 213 */ 214WebRtc_Word16 WebRtcIsac_DecorrelateLPGain( 215 const double* data, 216 double* out); 217 218 219/****************************************************************************** 220 * WebRtcIsac_QuantizeLpcGain() 221 * 222 * Quantize the decorrelated log-domain gains. 223 * 224 * Input: 225 * -lpcGain : uncorrelated LPC gains. 226 * 227 * Output: 228 * -idx : quantization indices 229 * -lpcGain : quantized value of the inpt. 230 */ 231double WebRtcIsac_QuantizeLpcGain( 232 double* lpGains, 233 int* idx); 234 235 236/****************************************************************************** 237 * WebRtcIsac_DequantizeLpcGain() 238 * 239 * Get the quantized values given the quantization indices. 240 * 241 * Input: 242 * -idx : pointer to quantization indices. 243 * 244 * Output: 245 * -lpcGains : quantized values of the given parametes. 246 */ 247WebRtc_Word16 WebRtcIsac_DequantizeLpcGain( 248 const int* idx, 249 double* lpGains); 250 251 252/****************************************************************************** 253 * WebRtcIsac_CorrelateLpcGain() 254 * 255 * This is the inverse of WebRtcIsac_DecorrelateLPGain(). 256 * 257 * Input: 258 * -data : decorrelated parameters. 259 * 260 * Output: 261 * -out : correlated parameters. 262 */ 263WebRtc_Word16 WebRtcIsac_CorrelateLpcGain( 264 const double* data, 265 double* out); 266 267 268/****************************************************************************** 269 * WebRtcIsac_AddMeanToLinearDomain() 270 * 271 * This is the inverse of WebRtcIsac_ToLogDomainRemoveMean(). 272 * 273 * Input: 274 * -lpcGain : LPC gain in log-domain & mean removed 275 * 276 * Output: 277 * -lpcGain : LPC gain in normal domain. 278 */ 279WebRtc_Word16 WebRtcIsac_AddMeanToLinearDomain( 280 double* lpcGains); 281 282 283#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENCODE_LPC_SWB_H_ 284