离散余弦变换DCT
离散余弦变换DCT具有信号谱分量丰富、能量集中,且不需要对语音相位进行估算等优点,能在较低的运算复杂度下取得较好的语音增强效果。
X
(
k
)
=
α
(
k
)
∑
n
=
0
N
−
1
x
(
n
)
c
o
s
[
π
(
2
n
+
1
)
k
2
N
]
X(k)=\alpha(k)\sum_{n=0}^{N-1}x(n)cos[\frac{\pi(2n+1)k}{2N}]
X(k)=α(k)n=0∑N−1x(n)cos[2Nπ(2n+1)k]
α
(
k
)
=
{
1
/
N
k
=
0
2
/
N
1
≤
k
≤
N
−
1
\alpha(k)=\begin{cases} \sqrt{1/N}\qquad k=0 \\ \sqrt{2/N}\qquad 1\le k \le N-1 \end{cases}
α(k)={1/Nk=02/N1≤k≤N−1
matlab实现DCT运算
x=[2 3 3 2];
y = dct(x)
C语言实现DCT运算
#include<stdio.h>
#include<math.h>
#define PI 3.141593
#define N 4
int main()
{
int k, n;
int x[] = {2,3,3,2};
double A, s, X[4];
for(k = 0; k < N; k++)
{
s = 0;
if(k==0)
A = sqrt(1.0/N); //计算k=0时的系数
else
A = sqrt(2.0/N); //计算k!=0时的系数
for(n = 0; n < N; n++)
{
double tmp = x[n]*cos((PI*(2*n+1)*k)/(2*N));
s = s + tmp; //累加求和
}
X[k] = A * s; //X[k]等于累和结果s乘以系数A
}
for(k = 0; k < N; k++)
printf("%f\n", X[k]);
}