2010-05-07 31 views
1

嘿,我目前正在开发一个算法来决定是否有帧或浊音。我正在尝试使用倒谱法来区分这两种情况。我使用MATLAB来实现。使用Cepstrum for PDA

我有一些问题,一般说一些有关的框架,但我目前正在实施的样子(我是MATLAB的奖项所具有的功能rceps,但是这并没有工作了其一):

ceps = abs(ifft(log10(abs(fft(frame.*window')).^2+eps))); 

有人可以给我一个小演示,将帧转换为电源倒谱,所以一个单一的棒棒糖在音调频率。例如使用此代码来生成频率。

fs = 8000; 
timelength = 25e-3; 
freq = 500; 
k = 0:1/fs:timelength-(1/fs); 
s = 0.8*sin(2*pi*freq*k); 

谢谢。

+0

你收到了什么错误? – 2010-05-08 02:40:30

+0

好吧,我认为我的情节有某种高峰......就像你在文献中看到的那样。 – aagaard 2010-05-08 07:20:34

回答

0

根据Wikipedia,功率倒谱(深呼吸)是信号的傅立叶变换的幅度平方的对数的对数的傅立叶变换的幅度平方。因此,我认为你正在寻找

function c = ceps(frame, win) 
    c = abs(fft(log10(abs(fft(frame.*win)).^2+eps))).^2; 

请注意,我改变了你的变量名之一,因为WINDOW是在信号处理工具箱预定义的函数。

但是,ifftfft只有一个比例系数不同,外abs不会改变整体造型,所以哪来的棒棒糖吗?进一步查看Wikipedia page

正弦时间输入不会给你一个倒谱冲动。正弦应该在频谱中产生冲动,这将在对数运算之后仍然是冲动,这将在倒谱中变换成电平偏移。为了在倒谱中获得某些脉冲,需要频谱中有周期性的东西,这意味着你需要在时域中有多个谐波频率的东西。考虑个例子,一个方波:

N = 1024; 
h = hann(N, 'periodic'); 
f = 10; 
x = sin(2*pi*f*((1:N)'-1)/N); %#'# to deal with SO formatting 
s = 2*(x > 0) - 1; %# square wave 
cx = ceps(x, h); 
cs = ceps(s, h); 

cs将有你渴望已久的棒棒糖,不cx

在第0倒谱箱中似乎总是有一个大的组件。我想这是因为对数运算总是会使第二个FFT的输入有一个大的转换?此外,我没有得到quefrency的想法,我本来期望棒棒糖在N/f。所以也许这个代码还有问题,或者更可能是我的理解。

+0

是的,我已经看过维基百科,但是我发现的大多数材料都使用了ifft而不是fft。但是,这不是主要观点。 这非常有意义,如果我想要高峰,频谱必须是周期性的,所以感谢解释。但我会尝试用方波来建立我的演示。谢谢! – aagaard 2010-05-08 08:00:03

+0

@CziX - 很高兴帮助!我仍然对x轴的位置感到好奇,如果你发现我的理解存在缺陷,请告诉我。 – mtrw 2010-05-08 08:11:06