我有一个问题,如果这样可以。我最近在寻找计算 MFCC 的算法。我找到了一个很好的教程而不是代码,所以我尝试自己编写代码。我仍然觉得我缺少一件事。在下面的代码中,我对信号进行 FFT,计算归一化功率,使用三角形对信号进行滤波,并最终将对应于每个组的能量求和以获得 MFCC。
function output = mfcc(x,M,fbegin,fs)
MF = @(f) 2595.*log10(1 + f./700);
invMF = @(m) 700.*(10.^(m/2595)-1);
M = M+2; % number of triangular filers
mm = linspace(MF(fbegin),MF(fs/2),M); % equal space in mel-frequency
ff = invMF(mm); % convert mel-frequencies into frequency
X = fft(x);
N = length(X); % length of a short time window
N2 = max([floor(N+1)/2 floor(N/2)+1]); %
P = abs(X(1:N2,:)).^2./N; % NoFr no. of periodograms
mfccShapes = triangularFilterShape(ff,N,fs); %
output = log(mfccShapes'*P);
end
function [out,k] = triangularFilterShape(f,N,fs)
N2 = max([floor(N+1)/2 floor(N/2)+1]);
M = length(f);
k = linspace(0,fs/2,N2);
out = zeros(N2,M-2);
for m=2:M-1
I = k >= f(m-1) & k <= f(m);
J = k >= f(m) & k <= f(m+1);
out(I,m-1) = (k(I) - f(m-1))./(f(m) - f(m-1));
out(J,m-1) = (f(m+1) - k(J))./(f(m+1) - f(m));
end
end
如果我犯了错误,有人可以确认这没关系或指导我>我用简单的纯音进行了测试,在我看来,它给了我合理的答案。
非常感谢任何帮助:)
PS。我正在研究如何应用矢量化余弦变换。看起来我需要一个 MxM 变换系数矩阵,但我没有找到任何可以解释如何做到这一点的来源。