00001 #include "c_lpc10.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 VOID dyptrk( FLOAT amdf[LTAU], INDEX minptr, BOOL voice,
00022 INDEX* pitch, INDEX* midx )
00023 {
00024 FLOAT sbar, minsc, maxsc, alpha;
00025 INDEX pbar, i, j;
00026
00027
00028
00029
00030
00031 if (voice) {
00032 g_alphax = (FLOAT)0.75 * g_alphax + amdf[minptr] * (FLOAT)0.5;
00033 alpha = g_alphax * (FLOAT)0.06250;
00034 }
00035 else {
00036 g_alphax = (FLOAT)0.984375 * g_alphax;
00037 if (g_alphax < (FLOAT)128.0)
00038 alpha = (FLOAT)8.0;
00039 else
00040 alpha = g_alphax * (FLOAT)0.06250;
00041 }
00042
00043
00044
00045
00046 g_p[0][g_ipoint] = 0;
00047 pbar = 0;
00048 sbar = g_s[0];
00049 for (i = 0; i < LTAU; i++) {
00050 sbar += alpha;
00051 if (sbar < g_s[i]) {
00052 g_s[i] = sbar;
00053 g_p[i][g_ipoint] = pbar;
00054 }
00055 else {
00056 sbar = g_s[i];
00057 g_p[i][g_ipoint] = i;
00058 pbar = i;
00059 }
00060 }
00061
00062
00063 i = pbar;
00064 sbar = g_s[i];
00065 while (i) {
00066 i--;
00067 sbar += alpha;
00068 if (sbar < g_s[i]) {
00069 g_s[i] = sbar;
00070 g_p[i][g_ipoint] = pbar;
00071 }
00072 else {
00073 i = pbar = g_p[i][g_ipoint];
00074 sbar = g_s[i];
00075 }
00076 }
00077
00078
00079 g_s[0] += amdf[0] * (FLOAT)0.5;
00080 maxsc = minsc = g_s[0];
00081 *midx = 0;
00082
00083 for (i = 1; i < LTAU; i++) {
00084 g_s[i] += amdf[i] * (FLOAT)0.5;
00085 if (g_s[i] > maxsc)
00086 maxsc = g_s[i];
00087 if (g_s[i] < minsc) {
00088 minsc = g_s[i];
00089 *midx = i;
00090 }
00091 }
00092
00093
00094 for (i = 0; i < LTAU; i++)
00095 g_s[i] -= minsc;
00096 maxsc -= minsc;
00097
00098
00099 j = 0;
00100 maxsc *= (FLOAT)0.25;
00101 for (i = 20; i <= 40; i += 10)
00102 if ((*midx >= i) && (g_s[*midx - i] < maxsc))
00103 j = i;
00104 *midx -= j;
00105
00106
00107 *pitch = g_p[*midx][g_ipoint];
00108 g_ipoint = 1-g_ipoint;
00109 *pitch = g_p[*pitch][g_ipoint];
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 }
00123
00124