语音信号处理(九)——离散余弦变换
文章目录
- 1.定义
- 2.用C语言实现离散余弦变换
1.定义
DCT(Discrete Cosine Transform)离散余弦变换,其常见用途是对音视频进行数据压缩。离散余弦变换具有信号谱分量丰富、能量集中,且不需要对语音相位进行估算等优点,能在较低的运算复杂度下取得较好的语音增强效果。
维基百科上的解释:DCT以不同频率振荡的余弦函数之和来表示数据点的有限序列。
1.信号常将其能量的大部分集中于频率域的一个小范围内,这样一来,描述不重要的分量 只需要很少的比特数;
2.频率域分解映射了人类视觉系统的处理过程,并允许后继的量化过程满足其灵敏度的要求。
余弦函数是傅里叶变换中的实数部分。DCT与DFT(离散傅里叶变换)联系紧密。
设x(n) 是N 个有限值的一维实数信号序列, n = 0,l, …,N - 1, DCT 的完备正交归一
函数是
X ( k ) = a ( k ) ∑ n = 0 N − 1 x ( n ) cos [ π ( 2 n + 1 ) k 2 N ] x ( n ) = ∑ k = 0 N − 1 a ( k ) X ( k ) cos [ π ( 2 n + 1 ) k 2 N ] \begin{aligned} X(k) &=a(k) \sum_{n=0}^{N-1} x(n) \cos \left[\frac{\pi(2 n+1) k}{2 N}\right] \\ x(n) &=\sum_{k=0}^{N-1} a(k) X(k) \cos \left[\frac{\pi(2 n+1) k}{2 N}\right] \end{aligned} X(k)x(n)=a(k)n=0∑N−1x(n)cos[2Nπ(2n+1)k]=k=0∑N−1a(k)X(k)cos[2Nπ(2n+1)k]
式中, a(k) 的定义为
a ( k ) = { 1 / N k = 0 2 / N 1 ⩽ k ⩽ N − 1 a(k)=\left\{\begin{array}{ll}{\sqrt{1 / N}} & {k=0} \\ {\sqrt{2 / N}} & {1 \leqslant k \leqslant N-1}\end{array}\right. a(k)={ 1/N2/Nk=01⩽k⩽N−1
式中, n = 0,1, …,N - l;k = 0,1, …,N - 1。
a(k)用矩阵可表示为
[ X ( 0 ) X ( 1 ) ⋮ X ( N − 1 ) ] = 2 N [ 1 2 1 2 ⋯ 1 2 cos π 2 N cos 3 π 2 N ⋯ cos ( 2 N − 1 ) π 2 N ⋮ ⋮ ⋮ cos ( N − 1 ) π 2 N cos 3 ( N − 1 ) π 2 N ⋯ cos ( 2 N − 1 ) ( N − 1 ) π 2 N ] [ x ( 0 ) x ( 1 ) ⋮ x ( N − 1 ) ] \left[\begin{array}{c}{X(0)} \\ {X(1)} \\ {\vdots} \\ {X(N-1)}\end{array}\right]=\sqrt{\frac{2}{N}}\left[\begin{array}{cccc}{\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}} & {\cdots} & {\frac{1}{\sqrt{2}}} \\ {\cos \frac{\pi}{2 N}} & {\cos \frac{3 \pi}{2 N}} & {\cdots} & {\cos \frac{(2 N-1) \pi}{2 N}} \\ {\vdots} & {\vdots} & {} & {\vdots} \\ {\cos \frac{(N-1) \pi}{2 N}} & {\cos \frac{3(N-1) \pi}{2 N}} & {\cdots} & {\cos \frac{(2 N-1)(N-1) \pi}{2 N}}\end{array}\right]\left[\begin{array}{c}{x(0)} \\ {x(1)} \\ {\vdots} \\ {x(N-1)}\end{array}\right] ⎣⎢⎢⎢⎡X(0)X(1)⋮X(N−1)⎦⎥⎥⎥⎤=N2⎣⎢⎢⎢⎢⎡21cos2Nπ⋮cos2N(N−1)π21cos2N3π⋮cos2N3(N−1)π⋯⋯⋯21cos2N(2N−1)π⋮cos2N(2N−1)(N−1)π⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎡x(0)x(1)⋮x(N−1)⎦⎥⎥⎥⎤
由上式得到DCT 的另一种表示形式:
X ( k ) = 2 N ∑ n = 0 N C ( k ) x ( n ) cos [ π ( 2 π + 1 ) k 2 N ] k = 0 , 1 … , N − 1 X(k)=\sqrt{\frac{2}{N}} \sum_{n=0}^{N} C(k) x(n) \cos \left[\frac{\pi(2 \pi+1) k}{2 N}\right] \quad k=0,1 \ldots, N-1 X(k)=N2n=0∑NC(k)x(n)cos[2Nπ(2π+1)k]k=0,1…,N−1
2.用C语言实现离散余弦变换
例 对数组{1 2 3 4 5 6 7 8 9}进行离散余弦变换
C实现代码
#include <stdio.h>
#include<math.h>
#define PI 3.1415926
#define N 9
int main()
{
int k,n;
int x[]={ 1,2,3,4,5,6,7,8,9};
double C,s,X[9];
for(k=0;k<N;k++)
{
s=0;
if(k==0) //计算k=0时的系数
C=sqrt(1.0/N);
else //计算k!=0时的系数
C=sqrt(2.0/N);
for(n=0;n<N;n++)//离散余弦变换
{
double t = x[n]*cos(((2*n+1)*k*PI)/(2*N));
s=s+t; //累加求和
}
X[k]=C*s;//X[k]等于累和结果s乘以系数C
}
for(k=0;k<N;k++)
printf("%f\n",X[k]);//输出离散余弦变换结果
}
实现结果
MATLAB实现代码
>> x=[1 2 3 4 5 6 7 8 9];
>> y=dct(x)
实现结果
还没有评论,来说两句吧...