www.pudn.com > lpc.zip > 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" #includeint 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--; *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; } }