Вычисление спектрального центроида (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-сигнал либо вектора строки, либо столбца, и ваш код все равно будет работать.

Итак, причина, по которой вы получаете пустую матрицу, заключается в том, что ваш сигнал состоит только из одной точки. Вам нужен длинный сигнал... по крайней мере, до размера окна, чтобы это работало.

Другие вопросы по тегам