📄 encode.c
字号:
/******************************************************************** ENCODE Version 48********************************************************************* Quantize LPC parameters for transmission** INPUTS:* ORDER - Number of RC's* VOICE - Half frame voicing decisions* PITCH - Pitch* RMS - Energy* RC - Reflection coefficients* CORRP - Error Correction: TRUE = yes, FALSE = none* OUTPUTS:* IPITCH - Coded pitch and voicing* IRMS - Quantized energy* IRC - Quantized reflection coefficients**/#include "config.ch"#include "lpcdefs.h"#include <math.h>int enctab[16]={0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15};int entau[60]={19,11,27,25,29,21,23,22,30,14,15,7,39, 38,46,42,43,41,45,37,53,49,51,50,54,52, 60,56,58,26,90,88,92,84,86,82,83,81,85, 69,77,73,75,74,78,70,71,67,99,97,113,112, 114,98,106,104,108,100,101,76};int enadd[8]={1920,-768,2432,1280,3584,1536,2816,-1152};float enscl[8]={.0204,.0167,.0145,.0147,.0143,.0135,.0125,.0112};int enbits[8]={6,5,4,4,4,4,3,3};int entab6[64]={0,0,0,0,0,0,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4, 5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8, 9,9,9,10,10,11,11,12,13,14,15};int rmst[64]={1024,936,856,784,718,656,600,550, 502,460,420,384,352,328,294,270, 246,226,206,188,172,158,144,132, 120,110,102,92,84,78,70,64, 60,54,50,46,42,38,34,32, 30,26,24,22,20,18,17,16, 15,14,13,12,11,10,9,8, 7,6,5,4,3,2,1,0};encode(voice, pitch, rms, rc, ipitch, irms, irc )int voice[2], *pitch;float *rms, rc[ORDER];int *ipitch, *irms, irc[ORDER];{int i, j, i2, i3, mrk, nbit, idel;float ftemp;int itemp;/* Scale RMS and RC's to integers */*irms = *rms;for(i=1;i<=ORDER;i++) irc[i] = rc[i] * 32768; /* Encode pitch and voicing */if(voice[1]!=0&&voice[2]!=0) *ipitch = entau[*pitch-1];else *ipitch = 0; if(voice[1]!=voice[2]) *ipitch = 127;/* Encode RMS by binary table search */j = 32;idel = 16;*irms = mmin(*irms,1023);while(idel>0) { if (*irms>rmst[j-1]) j -= idel; if (*irms<rmst[j-1]) j += idel; idel *= 0.5;}if (*irms>rmst[j-1]) j--;*irms = 31 - j*0.5;/* Encode RC(1) and (2) as log-area-ratios */for(i=1;i<=2;i++) { i2 = irc[i]; mrk = 0; if(i2<0) { i2 = -i2 ; mrk = 1; } i2 = i2>>9; i2 = mmin(i2,63); i2 = entab6[i2]; if(mrk!=0) i2 = -i2; irc[i] = i2;}/* Encode RC(3) - (10) linearly, remove bias then scale */for(i=3;i<=ORDER;i++) { i2 = irc[i]>>1;/* i2 = (i2+enadd[ORDER-i])*enscl[ORDER-i]; */ /* problem with truncating negative numbers */ if(enadd[ORDER-i] < 0) { ftemp = -(i2+enadd[ORDER-i])*enscl[ORDER-i]; itemp = ftemp; i2 = -itemp; } else i2 = (i2+enadd[ORDER-i])*enscl[ORDER-i];/***** i2 = mmin(mmax(i2,-127),127); *****/ if( (i2 < -127) || (i2 > 127)) if(i2 < -127) i2 = -127; else if (i2> 127) i2 = 127; nbit = enbits[ORDER-i]; i3 = 0; if(i2<0) i3 = -1; /*i2 = i2/pow(2.,(float)nbit);*/ i2 = i2 / (2 << (nbit-1)); if(i3==-1) i2--; irc[i] = i2;}/* Protect the most significant bits of the most* important parameters during non-voiced frames.* RC(1) - RC(4) are protected using 20 parity bits* replacing RC(5) - RC(10). */if(*ipitch==0||*ipitch==127) { irc[5] = enctab[(irc[1]&30)>>1]; irc[6] = enctab[(irc[2]&30)>>1]; irc[7] = enctab[(irc[3]&30)>>1]; irc[8] = enctab[(*irms&30)>>1]; irc[9] = enctab[(irc[4]&30)>>1]>>1; irc[10]= enctab[(irc[4]&30)>>1]&1;}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -