Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
嘿,我目前正在取消算法来决定是否发声或不发声。我正在尝试使用倒谱来区分这两种情况。我将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); 谢谢。 回答: 根据维基百科 ,功率倒谱是(深呼吸)信号的傅立叶变换的平方的对数的傅里叶变换的平方。所以我认为您正在寻找 function c = ceps(frame, win) c = abs(fft(log10(abs(fft(frame.*win)).^2+eps))).^2; 请注意,我更改了您的变量名之一,因为WINDOW是Signal Processing Toolbox中的预定义函数。 但是, ifft和fft只是比例因子不同,并且外部abs不会改变整体形状,所以棒棒糖在哪里呢?在Wikipedia页面上进一步查看。 正弦时间输入不会给您倒频谱的冲动。正弦波应产生频谱上的脉冲,对数磁操作后仍将是脉冲,它将转换为倒谱中的电平偏移。为了在倒频谱中获得冲动,您需要频谱中的周期性信号,这意味着您需要在时域中具有多个谐波频率的信号。考虑一个方波: 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的输入发生较大的电平偏移?另外,我不了解质素,我希望棒棒糖会在N/f 。因此,也许这段代码还是有问题,或者(更可能是)我的理解。 更多&回答... |
![]() |
![]() |