0

我希望检查我的 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

我不知道为什么会出现这个问题。

4

1 回答 1

1

hamming窗口是列向量,而H信号是行向量(在注释中声明)。特别是在这一行:

window = H.*(signal(curPos:curPos+windowLength-1));    

...这是代码中的第 23 行,您试图将列向量与行向量逐点相乘,这就是维度不兼容的原因。

要解决此问题,请确保您的信号是列向量,然后再运行代码。因此,将其添加为函数声明后代码的第一行。

signal = signal(:);  

这可确保您的信号是列向量,因此您可以声明行向量或列向量的一维信号,并且您的代码仍然可以工作。

总而言之,你得到一个空矩阵的原因是你的信号只包含一个点。你需要一个长信号......至少只要你的窗口大小才能工作。

于 2014-07-18T05:10:31.530 回答