00001 #include "d_lpc10.h"
00002 #include <math.h>
00003
00004 #include <stdio.h>
00005 #include <stdlib.h>
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 static FLOAT rco[ORDER];
00027 static FLOAT yarc[ORDER];
00028 static BOOL ivoico = 0;
00029 static INDEX ipito = 0;
00030 static INDEX jsamp;
00031 static FLOAT rmso = 1;
00032 static BOOL first = 1;
00033
00034 void pitsyn(BOOL voice[], INDEX pitch, FLOAT rms, FLOAT rc[], BOOL ivuv[],
00035 INDEX ipiti[], FLOAT rmsi[], FLOAT rci[][ORDER], INDEX * nout,
00036 FLOAT *ratio)
00037 {
00038 INDEX i, j, lsamp, ip, istart;
00039 BOOL ivoice;
00040 INDEX jused, nl;
00041 FLOAT alrn, alro, prop;
00042 FLOAT slope, uvpit, vflag, xxy;
00043
00044 if (rms < 1)
00045 rms = 1;
00046
00047 if (rmso < 1)
00048 rmso = 1;
00049
00050 uvpit = 0.0;
00051 *ratio = (FLOAT)(rms / (rmso + 8.));
00052
00053 if (first) {
00054 lsamp = 0;
00055 ivoice = voice[1];
00056 if (ivoice == 0) {
00057 pitch = LFRAME >> 2;
00058 }
00059 *nout = LFRAME / pitch;
00060 jsamp = LFRAME - *nout * pitch;
00061 for (i = 0; i < *nout; i++) {
00062 for (j = 0; j < ORDER; j++)
00063 rci[i][j] = rc[j];
00064 ivuv[i] = ivoice;
00065 ipiti[i] = pitch;
00066 rmsi[i] = rms;
00067 }
00068 first = 0;
00069 }
00070 else {
00071 vflag = 0;
00072 lsamp = LFRAME + jsamp;
00073
00074 *nout = 0;
00075 jused = 0;
00076 istart = 1;
00077 if ((voice[0] == ivoico) && (voice[1] == voice[0])) {
00078 if (voice[1] == 0) {
00079
00080 pitch = LFRAME >> 2;
00081 ipito = pitch;
00082 if (*ratio > 8)
00083 rmso = rms;
00084 }
00085
00086 slope = (pitch - ipito) / (FLOAT)lsamp;
00087 ivoice = voice[1];
00088 }
00089 else {
00090 if (ivoico != 1) {
00091 if (ivoico == voice[0])
00092
00093 nl = lsamp - (LFRAME >> 2);
00094 else
00095
00096 nl = lsamp - 3 * (LFRAME >> 2);
00097
00098 ipiti[0] = nl >> 1;
00099 ipiti[1] = nl - ipiti[0];
00100 ivuv[0] = 0;
00101 ivuv[1] = 0;
00102 rmsi[0] = rmso;
00103 rmsi[1] = rmso;
00104 for (i = 0; i < ORDER; i++) {
00105 rci[0][i] = rco[i];
00106 rci[1][i] = rco[i];
00107 rco[i] = rc[i];
00108 }
00109 slope = 0;
00110 *nout = 2;
00111 ipito = pitch;
00112 jused = nl;
00113 istart = nl + 1;
00114 ivoice = 1;
00115 }
00116 else {
00117 if (ivoico != voice[0])
00118
00119 lsamp = (LFRAME >> 2) + jsamp;
00120 else
00121
00122 lsamp = 3 * (LFRAME >> 2) + jsamp;
00123
00124 for (i = 0; i < ORDER; i++) {
00125 yarc[i] = rc[i];
00126 rc[i] = rco[i];
00127 }
00128 ivoice = 1;
00129 slope = 0.;
00130 vflag = 1;
00131 }
00132 }
00133
00134 while (1) {
00135 for (i = istart; i <= lsamp; i++) {
00136 ip = (INDEX)(ipito + slope * i + .5);
00137 if (uvpit != 0.0)
00138 ip = (INDEX)uvpit;
00139 if (ip <= i - jused) {
00140 if (*nout >= MAXPEP) {
00141 fprintf(stderr, "PITSYN: too many epochs\n");
00142 exit(1);
00143 }
00144 ipiti[*nout] = ip;
00145 pitch = ip;
00146 ivuv[*nout] = ivoice;
00147 jused += ip;
00148 prop = (FLOAT)(jused - ip * 0.5) / (FLOAT)lsamp;
00149 for (j = 0; j < ORDER; j++) {
00150 alro = (FLOAT)(log((1 + rco[j]) / (1 - rco[j])));
00151 alrn = (FLOAT)(log((1 + rc[j]) / (1 - rc[j])));
00152 xxy = alro + prop * (alrn - alro);
00153 xxy = (FLOAT)(exp(xxy));
00154 rci[*nout][j] = (xxy - 1) / (xxy + 1);
00155 }
00156 rmsi[*nout] = (FLOAT)(log(rmso) + prop * (log(rms) - log(rmso)));
00157 rmsi[*nout] = (FLOAT)(exp(rmsi[*nout]));
00158 (*nout)++;
00159 }
00160 }
00161 if (vflag != 1)
00162 break;
00163 vflag = 0;
00164 istart = jused + 1;
00165 lsamp = LFRAME + jsamp;
00166 slope = 0;
00167 ivoice = 0;
00168 uvpit = (FLOAT)((lsamp - istart) * 0.5);
00169 if (uvpit > 90)
00170 uvpit *= 0.5;
00171 rmso = rms;
00172 for (i = 0; i < ORDER; i++) {
00173 rc[i] = yarc[i];
00174 rco[i] = yarc[i];
00175 }
00176 }
00177 jsamp = lsamp - jused;
00178 }
00179 if (*nout != 0) {
00180 ivoico = voice[1];
00181 ipito = pitch;
00182 rmso = rms;
00183 for (i = 0; i < ORDER; i++)
00184 rco[i] = rc[i];
00185 }
00186
00187 }
00188
00189