📄 tbdm.c
字号:
/************************************************************************* TBDM Version 49************************************************************************* TURBO DIFMAG: Compute High Resolution Average Magnitude Difference Function** Inputs:* SPEECH - Low pass filtered speech* LPITA - Length of speech buffer* TAU - Table of lags* LTAU - Number of lag values to compute* Outputs:* AMDF - Average Magnitude Difference for each lag in TAU* MINPTR - Index of minimum AMDF value* MAXPTR - Index of maximum AMDF value within +/- 1/2 octave of min* MINTAU - Lag corresponding to minimum AMDF value*/#include "lpcdefs.h"tbdm( speech, tau, amdf, minptr, maxptr, mintau )float speech[], amdf[];int *minptr, *maxptr, *mintau, tau[];{int minamd;int i, ptr, ltau2, minp2, maxp2;float amdf2[6];static int tau2[6];static int count=0;/* REAL SPEECH(LPITA+TAU(LTAU)), AMDF(LTAU), AMDF2(6)/* Compute full AMDF using log spaced lags, find coarse minimum */difmag(speech, tau, LTAU, tau[LTAU], amdf, minptr, maxptr );*mintau = tau[*minptr];minamd = amdf[*minptr];/* Build table containing all lags within +/- 3 of the AMDF minimum* excluding all that have already been computed */ltau2 = 0;ptr = *minptr - 2;for(i=mmax(*mintau-3,41); i<=mmin(*mintau+3,tau[LTAU]); i++) { while( tau[ptr] < i ) { ptr++; } if( tau[ptr] !=i) { ltau2++; tau2[ltau2-1] = i; }}/* Compute AMDF of the new lags, if there are any, and choose one* if it is better than the coarse minimum */if( ltau2 > 0 ) { difmag(speech, &tau2[0]-1, ltau2, tau[LTAU], &amdf2[0]-1, &minp2, &maxp2); if( amdf2[minp2-1] < minamd ) { *mintau = tau2[minp2-1]; minamd = amdf2[minp2-1]; }}/* Check one octave up, if there are any lags not yet computed */if( *mintau >= 80 ) { i = *mintau*0.5; if( (i & 1) == 0 ) { ltau2 = 2; tau2[0] = i-1; tau2[1] = i+1; } else { ltau2 = 1; tau2[0] = i; } difmag(speech, &tau2[0]-1, ltau2, tau[LTAU], &amdf2[0]-1, &minp2, &maxp2 ); if( amdf2[minp2-1] < minamd ) { *mintau = tau2[minp2-1]; minamd = amdf2[minp2-1]; *(minptr) -= 20; }}/* Force minimum of the AMDF array to the high resolution minimum */ amdf[*minptr] = minamd; /* Find maximum of AMDF within 1/2 octave of minimum */*maxptr = mmax(*minptr-5,1);for(i=*maxptr+1; i<= mmin(*minptr+5,LTAU); i++) { if( amdf[i] > amdf[*maxptr]) *maxptr = i;}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -