我有一个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的文档以获取更多信息。