復倒谱的计算和matlab实现1
复倒谱的计算 和matlab实现
一、计算原理 在复倒谱分析中,z变换后得到的是复数,所以取对数时要进行复对数运算。这时存在相位的多值性问题,称为“相位卷绕”
设信号为
则其傅里叶变换为
对上式取复对数为
则其幅度和相位分别为
上式中,虽然 , 的范围均在 之内,但 的值可能超过 范围。计算机处理时总相位值只能用其主值 表示,然后把这个相位主值“展开”,得到连续相位。所以存在情况:
(k为整数)
此时即产生了相位卷绕。这会是后面求复倒谱以及由复倒谱恢复语音带来不确定性产生错误
改进方法
最小相位信号法
适用条件:
被处理的信号想x(n)必须是最小相位信号。实际上许多信号就是最小相位信号,或可以看作是最小相位信号。语音信号的模型就是极点都在z平面单位圆内的全极点模型,或者极零点都在z平面单位圆内的极零点模型。
设信号x(n)的z变换为X(z)=N (z)/ D(z) ,则有
根据z变换的微分特性有
若x(n)是最小相位信号,则 必然是稳定的因果序列。
由Hilbert变换的性质可知,任一因果复倒谱序列都可分解为偶对称分量和奇对称分量之和:
其中
这两个分量的傅里叶变换分别为 的傅里叶变换的实部和虚部。
所以:
此即复倒谱的性质3,也就是说一个因果序列可由其偶对称分量来恢复。如果引入一个辅助因子g(n),上式可写作
其中:
原理框图:
2.递归法
同样只能适用于 x(n)是最小相位信号的情况。
根据z变换的微分特性得 ;
对上式求逆z变换,根据z变换的微分特性,有
所以:
;
设x(n)是最小相位序列,而最小相位信号序列一定为因果序列 ,所以有
;
由于 及 ,可得递推公式
;
递归运算后由复倒谱定义:
可知:
同理 若x(n)是最大相位序列:
其中的 。
二.Matlab实现
M程序clear all;
%倒谱
[s,fs,nbit]=wavread('yuyin.wav'); %读入一段语音
b=s'; %将s转置
x=b(5000:5399); %取400点语音
N=length(x); %读入语音的长度
S=fft(x); %对x进行傅立叶变换
Sa=log(abs(S)); %log为以e为底的对数
sa=ifft(Sa); %对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