离散余弦变换(Discrete Cosine Transform,DCT)具有信号谱分量丰富、能量集中,且不需要对语音相位进行估算等优点,能在较低的运算复杂度下取得较好的语音增强效果。
设x(n)是N个有限值的一维实数信号序列,n=0,1,…,N-1,DCT的完备正交归一函数是:
式中,a(k)的定义为
式中,n=0,1,…,N-1;k=0,1,…,N-1。
将上式略作变形,可得到DCT的另一表示形式
式中,C(k)是正交因子。
则DCT的逆变换为
在MATLAB工具箱中有det和idet函数,其使用方法如下:
1)det 函数——离散余弦变换
调用格式:
X=det(x,N)
说明:x是原始信号;X是离散余弦变换后的序列;N是离散余弦变换的长度。
2)idet函数——离散余弦逆变换
调用格式:
x=idct(X,N)
说明:x是原始信号;X是离散余弦变换后的序列;N是离散余弦变换的长度。
案例、已知一余弦序列为x(n)=cos(2πfn/fs),0≤n≤1000
式中,f=50Hz,fs=1000Hz。计算此序列的DCT并仅用幅度大于5的部分重建信号。
程序如下:
clear all; clc; close all;
f=50; % 信号频率
fs=1000; % 采样频率
N=1000; % 样点总数
n=0:N-1;
xn=cos(2*pi*f*n/fs); % 构成余弦序列
y=dct(xn) ; % 离散余弦变换
num=find(abs(y)<5); % 寻找余弦变换后幅值小于5的区间
y(num)=0; % 对幅值小于5的区间的幅值都置为0
zn=idct(y); % 离散余弦逆变换
subplot 211; plot(n,xn,'k'); % 绘制xn的图
title('x(n)'); xlabel(['样点' 10 '(a)']); ylabel('幅值');
subplot 212; plot(n,zn,'k'); % 绘制zn的图
title('z(n)'); xlabel(['样点' 10 '(b)']); ylabel('幅值');
% 计算重建率
rp=100-norm(xn-zn)/norm(xn)*100
运行结果如下:
分析:计算出的重建率rp=84.3566,说明DCT具有很好的能量集中性。
参考文献:
语音信号处理实验教程;梁瑞宇、赵力、魏昕(编著)
MATLAB语音信号分析与合成(第二版);宋知用(编著)