fftw3图片傅里叶变换_傅里叶变换理解上的几个难点

813ce3d73d54fafdb393b5ddde7151af.png

首先从周期函数的傅里叶级数讲起。

任何周期函数

都可以写成三角函数和的形式:

也就是说任何一个周期为

的函数都可以展开成周期为
的三角函数之和。

:利用三角函数和差化积的公式,公式
和下面的公式是等价的:

带相位的公式在直觉上更加直观,特别是配上教科书中矩形波展开成三角函数的图片。但是将相位转换为正弦和余弦函数的系数在计算上却变得简便,因为三角函数系

正交的,利用这个性质,系数就可以通过求 内积的方法得到(函数正交和内积的概念可以将傅里叶级数和矢量的分解联系起来):

数学上还需要一些定理增加严谨性:狄利克雷收敛定理,但是大多数情况下我们只需要愉快的直接使用就可以了。对于有限区间上的函数,可以使用延拓的方法,非常好理解。


:但是如果这个函数在整个数轴上都是非周期的呢?其实这种情况对应频率的连续分布。此时从傅里叶级数表示变成了傅里叶积分表示,也就是说:周期函数和有限区间上的函数是级数表示;无穷区间上的非周期函数是积分表示。

其中系数为:

上面的叫做傅里叶积分,别和傅里叶变换混淆了。(4)式的推导可以查教科书,形式上只需要将(1)式中的求和变为积分即可

同样需要一些数学上严谨性的保证:这边的函数

,要求是绝对可积的。(有时候拿到一个周期函数要求它的傅里叶系数,就想当然的带入上面的公式,这是错误的。首先周期函数一般不是绝对可积的,其次周期函数使用正交的三角函数系展开。)

:为什么傅里叶变换带有虚数,且出现了负频率?

前面都是实数的形式,相对来说在脑海中可以构建出数轴的模型,但是最终傅里叶变换中突然就引入了虚数,这就是难理解的拐点之一,也就是凭什么要多此一举呢?因为我们真实世界中的信号实函数就可以描述了,我们测量的所有物理量也是实数,我们对于实数有着天生的直觉,但是对于复数大多人其实怀有畏惧的心理。

其实虚数在这里出现的原因出奇的简单,可以用下面这个图片说明:

37c46f87ca2a00716c013284b5d4f1f6.png

你可以想象,如果数字用右边的那一列表示,那么进行数字的竖式运算,以及加减乘除会多么的麻烦。强如拉马努金,可能也很难通过右边原始的数学符号,猜出那些神奇的等式吧。

傅里叶变换的复数形式为:

其中:

其实公式(6)(7)和公式(4)(5)之间是通过欧拉公式联系起来的。

欧拉公式:

由欧拉公式可得:

这个叫做傅里叶变换的公式:

,实际上代替了傅里叶积分表示中的
,而
则代替了
。当然这里如果说得明白一点就可以自然理解负频率出现的意义了,因为在傅里叶积分中,我们对频率的积分是从零到无穷大,但是因为我们的正交函数系是三角函数系,频率都是正的,但是这里我们的基函数是
,而由欧拉公式
,
所以对三角函数在正实轴的积分其实就是对
在整个数轴上的积分,仅此而已
。所以说实数函数的能谱一定是正负频率对称的。

所以虚数的引入并没有改变傅里叶积分的意义,这里我觉得:

形式上简化了,处理起来简单了,理解上困难了,这就是复数在这里的作用。我们大多数所说的能谱(功率谱),实际上就是不关心傅里叶变换中的相位部分,只关心某种频率成分的比重,这时候其实对应的就是傅里叶变换F的模。而复数的幅角实际上就是不同频率成分的相位信息。


