📄 gsmdecoder.java
字号:
{ return (x<MIN_WORD ? MIN_WORD : (x>MAX_WORD?MAX_WORD: x)); } private final static int sub(int a, int b) { int diff = a - b; return saturate(diff); } private final static int add(int a, int b) { int sum = a + b; return saturate(sum); } private final static int asl(int a, int n) { if (n>= 16) return 0; if (n<= -16) return (a<0?-1:0); if (n<0) return asr(a,-n); return (a << n); } private final static int asr(int a, int n) { if (n>=16) return (a<0?-1:0); if (n<=-16) return 0; if (n<0) return (a<<-n);//&0xffff; return (a>>n); } private final static int mult_r(int a, int b) { if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD; else { int prod = a * b + 16384; //prod >>= 15; return saturate(prod>>15);//&0xffff; //return (prod & 0xffff); } } private final void longTermSynthesisFiltering(int Ncr, int bcr, int erp[], int dp0[]) { int ltmp; int k; int brp, drpp, Nr; Nr = Ncr < 40 || Ncr > 120 ? nrp : Ncr; nrp = Nr; brp = QLB[bcr]; for (k=0;k<=39;k++) { drpp = mult_r(brp,dp0[120+(k-Nr)]); dp0[120+k] = add(erp[k],drpp); } for (k=0;k<=119;k++) dp0[k]=dp0[40+k]; } private final int[] shortTermSynthesisFilter(int LARcr[], int wt[]) { //print("wt",wt); int LARpp_j[] = LARpp[j]; int LARpp_j_1[] = LARpp[j^=1]; int LARp[] = new int[8]; int s[] = new int[160]; decodingOfTheCodedLogAreaRatios(LARcr,LARpp_j); //print("LARpp_j",LARpp_j); Coefficients_0_12(LARpp_j_1,LARpp_j,LARp); LARp_to_rp(LARp); shortTermSynthesisFiltering(LARp,13,wt,s,0); Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); LARp_to_rp( LARp ); shortTermSynthesisFiltering( LARp, 14, wt, s, 13); Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); LARp_to_rp( LARp ); shortTermSynthesisFiltering( LARp, 13, wt, s, 27 ); Coefficients_40_159( LARpp_j, LARp ); LARp_to_rp( LARp ); shortTermSynthesisFiltering( LARp, 120, wt, s, 40); return s; } public final static void decodingOfTheCodedLogAreaRatios(int LARc[], int LARpp[]) { int temp1; int ltmp; // STEP( 0, -32, 13107 ); temp1 = (add(LARc[0],-32)<<10); //temp1 = (sub(temp1, 0)); temp1 = (mult_r(13107,temp1)); LARpp[0] = (add(temp1, temp1)); // STEP( 0, -32, 13107 ); temp1 = (add(LARc[1],-32)<<10); //temp1 = (sub(temp1, 0)); temp1 = (mult_r(13107,temp1)); LARpp[1] = (add(temp1, temp1)); // STEP( 2048, -16, 13107 ); temp1 = (add(LARc[2],-16)<<10); temp1 = (sub(temp1, 4096)); temp1 = (mult_r(13107,temp1)); LARpp[2] = (add(temp1, temp1)); // STEP( -2560, -16, 13107 ); temp1 = (add(LARc[3],(-16))<<10); temp1 = (sub(temp1, -5120)); temp1 = (mult_r(13107,temp1)); LARpp[3] = (add(temp1, temp1)); // STEP( 94, -8, 19223 ); temp1 = (add(LARc[4],-8)<<10); temp1 = (sub(temp1, 188)); temp1 = (mult_r(19223,temp1)); LARpp[4] = (add(temp1, temp1)); // STEP( -1792, -8, 17476 ); temp1 = (add(LARc[5],(-8))<<10); temp1 = (sub(temp1, -3584)); temp1 = (mult_r(17476,temp1)); LARpp[5] = (add(temp1, temp1)); // STEP( -341, -4, 31454 ); temp1 = (add(LARc[6],(-4))<<10); temp1 = (sub(temp1, -682)); temp1 = (mult_r(31454,temp1)); LARpp[6] = (add(temp1, temp1)); // STEP( -1144, -4, 29708 ); temp1 = (add(LARc[7],-4)<<10); temp1 = (sub(temp1, -2288)); temp1 = (mult_r(29708,temp1)); LARpp[7] = (add(temp1, temp1)); } private final static void Coefficients_0_12(int LARpp_j_1[], int LARpp_j[], int LARp[]) { int i; int ltmp; for(i=0;i<8;i++) { LARp[i] = add((LARpp_j_1[i]>>2),(LARpp_j[i]>>2)); LARp[i] = add(LARp[i],(LARpp_j_1[i]>>1)); } } private final static void Coefficients_13_26(int LARpp_j_1[], int LARpp_j[], int LARp[]) { int i; int ltmp; for(i=0;i<8;i++) { LARp[i] = add((LARpp_j_1[i]>>1),(LARpp_j[i]>>1)); } } private final static void Coefficients_27_39(int LARpp_j_1[], int LARpp_j[], int LARp[]) { int i; int ltmp; for(i=0;i<8;i++) { LARp[i] = add((LARpp_j_1[i]>>2),(LARpp_j[i]>>2)); LARp[i] = add(LARp[i],(LARpp_j[i]>>1)); } } private final static void Coefficients_40_159(int LARpp_j[], int LARp[]) { int i; int ltmp; for(i=0;i<8;i++) { LARp[i] = LARpp_j[i]; } } private final static void LARp_to_rp(int LARp[]) { int i; int temp; for(i=0;i<8;i++) { if(LARp[i]<0) { temp = ((LARp[i]==MIN_WORD)?MAX_WORD:-LARp[i]); LARp[i] = (- ((temp < 11059) ? temp << 1 : ((temp < 20070) ? temp + 11059 : add((temp>>2),26112)))); } else { temp = LARp[i]; LARp[i] = ((temp<11059)?temp<<1 : ((temp<20070)?temp+11059 :add((temp>>2),26112))); } } } // shortTermSynthesisFiltering(LARp,13,wt,s,0); private final void shortTermSynthesisFiltering(int rrp[], int k, int wt[], int sr[], int off) { int i; int sri, tmp1, tmp2; int woff = off; int soff = off; while (k-->0) { sri = wt[woff++]; for (i=8;i-->0;) { tmp1 = rrp[i]; tmp2 = v[i]; tmp2 = ((tmp1==MIN_WORD && tmp2 == MIN_WORD ? MAX_WORD : saturate((tmp1*tmp2 + 16384)>>15))); sri = sub(sri,tmp2); tmp1 = ((tmp1 == MIN_WORD && sri == MIN_WORD ? MAX_WORD : saturate( (tmp1 *sri+16384) >>15))); v[i+1]=add(v[i],tmp1); } sr[soff++] = v[0] = sri; } } private final void postprocessing(int s[]) { int k,soff=0; int tmp; for(k=160;k-->0;soff++) { tmp = mult_r(msr,(28180)); msr = add(s[soff],tmp); //s[soff]=(add(msr,msr) & 0xfff8); s[soff]=saturate(add(msr,msr) & ~0x7); } } private final static void RPE_grid_positioning(int Mc, int xMp[], int ep[]) { int i = 13; int epo = 0; int po = 0; switch(Mc) { case 3: ep[epo++] = 0; case 2: ep[epo++] = 0; case 1: ep[epo++] = 0; case 0: ep[epo++] = xMp[po++]; i--; }; do { ep[epo++] = 0; ep[epo++] = 0; ep[epo++] = xMp[po++]; } while (--i>0); while (++Mc < 4) { ep[epo++] = 0; } }}/*** GSMDecoder.java ***/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -