语音信号处理(九)——离散余弦变换

阳光穿透心脏的1/2处 2023-06-18 15:55 123阅读 0赞

文章目录

    • 1.定义
    • 2.用C语言实现离散余弦变换

1.定义

DCT(Discrete Cosine Transform)离散余弦变换,其常见用途是对音视频进行数据压缩。离散余弦变换具有信号谱分量丰富、能量集中,且不需要对语音相位进行估算等优点,能在较低的运算复杂度下取得较好的语音增强效果。

维基百科上的解释:DCT以不同频率振荡的余弦函数之和来表示数据点的有限序列。

  1. 1.信号常将其能量的大部分集中于频率域的一个小范围内,这样一来,描述不重要的分量 只需要很少的比特数;
  2. 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−1​x(n)cos[2Nπ(2n+1)k​]=k=0∑N−1​a(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/N​2/N​​k=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​​⎣⎢⎢⎢⎢⎡​2​1​cos2Nπ​⋮cos2N(N−1)π​​2​1​cos2N3π​⋮cos2N3(N−1)π​​⋯⋯⋯​2​1​cos2N(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)=N2​​n=0∑N​C(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实现代码

  1. #include <stdio.h>
  2. #include<math.h>
  3. #define PI 3.1415926
  4. #define N 9
  5. int main()
  6. {
  7. int k,n;
  8. int x[]={ 1,2,3,4,5,6,7,8,9};
  9. double C,s,X[9];
  10. for(k=0;k<N;k++)
  11. {
  12. s=0;
  13. if(k==0) //计算k=0时的系数
  14. C=sqrt(1.0/N);
  15. else //计算k!=0时的系数
  16. C=sqrt(2.0/N);
  17. for(n=0;n<N;n++)//离散余弦变换
  18. {
  19. double t = x[n]*cos(((2*n+1)*k*PI)/(2*N));
  20. s=s+t; //累加求和
  21. }
  22. X[k]=C*s;//X[k]等于累和结果s乘以系数C
  23. }
  24. for(k=0;k<N;k++)
  25. printf("%f\n",X[k]);//输出离散余弦变换结果
  26. }

实现结果
在这里插入图片描述
MATLAB实现代码

  1. >> x=[1 2 3 4 5 6 7 8 9];
  2. >> y=dct(x)

实现结果
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,123人围观)

还没有评论,来说两句吧...

相关阅读