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