求教matlab FFt变换 几个问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教matlab FFt变换 几个问题相关的知识,希望对你有一定的参考价值。

参考技术A 1、NFFT=2^nextpow2(N)*2
这里是否乘以2,应该怎么选择,貌似乘以3结果也一样,
此处只是确定做FFT的点数,由于是单频信号,所以,在最后的结果上面会出现两个对称的尖峰,和你的FFT点数没有关系。
2、y=fft(x,NFFT)/(N/2)
这里最后除以了(N/2),才得到正确的幅值,看不懂
是否需要除以这个数字要根据其物理意义来决定,如果你是用来做频谱分析,这个系数不会影响最终的图像的样子。
3、f=n*fs/NFFT;
频率轴到底怎么写,
n是0:1:N-1还是0:1:N,还是1:1:N
???
上面两种写法在做频谱都不对,FFT之后点数不变,如果按照原始定义Xk=fft(xn),那么应该是0:1:N-1
如果你是做频谱分析,应该是[(0:1:N/2-1)
(
-N/2:1:-1)]
例如,如果是是做8点FFT,前面4点是正品率,后面4点是负频率。

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

【中文标题】如何在 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学习(用matlab进行fft谐波分析)

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

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

Matlab---傅里叶变换---通俗理解

Matlab---傅里叶变换---通俗理解

如何在matlab的powergui里面进行fft分析