理解离散傅立叶变换

http://blog.csdn.net/dznlong/archive/2008/04/09/2269827.aspx

 

之前fft的水的论文看了一些,但是对于傅立叶变换方面的知识不足,导致没法很透彻的理解。

很感谢这哥们写了这么好的文章。

查阅资料的过程也是觉得,真正水平高的是简简单单的把道理描述清楚的,搞了半天越看越痛苦的,不是装B的便是自己还没懂透的。

本身这个文章就是一个笔记,我这里就再记录些自己的理解。

 

 

时域向频域的转换

 

这一点可以和空间转换或者spherical harmonics系数去做类比。这也是我自己当初理解spherical harmonics的关键一步。

表示空间向量的时候我们用vector(3,4,5)这样的方式来表示,这里进一步的含义,是像空间的一组正交向量(x,y,z轴的(1,0,0), (0,1,0), (0,0,1))投射得到的系数。

如果需要的话我们会做空间转换 object space-> world space。。。

这时候做法上是乘以不同的矩阵,这个向量相乘的过程是向不同的正交向量做投射,得出新的坐标系下的坐标。

 

spherical harmonics的系数也是,也是像类似一组正交“向量”做投射,然后记录系数。只是这里就不只是正交向量了,而是正交基函数。

 

那么傅立叶变换是将时域上的函数像一组正交基函数投射,这组基函数是sin/cos函数,也就是一组周期函数,进而得到一个在sin/cos这组基函数上的表达(那组系数),也就是我们所说的向频域转换。

 

一组信号转向频域之后很多计算得到简化,像卷积在时域或者空间域上是n的四次幂的操作,在频域上会降到n的2次幂的操作。

类似的好处是做傅立叶转换的动因。

 

然后做完频域上操作,通过逆傅立叶变换转回去就好。

 

这里所谓的投射就是和这个基函数相乘,最后得出的数值或者函数就是这个基函数上的投射。

 

 

复数表达

 

整个看FFT过程中复数一直很折磨我。

 

原本的实数的东西通过复数表达很像旋转矩阵用quaternion来表达,尽管旋转vector还是要用matrix来做,但是通过用quaternion表达的旋转意义可以做插值等很多快速的操作,而且内存消耗也小,在做完这些操作之后再转成matrix用就好了。

 

复数表达也是类似。

a+bi = M*(cos(theta)+sin(theta)*i)----极坐标

cos(x) + sin(x)*i = exp(x*i)----欧拉公式

这个用欧拉公式转出来的exp(x*i)又可以把很多计算简化,类似原来的乘法在幂计算里面变成加法。

 

使用复数的原因和使用quaternion几乎一样:

  • 更加简洁的表达
  • 更加简单的计算

 

 

离散傅立叶变换

 

现实中的东西总是离散的(即便时间也是有最小单位的)。

1个有n个采样点的信号可以最多有n/2 + 1个频率。

也就是最多向这么多个基函数上做投射。

 

这里仍旧有几个概念很重要,没有理解透彻的话还是没法写程序。

 

对一个信号做N个sample,那么第i个sample的值用ifft来表示是:

sample_i = sigma(k from 0 to N/2) (h(k)*expi(k*i*2Pi/N));

sigma---是指从k==0加到k==N/2的数学符号

h(k)是傅立叶变换的值。

 

如果求好了h(k),写出程序是:

理解离散傅立叶变换


原文链接: http://blog.csdn.net/ccanan/article/details/5696324

你可能感兴趣的:(理解离散傅立叶变换)