在matlab中fft()函数中使用的NFFT是什么?

时间:2015-04-03 21:23:18

标签: matlab signal-processing fft

我有一个10Khz的音频信号样本,我需要找到信号的傅里叶系数。我在mathwork的网站上看到了一个例子,他们使用下面的代码对信号y进行fft分解:

NFFT = 2^nextpow2(L);    
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

其中L是信号的长度,我真的不明白为什么它以上面代码中显示的方式定义变量 NFFT ?我不能为 NFFT 选择任何值吗?另外,为什么我们在上面的代码的第三行中使用Fs / 2?

2 个答案:

答案 0 :(得分:8)

NFFT可以是任何正值,但是当样本数量可以被分解为小素数时,FFT计算通常更有效。引自Matlab documentation

  

fft的执行时间取决于变换的长度。对于两个人来说,这是最快的。对于只有很小的素因子的长度,它几乎一样快。对于素数或具有较大素数因子的长度,它通常要慢几倍。

因此,通常计算2的幂的FFT,其大于或等于信号y的样本数。这就是NFFT = 2^nextpow2(L)所做的事情(在Example from Matlab documentation y中构建的长度为L)。 当NFFT > L信号零填充到NFFT长度时。

fs/2而言,仅仅是因为实值信号的频谱具有厄米对称性(这意味着可以从复共轭中获得fs/2以上的值。值fs/2)之下的值,因此完全从第一个NFFT/2+1值指定(索引NFFT/2+1对应于fs/2)。因此,example选择仅显示fs/2之前的频谱,而不是显示fs/2上方的冗余信息。

答案 1 :(得分:1)

对于实值输入,FFT的输出很复杂。这意味着对于以Fs Hz采样的信号,该信号的傅立叶变换将具有从-Fs / 2到Fs / 2的频率分量并且在零Hz处对称。 (奈奎斯特准则指出,如果您的信号具有最大频率分量为f Hz,则需要以至少2f Hz进行采样。

您可能想知道负频率在这里意味着什么。如果您是数学家,您可能会关心负频率,但如果您是工程师,您可以选择忽略负频率的概念,并仅关注0到Fs / 2的频率。 (以Fs Hz采样的信号的最大频率分量为Fs / 2)

使用FFT来了解有关信号中存在的频率成分的更多信息是非常麻烦的。您可以使用MATLAB中的函数pwelch函数来了解信号中存在的更多频率以及这些信号的功率。 MATLAB将自动计算所需的NFFT,并返回信号中存在的频率以及每个频率的功率。使用以下语法:

[p,f] = pwelch(x,[],[],[],Fs)

查看pwelch的文档以获取更多信息。