fftw3图片傅里叶变换_Matlab基础操作:快速傅里叶变换的理解

本文分享一下有关Matlab中的快速傅里叶变换的使用和理解。

本文所关心的问题

  • Matlab中FFT变换背后的公式是什么?
  • 可以用来帮助解决什么样的数值计算问题?

我希望在使用FFT之前可以先将上述两个问题精确地理解清楚,这样在应用中就不会出现

我觉得是这样,程序却那样的

的问题了。

Matlab中的FFT

通过 help fft 命令,我们调出FFT帮助说明文档,其中就给出了具体计算了怎样的表达式

fftw3图片傅里叶变换_Matlab基础操作:快速傅里叶变换的理解_第1张图片

下面以 fft 为例来解释一下参数

  • 输入:一个长度为
    的向量
  • 输出:一个长度为
    的向量

精确的计算关系已经在上面的图片中给出了。

通过引入

上的等距剖分

我们来重新表达一下这两个式子

对应计算的数值问题

我们考虑计算

周期函数
的Fourier系数的问题。

公式如下,对

我们可以通过数值积分来近似计算这个积分。 例如使用梯形公式。

选取积分区间

的等距剖分

由等距剖分性质,我们知道

使用梯形公式,连续的积分可以在数值上用下面的方式近似计算

fftw3图片傅里叶变换_Matlab基础操作:快速傅里叶变换的理解_第2张图片

红色线条下方面积是函数的精确积分。各浅色的梯形面积之和是梯形方法数值积分的近似解。

因为周期性,实际上,上面的表达也可以改写成左端点的矩形公式

fftw3图片傅里叶变换_Matlab基础操作:快速傅里叶变换的理解_第3张图片

对应关系

这样我们就和Matlab中FFT的公式对应上了。

如果输入的

上等距剖分节点的函数值

那么利用Matlab中的 fft 函数生成的

就满足

当然,FFT的好处就是快速的帮你计算一堆傅里叶系数。

如果向量

的长度为
的话,并且是上面提到的周期函数
在一个周期上的等距采样的话

使用FFT得到的向量分别对应傅里叶系数

上的值的数值近似。

例子

作为例子,我们选取周期函数为

我们知道,它的傅里叶系数当

时,是下面的表达式

因此,我们用下面的程序来计算快速傅里叶变换

N = 1000;
x = linspace(0,2*pi,N+1);
x = x(1:end-1);
y = exp(1i*300*x);
frequency = fft(y);
plot(1/N*real(frequency),'-o','LineWidth',2,'MarkerIndices',[301]);

我们绘制一下FFT变换后的

的图像

我们将

这个因子除去,得到傅里叶系数的近似值。绘制下图

fftw3图片傅里叶变换_Matlab基础操作:快速傅里叶变换的理解_第4张图片

我们看到,向量

的第301个分量上取值为
,其它分量取值为
,符合傅里叶系数的结论。

离散傅里叶变换的周期性

FFT实际上进行的是离散傅里叶变换。因为

的取值关系

所以离散傅里叶变换

满足

因此,如果我们修改刚才的代码

N = 1000;
x = linspace(0,2*pi,N+1);
x = x(1:end-1);
y = exp(-1i*300*x);
frequency = fft(y);
plot(1/N*real(frequency),'-o','LineWidth',2,'MarkerIndices',[701]);

将采样的函数从

修改成
,那么得到的结果就是在第701个分量的位置有一个脉冲。

fftw3图片傅里叶变换_Matlab基础操作:快速傅里叶变换的理解_第5张图片

为什么是701?

因为

因此当

时,上面离散傅里叶变换的频率为

代码中的细节

x = linspace(0,2*pi,N+1);
x = x(1:end-1);

这两行是怎么回事?

首先我们的采样需要保证

  • 采样出来的向量
    长度为
  • 周期函数在
    点值相同,我们取样的时候,需要舍去最右侧端点

fftshift

上面的例子告诉我们,对于离散傅里叶变换来说,下面两个模态计算出来的结果是相同的

因此,在 fft 中,我们计算的是“频率”取值为

的模值,我们可以把利用shift来把(
是偶数情况)

部分转移成

注意这部分对应向量
指标为
部分。因为Matlab计数从
开始

这正是 fftshift 实现的效果

Xeven = [1 2 3 4 5 6];
fftshift(Xeven)

>> ans = 
>>         4     5     6     1     2     3

总结

对一个

周期函数
,先做一个
样本的等距采样
  • 采样需要等距,否则可以使用非一致快速傅里叶变换
  • 采样包含左端点不包含右端点,不然结果差异很大

执行 fft ,得到序列

的DFT在
模态下的模值。

可以通过 fftshift 转换到

,分别逼近于对应模态的傅里叶系数

你可能感兴趣的:(fftw3图片傅里叶变换,matlab,fftshift,matlab,fftshift函数,matlab,fft函数说明,matlab,linspace)