如何在 Matlab 中使用 FFT(快速傅里叶变换)

Posted

技术标签:

【中文标题】如何在 Matlab 中使用 FFT(快速傅里叶变换)【英文标题】:How to use the FFT (Fast Fourier Transform) in Matlab 【发布时间】:2016-06-29 19:10:00 【问题描述】:

我只是在学习 Matlab 和快速傅立叶变换算法。

作为第一步,我尝试复制此示例:https://en.wikipedia.org/wiki/Fourier_transform#Example

我使用以下代码:

t = -6:0.01:6;
s = cos(2 * pi * 3 * t) .* exp(-pi * t.^2);
figure(1);
plot(t, s);
xlim([-2 2]);
r = fft(s);
figure(2);
plot(t, abs(r));

我得到了以下图片:

图 2:

图 1 可以,但图 2 不行。我看到一个问题是,在图 2 中,我应该绘制矢量 r 反对 频率,而不是时间。图 2 中的另一个问题是 Y 轴的刻度。

因此,为了复制示例,我有 2 个问题:

    如何获得频域(图 2 中的 X 轴)? 我应该如何缩放矢量 r(图 2 中的 Y 轴)?

【问题讨论】:

【参考方案1】:

您的问题是您实际上并没有创建频率向量来绘制 fft 反对。 fft 针对时间绘制的原因是因为这是您在 plot 命令中指定的内容。

这是一个有效的 fft 大纲:

N=length(t);
index=0:N-1;
FrequencyResolution=SamplingRate/N;
Frequency=index.*FrequencyResolution;
data_fft=fft(detrend(data)); 
%the detrend isn't necessary but it does look nicer because it focuses the plot on changes around the mean of the data
data_FFTmagnitude=abs(data_fft);
plot(Frequency, data_FFTmagnitude)

【讨论】:

【参考方案2】:

我记得有一次我第一次想在我的一个研究项目中使用 DFT 和 FFT,我使用了这个webpage,它通过示例详细解释了如何使用。我建议您仔细阅读并尝试为您的案例进行复制,这样做会让您深入了解并更好地理解您所说的使用 FFt 的方式,因为您是 Matlab 的新手。如果您需要更详细的帮助,请随时再次询问。

另外请记住,对于 FFT,信号长度最好是 2 的幂,这样您将获得最准确的结果,如果您无法控制信号长度,您可以采用 2 的最大幂接近那个长度,就像每个人通常做的那样。

【讨论】:

这与问题并不完全相关,但信号长度或变换大小为 2 次方的原因与结果的准确性无关(无论如何,没有实际的 FFT 是精确的),这是关于速度的。具有较小素因子的变换大小运行得更快,因为可以更轻松地细分问题。 @CKT 我从来没有说过信号长度是问题,这只是对他/她作为初学者的建议。速度是真的,但是频率解析的精度直接受取2次方信号长度的影响,这种情况是FFT而不是DFT,你可以自己试试看。 是的,你可以自己试试:>> DFT = @(N) exp(-1j*2*pi/N*(0:(N-1))'*(0:( N-1))); >> x = randn(100,1); >> max(abs(DFT(100)*x-fft(x))./abs(DFT(100)*x)) ans = 1.3516e-13 >> x = [x;零(28,1)]; >> max(abs(DFT(128)*x-fft(x))./abs(DFT(128)*x)) ans = 1.5653e-13 所以,不,不一定是 2 的幂会给你更差的准确性。人们不会在 FFT 中使用 2 的幂来获得准确性,而是使用它来获得速度。一般来说,对于非 2 的幂大小,您不会获得任何更差的准确性。当 N 是 2 的幂时,exp(__) 项不会为您提供更好的舍入。

以上是关于如何在 Matlab 中使用 FFT(快速傅里叶变换)的主要内容,如果未能解决你的问题,请参考以下文章

matlab中fft()函数是啥意思?

Matlab实现FFT变换

Matlab中的傅里叶级数系数​​使用FFT不是负数

使用 MATLAB 对任意图进行傅里叶变换和 FFT

曲线分类-特征提取

曲线分类-特征提取