2014-07-18 10 views
-1

WAV 파일의 SC (spectral centroid)를 검사하고 싶습니다. 내가 그렇게 다음 MATLAB 코드를 사용하고MATLAB의 SC (Spectral Centroid) 계산

:

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는 (366,383은, 1024, 128, 44100)는'MATLAB는 말한다 :

>> SpectralCentroid2(366383, 1024, 128, 44100) 

ans = 

    Empty matrix: 0-by-1 

I 이 문제가 발생한 이유를 모릅니다.

+2

신호는 단지 숫자가 아닌 숫자의 배열이어야합니다. 테스트와 마찬가지로'1 : 366383'을 시도하십시오. –

+0

>> >> SpectralCentroid2 (1 : 366383, 1024, 128, 44100) ** 오류 . * 행렬 치수가 일치해야합니다. SpectralCentroid2 오류 (행 24) 창 = H. * (신호 (curPos : curPos + windowLength-1)); ** Matlab은 위의 오류 메시지를 말했습니다 .. – Westporch

답변

0

hammingH은 열 벡터이며 신호는 (코멘트에 선언 된) 행 벡터입니다. 의 라인에, 예를 들면 : 코드에 라인 23

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

..., 당신은 포인트 별에 치수가 왜 행 벡터에 의해 열 벡터를 곱하려고 호환되지 않는. Ben은 입력 신호로 실제 신호가 필요하다는 것을 처음으로 알아 냈습니다. 그래서 모자 끝은 물론 그에게갑니다!

이와 같이 코드를 실행하기 전에 신호가 열 벡터인지 확인하십시오. 따라서 이것을 함수 선언 다음에 코드의 첫 번째 행으로 추가하십시오.

signal = signal(:); 

이렇게하면 신호가 열 벡터가됩니다. 따라서 행 또는 열 벡터의 1D 신호를 선언 할 수 있으며 코드는 여전히 작동합니다. 이 코드를 코드에 추가하고 작동하도록했습니다.

요약하면, 비어있는 행렬을 얻는 이유는 신호가 한 점으로 만 구성 되었기 때문입니다. 긴 신호가 필요합니다 ... 최소한 윈도우 크기만큼 작동해야합니다.