/
MLSAFilt.cs
125 lines (102 loc) · 2.93 KB
/
MLSAFilt.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TTS
{
class MLSAFilt
{
int M;
int fp;
double a;
int pd;
static double[] ppade = { 1.0, 0.4999273, 0.1067005, 0.01170221, 0.0005656279 };
double[] d;
double[] pt1;
double[] delay1;
double[] pt2;
double[][] delay2;
//MLSAFilt(mfcorder=34, frameperiod=80, warping=0.42, padeorder=4)
public MLSAFilt(int mfcorder, int frameperiod, double warping, int padeorder )
{
M=mfcorder;
fp=frameperiod;
a=warping;
pd=padeorder;
d = new double[M + 2];
pt1 = new double[pd + 1];
delay1 = new double[pd + 1];
pt2 = new double[pd + 1];
delay2 = new double[pd + 1][];
for (int i = 0; i <= pd; i++)
{
delay2[i] = new double[M + 2];
}
}
public double[] mc2b(double[] mc, int M, double a)
{
double[] b = new double[M + 1];
b[M] = mc[M];
for (M--; M >= 0; M--)
b[M] = mc[M] - a * b[M + 1];
return b;
}
public double mlsadf(double x, double[] b)
{
x = mlsadf1(x, b);
x = mlsadf2(x, b);
return (x);
}
double mlsadf1(double x, double[] b)
{
double v, outp = 0.0, aa;
int i;
aa = 1 - a * a;
for (i = pd; i >= 1; i--)
{
delay1[i] = aa * pt1[i - 1] + a * delay1[i];
pt1[i] = delay1[i] * b[1];
v = pt1[i] * ppade[i];
x += (1 & i) == 1 ? v : -v;
outp += v;
}
pt1[0] = x;
outp += x;
return (outp);
}
double mlsadf2(double x, double[] b)
{
double v, outp = 0.0;
int i;
//aa = 1 - a * a;
for (i = pd; i >= 1; i--)
{
pt2[i] = mlsafir(pt2[i - 1], b, M, a, delay2[i]);
v = pt2[i] * ppade[i];
x += (1 & i) == 1 ? v : -v;
outp += v;
}
pt2[0] = x;
outp += x;
return (outp);
}
double mlsafir(double x, double[] b, int m, double a, double[] del)
{
double y = 0.0, aa;
int i;
aa = 1 - a * a;
del[0] = x;
del[1] = aa * del[0] + a * del[1];
//y = d[1] * b[1];
for (i = 2; i <= m; i++)
{
del[i] = del[i] + a * (del[i + 1] - del[i - 1]);
y += del[i] * b[i];
}
for (i = m + 1; i > 1; i--)
del[i] = del[i - 1];
return (y);
}
}
}