我是以正确的方式使用傅里叶变换吗?

ste*_*wpf 6 matlab signal-processing fft frequency frequency-analysis

我想知道我是否正确地在MATLAB中使用傅里叶变换.我希望得到一首歌中频率的所有平均幅度.出于测试目的,我使用Beelovens"For Elise"的免费mp3下载,我使用Audacity将其转换为8 kHz单声道文件.

我的MATLAB代码如下:

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);
Run Code Online (Sandbox Code Playgroud)

然后输出如下所示: 在此输入图像描述

  1. 有人可以告诉我,我的代码是否正确?我特别想知道0附近的高峰.
  2. 为了正常化,我必须除以NFFTlength(allSamples)
  3. 对我而言,这看起来并不像条形图,但我想这是由于我正在绘制的许多价值观?

谢谢你的任何提示!

Oli*_*rth 6

  1. 取决于您对"正确"的定义.我认为这是按照你的意图做的,但它可能不是很有用.我建议使用二维频谱图,因为您将获得有关频率内容的时间本地化信息.

  2. 没有一种正确的FFT输出归一化方法; 有各种不同的约定(参见例如此处的讨论).代码中的注释表示您希望范围为0到1; 如果您的输入值在-1到1的范围内,那么除以二进制数就可以实现.

  3. 好吧,确切地说!

我还建议在对数刻度(以分贝单位)上绘制y轴,因为这大致是人耳如何解释响度.