以上就是从傅里叶级数——傅里叶积分——傅里叶变换,三者之间的联系。但是我们实际测量一个连续的物理信号的时候,得到的其实都是这个实际物理信号在特定时间间隔的采样,其次计算机在进行傅里叶分析的时候,每次积分只能得到某个频率成分的比重,计算的频率点增多,随之的计算量也变得很大。于是就有了快速傅里叶变换FFT,当然离散傅里叶变换DFT和FFT是两个不同的概念,FFT是DFT的快速算法,对采样点有限制。这里我们就讲FFT。

原来FFT的具体实现,目前自己居然从未接触过,只是在计算软件中给出具体的实现函数。FFT的具体推导过程可以在“信号与系统”的参考书中找到。


最后就是广义傅里叶变换了,这在偏微分方程教材中有,但是如何和前面的理解有机的结合在一起,形成一个系统的知识体系,这是一个问题。

难点四:在广义傅里叶变换下,原先的一些周期函数诸如

函数也可以进行广义傅里叶变换,变成
函数

在前面已经指出,对于周期函数没有傅里叶变换,一般可以展开成傅里叶级数,系数可以表示成一个周期内的积分。但是在广义傅里叶变换中,傅里叶变换可以表示成频域中的

函数。

广义函数的定义:函数空间到实数(或复数)空间的映射。

一般可以写成这样的形式:

这样

就是一个广义函数,典型的广义函数就是
函数,将一个函数映射为在原点的取值。一些周期函数在这样的定义下也是广义函数,这要适当选取函数空间
可以保证定义中右边的积分是收敛的。如果函数空间
中的函数都可以进行傅里叶变换,那么变换后仍然可以构成一个函数空间,那么就可以把广义函数的傅里叶变换转移到实验函数的傅里叶变换,也就是说:

可以给出以下关系的不严格的证明:

只需将f(t)换成delta函数,并根据delta函数的性质,就可以得到delta函数的傅里叶变换,当然这里并没有用到广义函数的傅里叶变换的定义,所以这样的证明当然是不严格的。这样一个简单的关系,配合广义傅里叶变换的时移,频移,伸缩,求导等性质,可以得到很多常见函数的广义傅里叶变换

思考:一个函数如果存在傅里叶变换,那么它的广义傅里叶变换和傅里叶变换是否一样?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用FFTW3库进行图片二维傅里叶变换的C代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #include <fftw3.h> #define WIDTH 512 #define HEIGHT 512 int main() { // 读取图片数据 FILE *fp = fopen("lena.raw", "rb"); unsigned char *img = (unsigned char *)malloc(WIDTH * HEIGHT * sizeof(unsigned char)); fread(img, sizeof(unsigned char), WIDTH * HEIGHT, fp); fclose(fp); // 创建输入和输出数组 fftw_complex *in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * WIDTH * HEIGHT); fftw_complex *out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * WIDTH * HEIGHT); // 将图片数据复制到输入数组中 for (int i = 0; i < WIDTH * HEIGHT; i++) { in[i][0] = img[i]; in[i][1] = 0.0; } // 创建傅里叶变换计算计划 fftw_plan plan = fftw_plan_dft_2d(WIDTH, HEIGHT, in, out, FFTW_FORWARD, FFTW_ESTIMATE); // 执行傅里叶变换 fftw_execute(plan); // 将输出数组中的数据转换为幅度谱 double *amp = (double *)malloc(WIDTH * HEIGHT * sizeof(double)); for (int i = 0; i < WIDTH * HEIGHT; i++) { amp[i] = sqrt(out[i][0] * out[i][0] + out[i][1] * out[i][1]); } // 将幅度谱数据写入文件 fp = fopen("lena_amp.raw", "wb"); fwrite(amp, sizeof(double), WIDTH * HEIGHT, fp); fclose(fp); // 释放内存 free(img); fftw_free(in); fftw_free(out); free(amp); fftw_destroy_plan(plan); return 0; } ``` 该代码使用FFTW3库进行二维傅里叶变换,并将变换结果转换为幅度谱,最后将幅度谱数据写入文件。你可以将代码中的lena.raw替换为你自己的图片文件名,并将输出文件名lena_amp.raw替换为你想要的文件名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值