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

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

本文所关心的问题

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

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

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

的问题了。

Matlab中的FFT

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

22bfe21ff9a5aa021f8343e1417ac5ab.png

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

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

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

通过引入

上的等距剖分

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

对应计算的数值问题

我们考虑计算

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

公式如下,对

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

选取积分区间

的等距剖分

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

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

fdfe50c341d8f803cab4eacaddf439a5.png

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

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

068e44c67ca1113cc17fd2af295343d2.png

对应关系

这样我们就和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变换后的

的图像

我们将

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

d8faa1907554062cb7122e2d9dd88232.png

我们看到,向量

的第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个分量的位置有一个脉冲。

815c6ee660348a7cfc3bddbcd3ed5143.png

为什么是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 转换到

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值