复倒谱的计算 和 matlab 实现
一、计算原理
在复倒谱分析中,z 变换后得到的是复数,所以取对数时要进行复对
数运算。这时存在相位的多值性问题,称为“相位卷绕”
设信号为
)(
nx
)(
nx
1
)(
nx
2
则其傅里叶变换为
(
eX
)
j
(
eX
1
)
j
(
eX
2
)
j
对上式取复对数为
ln
(
eX
j
)
ln
(
eX
1
j
)
ln
(
eX
2
j
)
则其幅度和相位分别为
ln
(
eX
j
ln
)
)
(
(
eX
1
)
(
ln
)
j
)
(
1
(
eX
2
j
)
)
(
)
)
(
(
1
2
2
上式中,虽然
的值可能超过
(1
)
(2
)
,
( ,
)
的范围均在
,
之内,但
(
)
范围。计算机处理时总相位值只能用其主
值
)
(
表示,然后把这个相位主值“展开”,得到连续相位。所
以存在情况:
k2)
(
(
)
(k 为整数)
此时即产生了相位卷绕。这会是后面求复倒谱以及由复倒谱恢
复语音带来不确定性产生错误
改进方法
1、最小相位信号法
适用条件:
被处理的信号想 x(n)必须是最小相位信号。实际上许多信号就
是最小相位信号,或可以看作是最小相位信号。语音信号的模型就是
极点都在 z 平面单位圆内的全极点模型,或者极零点都在 z 平面单位
圆内的极零点模型。
设信号 x(n)的 z 变换为 X(z)=N (z)/ D(z) ,则有
根据 z 变换的微分特性有
n
)(ˆ
znxn
n
ln
)(
zN
)(
zD
)(ˆ
zX
)(ˆ
ln
)(
zX
zX
)(
dz
zN
dz
)(
dz
dz
zD
)(
)(
)(
zDzN
zNzDz
)(
)(
zDzN
)(
ln
若 x(n)是最小相位信号,则 必然是稳定的因果序列。
)(ˆ nx
由 Hilbert 变换的性质可知,任一因果复倒谱序列都可分解为偶对称
分量和奇对称分量之和:
其中
)(ˆ
nx
)(ˆ
nxo
)(ˆ
nxe
)(ˆ
nx
o
(ˆ
nx
(ˆ
nx
)(ˆ
nx
e
)(ˆ
nx
)(ˆ
nx
)(ˆ nx
2/)
2/)
这两个分量的傅里叶变换分别为 的傅里叶变换的实部和虚
部。
(ˆ
eX
j
)
n
)(ˆ
enx
jn
(ˆ
eX
R
j
)
(ˆ
eXj
I
j
)
所以:
)(ˆ
nx
0
)(ˆ
nx
e
)(ˆ2
nx
e
n
n
n
0
0
0
此即复倒谱的性质 3,也就是说一个因果序列可由其偶对称分量来恢
)(ˆ
)(
nxng
e
复。如果引入一个辅助因子 g(n),上式可写作
)(ˆ
nx
其中:
( )
g n
0
1
2
n
n
n
0
0
0
原理框图:
)(nx
DFT
( jeX
)
复对数
lg( )
(ˆ
eX
R
)
j
lg
(
eX
)
j
实部
IDFT
)(ˆ nx
)(ˆ nxe
)(ng
2.递归法
同样只能适用于 x(n)是最小相位信号的情况。
dz
dz
对上式求逆 z 变换,根据 z 变换的微分特性,有
根据 z 变换的微分特性得
dz
)(
dz
)(
zX
zX
;
)(
zX
)(ˆ
nxn
)(
nx
)(
nxn
所以:
(
nx
)
k
k
n
(ˆ
(
nxkx
)
k
)
n
0
;
设 x(n)是最小相位序列,而最小相位信号序列一定为因果序列 ,所
以有
)(
nx
n
k
0
(
k
n
()(ˆ)
knxkx
)
n
1
k
0
k
n
()(ˆ
knxkx
)
)0()(ˆ
xnx
由于
)(ˆ
kx
(0
k
)0
及
)(ˆ
nx
(ˆ
knx
)(
nx
)0(
x
)
1
n
k
0
)
n
(0
k
k
knxkx
)(ˆ
)0(
n
,可得递推公式
(
x
)
;
递归运算后由复倒谱定义:
可知:
x
)0(
1
z
ln
xz
)0(
)(ˆ
nx
1
z
ln
)(
nxz
ln
x
)()0(
n
ln
x
z
1
ln[
)0(
n
nznx
)(
;
]
同理 若 x(n)是最大相位序列:
)(
ng
0
0
n
1
0
n
2
0
n
knxkx
)(ˆ)
)0(
(
x
)
n
0
0
1
nk
(
k
n
)(ˆ
nx
)(
nx
)0(
x
其中的
)0(ˆ
x
ln
x
)0(
。
二.Matlab 实现
M程序clear all;
%读入一段语音
%将s转置
%取400点语音
%读入语音的长度
%对x进行傅立叶变换
%log为以e为底的对数
%对Sa进行傅立叶逆变换
%倒谱
[s,fs,nbit]=wavread('yuyin.wav');
b=s';
x=b(5000:5399);
N=length(x);
S=fft(x);
Sa=log(abs(S));
sa=ifft(Sa);
ylen=length(sa);
for i=1:ylen/2
sa1(i)=sa(ylen/2+1-i);
end
for i=(ylen/2+1):ylen
sa1(i)=sa(i+1-ylen/2)
end
%绘图
figure(1);
subplot(2,1,1);
plot(x);
axis([0,400,-0.5,0.5])
title('截取的语音段');
xlabel('样点数');
ylabel('幅度');
subplot(2,1,2);
time2=[-199:1:-1,0:1:200];
plot(time2,sa1);
axis([-200,200,-0.5,0.5])
title('截取语音的倒谱');
xlabel('样点数');
ylabel('幅度');
采集的是普通室内的语音 hello world 采样率8KHZ 单声道
试验结果
0.
5
截取的语音段
幅
度
0
-0.
5
0
0.
5
幅
度
0
-0.
5
-20
0
5
0
10
0
15
0
20
0
样点数
截取语音的倒谱
25
0
-15
0
-10
0
-5
0
0
样点数
5
0
30
0
10
0
35
0
15
0
40
0
20
0
081182039 朱熹
参考书籍
1.《数字语音处理及仿真》 张雪英
2.《语音信号处理》 韩纪庆 张磊 郑铁然