我希望检查我的WAV文件中的光谱质心(SC)。
我使用以下MATLAB代码来执行此操作:
function C = SpectralCentroid2(signal,windowLength, step, fs)
% function C = SpectralCentroid(signal,windowLength, step, fs)
%
% This function computes the spectral centroid feature of an audio signal
% ARGUMENTS:
% - signal: the audio samples
% - windowLength: the length of the window analysis (in number of samples)
% - step: the step of the window analysis (in number of samples)
% - fs: the sampling frequency
%
% RETURNS:
% - C: the sequence of the spectral centroid feature
%
signal = signal / max(abs(signal));
curPos = 1;
L = length(signal);
numOfFrames = floor((L-windowLength)/step) + 1;
H = hamming(windowLength);
m = ((fs/(2*windowLength))*[1:windowLength])';
C = zeros(numOfFrames,1);
for (i=1:numOfFrames)
window = H.*(signal(curPos:curPos+windowLength-1));
FFT = (abs(fft(window,2*windowLength)));
FFT = FFT(1:windowLength);
FFT = FFT / max(FFT);
C(i) = sum(m.*FFT)/sum(FFT);
if (sum(window.^2)<0.010)
C(i) = 0.0;
end
curPos = curPos + step;
end
C = C / (fs/2);
当我输入'SpectralCentroid2(366383,1024,128,44100)'时,MATLAB说:
>> SpectralCentroid2(366383, 1024, 128, 44100)
ans =
Empty matrix: 0-by-1
我不知道为什么会出现这个问题。
答案 0 :(得分:1)
hamming
窗口H
是列向量,而信号是行向量(在注释中声明)。特别是在这一行:
window = H.*(signal(curPos:curPos+windowLength-1));
...代码中的第23行,您试图逐点将列向量乘以行向量,这就是维度不兼容的原因。
要解决此问题,请在运行代码之前确保信号是列向量。因此,在函数声明之后将其添加为代码的第一行。
signal = signal(:);
这可确保您的信号是列向量,因此您可以声明行或列向量的1D信号,并且您的代码仍然有效。
总而言之,你得到一个空矩阵的原因是因为你的信号只包含一个点。你需要一个很长的信号...至少只要你的窗口大小可以工作。