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(:);  

これにより、信号が列ベクトルであることが保証されるため、行ベクトルまたは列ベクトルの 1D 信号を宣言でき、コードは引き続き機能します。

要約すると、空の行列が得られる理由は、信号が 1 つのポイントのみで構成されているためです。長い信号が必要です...少なくともこれが機能するには、ウィンドウサイズと同じくらい長くなります。

于 2014-07-18T05:10:31.530 に答える