📄 dyptrk.c
字号:
/************************************************************************ DYPTRK Version 52************************************************************************* Dynamic Pitch Tracker** Inputs:* AMDF - Average Magnitude Difference Function array* LTAU - Number of lags in AMDF* MINPTR - Location of minimum AMDF value* VOICE - Voicing decision* Outputs:* PITCH - Smoothed pitch value, 2 frames delayed* MIDX - Initial estimate of current frame pitch* Compile time constant:* DEPTH - Number of frames to trace back*/#include "lpcdefs.h"extern float s[60];extern int p[60][2];dyptrk( amdf, minptr, voice, pitch, midx )float amdf[];int minptr, voice, *pitch, *midx;{float sbar, minsc, maxsc, alpha;int depth=2;int pbar, i, j, iptr, path[2];static float alphax, ipoint=0.0;/* Calculate the confidence factor ALPHA, used as a threshold slope in* SEESAW. If unvoiced, set high slope so that every point in P array* is marked as a potential pitch frequency. A scaled up version (ALPHAX)* is used to maintain arithmetic precision. */if( voice == 1 ) alphax = .75*alphax + amdf[minptr]*.5;else /*alphax = (63./64.)*alphax;*/ alphax = (0.984375)*alphax;alpha = alphax*0.06250;if( voice == 0 && alphax < 128 ) alpha = 8;/* SEESAW: Construct a pitch pointer array and intermediate winner function* Left to right pass: */iptr = ipoint+1;p[0][iptr-1] = 1;i = 1;pbar = 1;sbar = s[0];for(i=1;i<=LTAU;i++) { sbar += alpha; if (sbar < s[i-1]) { s[i-1] = sbar; p[i-1][iptr-1] = pbar; } else { sbar = s[i-1]; p[i-1][iptr-1] = i; pbar = i; }}/* Right to left pass: */i = pbar-1;sbar = s[i];while (i>=1) { sbar += alpha; if (sbar< s[i-1]) { s[i-1] = sbar; p[i-1][iptr-1] = pbar; } else { pbar = p[i-1][iptr-1]; i = pbar; sbar = s[i-1]; } i--;}/* Update S using AMDF* Find maximum, minimum, and location of minimum */s[0] += amdf[1]*0.5;minsc = s[0];maxsc = minsc;*midx = 1;for(i=2;i<=LTAU;i++) { s[i-1] += amdf[i]*0.5; if(s[i-1] > maxsc) maxsc = s[i-1]; if(s[i-1] < minsc) *midx = i; if(s[i-1] < minsc) minsc = s[i-1];}/* Subtract MINSC from S to prevent overflow */for(i=1;i<=LTAU;i++) s[i-1] -= minsc;maxsc -= minsc;/* Use higher octave pitch if significant null there */j = 0;for(i=20;i<=40;i+=10) if (*midx > i) if (s[*midx-i-1] < maxsc*0.25) j = i;*midx -= j;/* TRACE: look back two frames to find minimum cost pitch estimate */j = ipoint;*pitch = *midx;for(i=1;i<=depth;i++) { j = j%depth+1; *pitch = p[*pitch-1][j-1]; path[i-1] = *pitch;}ipoint = ((int)(ipoint)+depth-1)%depth;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -