2010-05-07 52 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