6

MATLAB에서 푸리에 변환을 올바르게 사용하고 있는지 궁금합니다. 나는 노래의 주파수에 대한 모든 평균 진폭을 갖고 싶다. 테스트 목적으로 나는 Audacity을 사용하여 8 kHz 모노 웨이브 파일로 변환 한 a free mp3 download of Beethovens "For Elise"을 사용하고 있습니다.푸리에 변환을 올바르게 사용하고 있습니까?

clear all % be careful 

% load file 
% Für Elise Recording by Valentina Lisitsa 
% from http://www.forelise.com/recordings/valentina_lisitsa 
% Converted to 8 kHz mono using Audacity 
allSamples = wavread('fur_elise_valentina_lisitsa_8khz_mono.wav'); 


% apply windowing function 
w = hanning(length(allSamples)); 
allSamples = allSamples.*w; 


% FFT needs input of length 2^x 
NFFT = 2^nextpow2(length(allSamples)) 


% Apply FFT 
fftBuckets=fft(allSamples, NFFT); 
fftBuckets=fftBuckets(1:(NFFT/2+1)); % because of symetric/mirrored values 


% calculate single side amplitude spectrum, 
% normalize by dividing by NFFT to get the 
% popular way of displaying amplitudes 
% in a range of 0 to 1 
fftBuckets = (2*abs(fftBuckets))/NFFT; 

% plot it: max possible frequency is 4000, because sampling rate of input 
% is 8000 Hz 
x = linspace(1,4000,length(fftBuckets)); 
bar(x,fftBuckets); 

출력은 다음과 같습니다 : 내 코드가 맞다면 enter image description here

  1. 누군가가 말해 주시겠습니까 다음과 같이

    내 MATLAB 코드는? 나는 특히 주위의 봉우리에 대해 궁금합니다.

  2. 정규화를 위해 NFFT 또는 length(allSamples)으로 나눌 필요가 있습니까?
  3. 나를 위해 이것이 막대 차트처럼 보이지는 않지만 이것은 내가 계획하고있는 많은 값들 때문이라고 생각하십니까?

어떤 힌트를 주셔서 감사합니다!

+1

이 페이지를 보았습니까? [FFT를 사용하여 간단한 스펙트럼 분석 플롯 얻기] (http://www.mathworks.com/support/tech-notes/1700/1702.html). 설명이 풍부한 예제가 있습니다. – Amro

답변

6
  1. "올바른"정의에 따라 다릅니다. 이것은 당신이 의도 한대로하고 있다고 생각 합니다만, 아마도 그렇게 유용하지는 않을 것입니다. 주파수 내용에 대한 시간 정보를 얻을 수 있기 때문에 2D spectrogram을 사용하는 것이 좋습니다.

  2. 올바른 방법으로 FFT 출력을 정규화 할 수 없습니다. 여러 가지 다른 규칙이 있습니다 (예 : 토론 here 참조). 코드의 주석은 0에서 1의 범위를 원한다고 말합니다. 입력 값이 -1에서 1 사이의 범위에 있으면 배수 수로 나누면됩니다.

  3. 글쎄, 정확히! 즉 인간의 귀가 소리의 크기를 해석 대략 방법으로

은 또한, (decibels에) 대수 규모에 y 축을 세우고 추천 할 것입니다. 나를 뛰어

2

두 가지 :

  1. 나는 당신이 당신의 음모에서 DC (지수 = 1) 구성 요소를 포함하는 이유를 모르겠어요. 큰 문제는 아니지만 빈에는 빈도 데이터가 포함되어 있지 않습니다.
  2. length(allSamples)으로 나누는 것이 NFFT으로 나누는 것보다 정확하다고 생각합니다. 그 이유는 DC 구성 요소가 입력 데이터의 평균과 같기를 원하면 length(allSamples)으로 나누는 것이 올바른 일이기 때문입니다.

그러나 Oli가 말한 것처럼 정확하게 계산하려고하는 것을 알기 전까지는 "올바른"정규화가 무엇인지 말할 수 없습니다. 나는 파워 스펙트럼을 추정하기 위해 FFT를 사용하는 경향이 있으므로 "DAC/Hz"와 같은 단위를 원한다면 "DAC/rt-Hz"와 같은 단위를 원한다.

궁극적으로 FFT (단위 포함)에서 벗어나고 싶은 것이 무엇인지에 대한 정확한 생각과 정확한 정규화가 무엇인지에 대해 생각해 볼 필요가 없습니다 (필요한 경우 FFT 정의부터 시작).

또한 MATLAB의 fft은 2의 거듭 제곱 인 배열 길이를 사용할 필요가 없다는 것을 알고 있어야합니다 (그렇게하면 FFT가 더 빨리 실행될 수 있음). 제로 패딩 (zero-padding)은 약간의 울림을 유발할 것이기 때문에, 여러분의 애플리케이션을 위해하는 것이 올바른지 생각해 봐야합니다.

마지막으로 마침표/마력 스펙트럼이 원하는 것일 경우 periodogram, pwelch 및 유용한 다른 기능을 MATLAB에서 제공합니다.

관련 문제