2013-06-17 3 views
2

그래서이 피아노 녹음은 .wav 형식으로되어 있습니다. 나는 전체 녹음에 FFT을 할 수 있고 주파수를 확인할 수있다.MATLAB에서 wav 파일 분석

그러나 필자가 읽은 몇 가지 기사에 따르면 wav 파일을 각 창에 하나의 특정 메모가 포함 된 창으로 세분화 한 경우 가장 좋습니다.

왜냐하면 처음에는 시간 영역 신호의 "파워 엔벨로프"(음표의 평균 에너지 개념을 고려함)를 그릴 필요가 있기 때문에 각 음표와 음표 온셋에 대해 하나의 감소와 감소가있을 것입니다 지역 최소치.

여기서 'windows'가 도입되는 곳입니다. 각 창은 하나의 시작으로 구성되며 각 창에는 FFT이 수행됩니다.

임 파워 엔벨로프를 플로팅하고 창으로 이동하는 데 어려움이 있습니다. 이 코드를 Matlab 코딩에 도움을 주시면 감사하겠습니다.

I를 사용한 코드는 매우 단순하다

[파도 FS = wavread ('C 스케일 fast.wav'); 파일을 메모리에 읽음 */

소리 (wave, fs); % * 웨이브 = 웨이브. * 해밍 (길이 (파));

t = 0 : 1/fs : (길이 (파) -1)/fs; % 및 샘플링 주파수 */

figure (2);

 subplot(2,1,1); 
     plot(t,wave); 
     title('Wave File'); 
     ylabel('Amplitude'); 
     xlabel('Length (in seconds)'); 

L = 길이 (파);

NFFT = 2^nextpow2 (L); Y의 길이로부터 2의 2의 멱수

Y = fft (파, NFFT)/L;

f = fs/2 * linspace (0,1, NFFT/2 + 1);

% 단면 편 진폭 스펙트럼을 플롯합니다. 내 신호 (내 wav 파일의 복근 값) 후

subplot(2,1,2); 
    plot(f,2*abs(Y(1:NFFT/2+1))) 
    title('Single-Sided Amplitude Spectrum of y(t)') 
    xlabel('Frequency (Hz)') 
    ylabel('|Y(f)|') 

내가 1, 2 차 파생 상품을 복용하려고 가우시안 필터와 컨볼 루션,하지만 난 그것을 플롯 할 때 내가 출력을하지 않습니다.

edges = fconv (abs (노래), detect);

테지 = 에지 (P/2 : N + P/2-1);

tedges = tedges/max (abs (tedges));

W = diff (tedge);

Z = diff (W);

필자는 필요한 출력을 얻지 못하는 W와 Z를 플롯하려고 할 때입니다. 내 그래프는 다른 말로 비어 있습니다. 내가 여기서 뭘 잘못하고 있는지 알 수 없다.

+1

당신이 코드를 게시하시기 바랍니다 수 있습니까? – user1343318

+0

코드에 – user2482542

답변

1

유용한 : http://blogs.mathworks.com/videos/2009/12/31/basics-finding-a-subset-of-a-matrix/

기본 흐름 : 우리는 당신이 이미 시도 알 수 있도록

for v=1:window_length:length(data) 
    data_subsection=data(v:v+window_length); 
    subsection_fft = fft(data_subsection); 
    plot(...); 
end 
+0

안녕하세요, Thanx 코드를 포함 시켰습니다. 이것이 약간 어리석은 소리가 될지 모르겠지만 여기에는 의문의 여지가 있습니다. "window_length"권한을 정의해야합니까? "window_length"가 두 개의 노트 온셋 사이의 거리/시간이라고 말하면, 코드에서 임의의 wav 파일에서 발생하는 정확한 시간 간격을 정확히 모르는 경우 어떻게 정의 할 수 있습니까? – user2482542

+0

글쎄, 당신은 첫 번째 패스에서 작은 창을 사용할 수 있습니다, 당신이 구현하는 알고리즘을 사용하여 시작점을 찾은 다음 사용합니까? 메모를 검색하기 위해 실제로 무엇을 찾고 있는지 알고 있습니까? 단기간 푸리에 변환을 살펴보십시오. http://en.wikipedia.org/wiki/Short-time_Fourier_transform과 'periodogram'의 matlab 구현 - 위에서 설명한 내용의 심층적 인/고급 버전입니다. –

+0

빠른 답장을 보내 주셔서 다시 한번 감사드립니다. 글쎄, 나는 파워 엔벨로프를 그리는 데 어려움을 겪었으므로 가우시안 필터를 사용했고, 빠른 컨볼 루션 기법을 사용하여 시간 영역의 엔벨로프를 얻었다. 이제 차별화 (diff)를 사용하여 양수 및 음수 피크를 식별하고 이들 사이의 시간을 창 길이로 사용한다고 생각했습니다. 이 특정 코드를 작성하는 방법에 대한 도움 ?? – user2482542