2010-08-05 5 views
1

어제 나는 시간이 지남에 따라 표시되는 트랙의 오디오 에너지를 탐지하는 코드를 완성했는데, 결국 오디오 미리보기 프로젝트의 일부로 사용하게 될 것입니다.MATLAB에서 오디오 피치 계산 중입니까?

그러나 시간이 지남에 따라 표시되는 트랙의 피치를 감지 할 수있는 방법을 원합니다. 따라서 내 연구를 기반으로하는 2 가지 옵션이 있습니다. 에너지 방법에 대한 올바른 코드

[y, fs, nb] = wavread('Three.wav');     %# Load the signal into variable y 

frameWidth = 441;         %# 10 msec 
numSamples = length(y);        %# Number of samples in y 
numFrames = floor(numSamples/frameWidth);   %# Number of full frames in y 
energy = zeros(1,numFrames);       %# Initialize energy 

for frame = 1:numFrames        %# Loop over frames 
    startSample = (frame-1)*frameWidth+1;    %# Starting index of frame 
    endSample = startSample+frameWidth-1;    %# Ending index of frame 
    energy(frame) = sum(y(startSample:endSample).^2); %# Calculate frame energy 
end 

, 그리고 연구 후에, 나는 이산 시간 푸리에 루프의 각 프레임의 현재 피치를 찾기 위해 변환 사용해야합니다 것을 발견했다.

필자는 이산 푸리에 변환을 계산하기위한 "fft"MATLAB 명령을 포함하도록 코드의 마지막 줄을 수정하는 것만 큼 쉽지만 불균형 식에 대한 오류가 다시 발생한다고 생각했습니다.

도움말은 올바른 방향의 일반 포인터 일지라도 크게 감사하겠습니다. 고맙습니다.

+0

정확한 오류 메시지를 첨부하여 문제를 해결하는 방법을 알 수 있습니다. abs (fft (y (startSample : endSample)))) 유효한 접근 방식을보고 "불균형 방정식"이되어서는 안됩니다. – YYC

답변

1

피치를 결정하는 것은 DFT를 적용하는 것보다 더 복잡한로트입니다. 또한 소스의 특성에 달려 있습니다. 예를 들어, 다른 알고리즘은 음성과 악기에 적합합니다. 음악 트랙이라면 질문이 암시하는 것처럼 보입니다. 함께 연주되는 여러 악기의 단일 피치 값을 결정하는 확실한 방법이 없기 때문에 운이 좋지 않을 것입니다 (피치을 어떻게 정의할까요? 이 문맥?). 어쩌면 당신은 당신이하려고하는 것에 대해 더 구체적 일 수 있습니다 - 아마도 파워 스펙트럼은 임의의 피치를 결정하는 것보다 더 유용 할 것입니다.

+0

팝 음악에서 오디오 기능을 추출하는 데 사용할 수있는 방법을 찾고 있습니다. 이상적으로 나는 합창 탐지 알고리즘을 개발하는 데 사용할 수있는 확실한 데이터를 원합니다. – Velocity

+0

OK - 앞으로는 꽤 큰 R & D 작업이 필요합니다. 아마도 시간 도메인 데이터를 주파수 도메인으로 변환 한 다음 일종의 기능 공간으로 노래의 중요한 특성을 얻으려면 특정 종류의 추출을해야 할 것입니다 . 이 점에 대해서는 독점적 인 알고리즘이 있지만, 알고있는 한 공개 된 것은 없습니다. –

+0

이 컨텍스트에서 "피치"를 정의하는 한 가지 방법은 스펙트럼 중심을 계산하는 것입니다. – FakeDIY