使用Cepstrum for PDA

时间:2010-05-07 19:16:58

标签: matlab signal-processing

嘿,我目前正在开发一种算法,以决定框架是否有浊音或清音。我试图使用倒谱来区分这两种情况。我使用MATLAB进行实现。

我遇到了一些问题,一般都是关于框架的说法,但我目前的实现看起来像(我对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);

感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

但是,ifftfft仅因比例因素而异,外部abs不会改变整体形状,所以棒棒糖在​​哪里?请参阅Wikipedia page

正弦时间输入不会在倒谱中给你一个冲动。正弦应该在频谱中产生一个脉冲,这仍然是logmag操作后的一个脉冲,它将转变为倒谱中的电平转换。为了在倒谱中得到一些冲动的东西,你需要在频谱中周期性的东西,这意味着你需要在时域中具有多个谐波频率的东西。例如,考虑方波:

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。所以也许这段代码仍然有问题,或者(更有可能)我的理解。