📄 code_lsf.c
字号:
/*LINTLIBRARY*/ /*PROTOLIB1*/#include <math.h>
#include <stdlib.h>#include "main.h"#include "lsftable.h"#include "code_lsf.h"int BITS[10] = {3, 4, 4, 4, 4, 3, 3, 3, 3, 3};#define FSCALE 8000.0#ifdef NEW_LSF_CODE#define MIN_LSF_DIST 39#else#define MIN_LSF_DIST 0#endifstatic void AssignLSFFreqs(int findex[ORDER],float qlsp[ORDER]);static void CalcLSFFreq(float lsp[ORDER],int frequency,float lsf[ORDER]);static void CheckMono(int table[LSFTABLE_LENGTH][LSFTABLE_WIDTH],int index[],int num,float lsf[],int level,float *errorup,float *errordn,int *nonmono);static void CorrectNonMono(float errorup,float errordn,int findex[],int where,int level);static void InitLSFQuant(int table[LSFTABLE_LENGTH][LSFTABLE_WIDTH],int lsf[],int level,int lsfnum);static void QuantizeLSF(float input,int level[],int nlevel,int *findex);/*************************************************************************** ** ROUTINE* QuanLSF** FUNCTION* Quantize line spectral frequencies* SYNOPSIS* QuanLSF(lsf, qlsf, freq_index)** formal** data I/O* name type type function* -------------------------------------------------------------------* lsf float i Unquantized LSFs* qlsf float o Quantized LSFs* freq_index int o Indexes into frequency array***************************************************************************/void QuanLSF(float lsf[ORDER],float qlsf[ORDER],int freq_index[ORDER]){float freqs[ORDER];int i, level;int LSFInit[16];float errorup, errordn;int nonmonotonic=FALSE;/* Calculate frequencies for LSPs */ CalcLSFFreq(lsf, 8000, freqs);/* For each LSF */ for(i=0;i<ORDER;i++) {/* Calculate quantization level for ith LSF based on bit allocation */ level = (int)pow(2.0, (double)BITS[i]) - 1;/* Assign initial quantized LSFs */ InitLSFQuant(LSFTable, LSFInit, level, i);/* Quantize LSFs */ QuantizeLSF(freqs[i], LSFInit, level+1, &freq_index[i]);/* Check for monotonicity */ if(i>0) CheckMono(LSFTable, freq_index, i, freqs, level, &errorup, &errordn, &nonmonotonic);/* Correct if nonmonotonic */ if (nonmonotonic) CorrectNonMono(errorup, errordn, freq_index, i, level); }/* Quantize LSF frequencies using indices found above */ AssignLSFFreqs(freq_index, qlsf);}/*************************************************************************** ** ROUTINE* CalcLSFFreq** FUNCTION* Calculate LSFs from LSPs using input frequency* SYNOPSIS* CalcLSFFreq(lsp, frequency, lsf)** formal** data I/O* name type type function* -------------------------------------------------------------------* lsp float i Frame of input line spectral pairs* frequency int i Sampling frequency* lsf float o Frame of output line spectral frequencies***************************************************************************/void CalcLSFFreq(float lsf[ORDER],int frequency,float freqs[ORDER]){int i;/* Calculate LSF based on sampling frequency */ for(i=0;i<ORDER;i++) { freqs[i] = (float)frequency * lsf[i]; }}/*************************************************************************** ** ROUTINE* InitLSFQuant** FUNCTION* Initialize Quantized LSFs* SYNOPSIS* InitLSFQuant(table, lsf, n)** formal** data I/O* name type type function* -------------------------------------------------------------------* table int i Table of LSFs* lsf float o Frame of output line spectral frequencies* level int i Number of levels* lsfnum int i LSF number (not amount, but item number) ***************************************************************************/void InitLSFQuant(int table[LSFTABLE_LENGTH][LSFTABLE_WIDTH],int lsf[],int level,int lsfnum){int i;/* Assign values from table */ for(i=0;i<=level;i++) { lsf[i] = table[lsfnum][i]; }}/*************************************************************************** ** ROUTINE* CheckMono** FUNCTION* Check frequencies indices for monotonicity* SYNOPSIS* CheckMono(table, index, num, lsf, errorup, errordn, nonmono)** formal** data I/O* name type type function* -------------------------------------------------------------------* table int i Table of LSFs* index int i Index into table* num int i LSF number* lsf float i Line spectral frequencies* level int i Quantization level* errorup float o Upward error correction* errordn float o Downward error correction* nonmono int o Flag indicating lack of monotonicity***************************************************************************/void CheckMono(int table[LSFTABLE_LENGTH][LSFTABLE_WIDTH],int index[],int num,float lsf[],int level,float *errorup,float *errordn,int *nonmono){/* Check this frequency agains the previous one */ if(table[num][index[num]] - MIN_LSF_DIST <= table[num-1][index[num-1]]) { *errorup = fabs(lsf[num] - table[num][min(index[num]+1, level)]) + fabs(lsf[num-1] - table[num-1][index[num-1]]); *errordn = fabs(lsf[num] - table[num][index[num]]) + fabs(lsf[num-1] - table[num-1][max(index[num-1]-1, 0)]); *nonmono = TRUE; } else *nonmono = FALSE;}/*************************************************************************** ** ROUTINE* CorrectNonMono** FUNCTION* Correct index for minimum error if nonmonotonic* SYNOPSIS* CorrectNonMono(errorup, errordn, findex, where, level)** formal** data I/O* name type type function* -------------------------------------------------------------------* errorup float i Error adjustment measurement* errordn float i Error adjustment measurement* findex float i/o Frequency index into LSFTable* where int i Current LSF level* level int i Number of quantization levels available***************************************************************************/void CorrectNonMono(float errorup,float errordn,int findex[],int where,int level){ if (errorup < errordn) { findex[where] = min(findex[where]+1, level); while (LSFTable[where][findex[where]] - MIN_LSF_DIST < LSFTable[where-1][findex[where-1]]) { findex[where] = min(findex[where]+1, level); } } else { if (where == 1) { findex[where-1] = max(findex[where-1]-1, 0); } else { if (LSFTable[where-1][max(findex[where-1]-1,0)] - MIN_LSF_DIST > LSFTable[where-2][findex[where-2]]) { findex[where-1] = max(findex[where-1]-1, 0); } else { findex[where] = min(findex[where]+1, level); while(LSFTable[where][findex[where]] - MIN_LSF_DIST < LSFTable[where-1][findex[where-1]]) { findex[where] = min(findex[where]+1, level); } } } }}/*************************************************************************** ** ROUTINE* AssignLSFFreqs** FUNCTION* Correct index for minimum error if nonmonotonic* SYNOPSIS* AssignLSFFreqs(findex, qlsp)** formal** data I/O* name type type function* -------------------------------------------------------------------* findex int i Frequency index into LSF Table* qlsp int o Quantized line spectral parameter***************************************************************************/void AssignLSFFreqs(int findex[ORDER],float qlsp[ORDER]){int i;/* Quantize LSF frequencies using indices passed in */ for(i=0;i<ORDER;i++) { qlsp[i] = ((float)LSFTable[i][findex[i]] / FSCALE); }}/**************************************************************************** ROUTINE* UnquanLSF** FUNCTION* * Independent nonuniform scalar lsf decoder ** SYNOPSIS* UnquanLSF(findex,order,lsf)** formal ** data I/O* name type type function* -------------------------------------------------------------------* findex int i lsf frequency index* no int i lpc order* lsf float o lsf quantized frequency****************************************************************************** CALLED BY** codeparm***************************************************************************/void UnquanLSF(int findex[], int order,float lsf[]){ int i; /* *** choose appropriate frequency by findex */ for (i = 0; i < order; i++) { lsf[i] = LSFTable[i][findex[i]]/FSCALE; }}/**************************************************************************** ROUTINE* QuantizeLSF** FUNCTION* Nearest output level scalar quantizer** SYNOPSIS* QuantizeLSF(input, level, nlevel, findex)** formal ** data I/O* name type type function* -------------------------------------------------------------------* input real i Scalar to be quantized* level(nlevel) real i Output level table* nlevel int i Number of quantizer levels* findex int o Index to quantized output (zero based!)*****************************************************************************/void QuantizeLSF(float input,int level[],int nlevel,int *findex){int i;float dist, low=0.0;/* *** Quantize to nearest output level: */ low = (float)fabs((double)(input - level[0])); *findex = 0; for(i = 1; i< nlevel; i++) { dist = (float)fabs((double)(input - level[i])); if ((dist < low) || (i == 0)) { low = dist; *findex = i; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -