什么是NFFT在matlab的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?

NFFT可以是任何正值,但当样本数量可以分解为小素数时,FFT计算通常会更高效。引用Matlab文档:

fft的执行时间取决于变换的长度。它是二次方中速度最快的。对于只有小素数因子的长度,它几乎同样快。对于素数或具有大素数因子的长度,它通常慢几倍。

因此,对于大于或等于信号y的样本数量的2的幂来计算FFT是常见的。这就是NFFT = 2^nextpow2(L)所做的(在Matlab文档的示例中,y被构造为具有长度L)。当NFFT > L时,信号被零填充到NFFT长度。

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

FFT的输出对于实值输入来说是复杂的。这意味着对于以Fs Hz采样的信号,该信号的傅立叶变换将具有从-Fs/2到Fs/2的频率分量,并且在零Hz是对称的。(奈奎斯特标准规定,如果你有一个最大频率分量为fHz的信号,你需要用至少2fHz对其进行采样。

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

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

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

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

最新更新