Вычисление спектрального центроида (SC) в MATLAB
Я надеюсь проверить спектральный центроид (SC) в моем файле WAV.
Я использую следующий код 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
Я не знаю, почему возникла эта проблема.
1 ответ
hamming
окно H
является вектором столбца, в то время как сигнал является вектором строки (который был объявлен в комментариях). Конкретно в этой строке:
window = H.*(signal(curPos:curPos+windowLength-1));
... которая является строкой 23 в коде, вы пытаетесь поточечно умножить вектор столбца на вектор строки, поэтому размеры несовместимы.
Чтобы решить эту проблему, убедитесь, что ваш сигнал является вектором столбца, прежде чем запускать код. Поэтому добавьте это в качестве первой строки вашего кода после объявления функции.
signal = signal(:);
Это гарантирует, что ваш сигнал является вектором столбца, поэтому вы можете объявить 1D-сигнал либо вектора строки, либо столбца, и ваш код все равно будет работать.
Итак, причина, по которой вы получаете пустую матрицу, заключается в том, что ваш сигнал состоит только из одной точки. Вам нужен длинный сигнал... по крайней мере, до размера окна, чтобы это работало.