高阶技能学习,傅立叶变换的简易指南

2014年05月04日 09:36 来源:互联网 作者:秩名 我要评论(0)

标签:傅立叶变换(31769)傅里叶变换(42010)

  关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人很难能够从感性上得到理解,对于这个有史以来最重要的发现之一。如何才能更轻易地理解这个公式呢?

  

  

  那么。抛开枯燥难懂的数学符号,让我们用一种新方法来试着理解。这是一个纯中文的阐述:

  傅立叶变换有什么用?拿一杯思暮雪,用它能找出配方。

  该怎么做呢?把思暮雪放进过滤器(滤波器),然后萃取每一种成分。

  为什么呢?因为配方比思暮雪本身更容易用来分析、比较和定义。

  我们怎么能拿回原本的思暮雪呢?混合所有的成分。

  然后,类似于“数学-中文”模式:

  基于时域的傅立叶变换会检测每一种“周期成分”(周期长度,补偿,和转速),返回完成的“周期配方”(频率图谱)

  现在要上公式了?当然不是!让我们自己动手,进行一次生动的模拟

  要是一切顺利的话,你会惊奇的发现,你已经直观的明白了为什么傅立叶变换能够实现。我们用下列步骤替代了所有的数学分析。

  这并不是一次紧张的实验,而是一次舒心的体验。让我们开始吧!

  由思暮雪得到配方

  数学变换的实质是变量关系的改变。根据所算之物,把我们对数量的认知从“单一物体”(沙里的线条,计数系统)变成“许多10”(小数)。游戏得分?继续计数。乘法?拜托,是小数。

  傅立叶变换把我们的视角由消费者变成了生产者,从“我看到了什么?”变成“这是怎么发生的?”。

  换句话说:拿一个思暮雪,我们要找出它的配方。

  为什么呢?好吧,配方是饮料的最佳描述。你并不会跟人一滴一滴分析饮料,只会说“我有一杯橘子或是香蕉思暮雪”。配方比事物本身更易于归类、比对和定义。

  那么……拿一杯思暮雪,到底怎么找到配方呢?

  

  嗯,想象一下你周围有很多过滤器(滤波器):

  把思暮雪倒进“香蕉”过滤器(滤波器)里。提取出了1盎司香蕉。

  倒进“橘子”过滤器(滤波器)里。提取出了2盎司橘子。

  倒进“牛奶”过滤器(滤波器)里。提取出了3盎司牛奶。

  倒进“水”过滤器(滤波器)里。提取出了3盎司水。

  我们可以通过混合每种成分得到原先的思暮雪。懂了么?

  过滤器(滤波器)必须是相互独立的。香蕉过滤器(滤波器)只滤出香蕉,没有其它的任何成分。再多的橘子也不能影响香蕉的读数。

  过滤(滤波)必须是彻底的。如果我们遗漏了一个过滤器(滤波器),就永远也得不到真正的配方(天哪!那还有个芒果过滤器(滤波器)!)。我们的过滤器(滤波器)必须能确定每种成分的含量。

  不同成分之间必须是可合成的。思暮雪必须能被分离并重制(饼干?没那么夸张。谁有想要一堆碎屑呢?)。不同成分在分离和结合的时候必须是线性的。

  周期看世界

  傅立叶变换持有一种特别的观点:要是每一种信号都是周期性的呢(周期性重复)?

  哇塞。这个假设太让人着迷了,可怜的约瑟夫·傅立叶首先提出了这个假设。(现实里约瑟夫,楼梯能做成环状的么?)

  忽略数学界持续数十年的争论,我们希望学生们可以直观的理解这个概念。额……让我们略过直观的部分。

  就像我们分析思暮雪成分一样,傅立叶变换可以分析出信号的成分:

  开始时,是一个时域信号

  用滤波器来测定每种可能的“周期信号成分”

  完整的“配方”需要列出所有的“周期信号成分”的数值

  完成。这就是大部分教程要教给你的东西。别被吓到了;想想这个例子“天哪,过五关斩六将,我们终于得到源代码(DNA)了”。

  要是地震波(不同强度和速度的震动)能被分离成几种成分,建筑就能被设计成免于地震威胁的高强度结构。

  要是声波(高低不同的频率)能被分成几种成分,我们就能增强想要的部分,削弱不想要的部分。随机噪声引起的噼啪声可以被滤除。相似的“声谱”可以被比对(音乐识别服务比对的是声谱而不是原始音频)。

  要是电脑数据能被周期性的描述,那些不重要的信息就能被滤除。这种“有损压缩”可以急剧减小文件的大小(这就是为什么JPEG和MP3文件要比原始的.bmp或.wav文件要小得多的原因)。

  要是我们的信号是无线电波,我们可以通过滤波器来听确定的频段。在思暮雪的世界里,想象每个人都注意着不同的成分:亚当在寻找苹果,鲍勃在寻找香蕉,查理想要花椰菜(兄弟,对不住了)。

  傅立叶变换在工程领域运用广泛,但事实上,它是个寻找现象根源的象征。

  多想想周期信号,而不是正弦曲线

  我最大的困惑在于“正弦曲线”和“周期信号”的定义区分。

  “正弦曲线”意味一种往复运动模式(正弦或余弦函数)。在99%的场合里,指的都是发生在象限里的运动

  周期信号是一种环形,包括两个D形图案的模式。要你愿意用10块钱的话来描述10分钱的主意,你可以把一个圆形路径称作一个“完整正弦曲线”。

  把一个周期的路径称作一个“完整正弦曲线”,就像你把一个谚语叫做“汉字的集合”。你选择了错误的细节级别。谚语包含了复杂的含义,而不是可以拆分的汉字!

  傅立叶变换是关于周期(不是含有一个D形的正弦曲线)和欧拉公式的变换:

  

  我们必须用虚数做周期运动么?当然不。即使那么做既方便又简洁。我们把信号分成实数和虚数的部分,但别忘了前提是:我们在做周期运动。

  沿着周期路径

  我们一边用电话聊天,一边在脑海里画圆(你答应了的!)。我该说什么呢?

  这个圈儿该有多大呢?(幅度,半径范围的大小)

  我们要画得多快?(频率。1周期/秒=1赫兹=2π弧度/秒)

  从哪里开始呢?(相位角,0度对应x轴)

  我可以说“2英寸,起始于45度,1圈儿每秒,开始吧!”。半秒之后,我们应该到达了同一点:起始位置+经过角度=45+180=225度(2英寸半径)。

  

  每个圆周路径都需要设定大小、速度和起始角度(幅度/周期/相位)。我们还可以把它们合到一块:想象用不同速度绕圈儿跑的小摩托车。

  所有周期的位置信息加到一起就是原本的信号,一如所有的成分混合就得到了原本的思暮雪一样。

  下面是一个对基本圆周路径的仿真

  (详细、直观的动画。需要浏览器。点击图像暂停/继续。)

  周期的时间顺序显示,开始于0Hz。周期[0 1]的含义是

  0的意思是0Hz周期(0Hz=开始于x轴,0度相位的连续周期)

  1的意思是1Hz周期(每个时间间隔完成一个周期)

  现在是棘手的部分:

  蓝色图像表示周期的实数部分。另一个可爱的数学问题:我们常用水平轴来表示每个周期的实轴,其数值在数值轴上显示。你也可以把坐标轴旋转90度。

  时间点间隔按照最高频率设定。1Hz信号需要两个时间点来表示,分别记录起始和终止时刻(一个信号值是没有频率的。)。时间值[1 -1]对应着这些等间隔点的幅度。

  然后呢?[0 1]是1Hz周期。

  现在加入2Hz周期,并叠加。[0 1 1]意味着“0Hz值为零,1Hz时值为1,2Hz时值为1”:

  哇塞。我们的小摩托车越跑越快了:绿线代表了1Hz和2Hz,蓝线是叠加后结果。点选绿色复选框可以让结果看起来更清晰。混合好的“味道”是一个倾斜的函数,从最大值开始,降到最低值。

  黄点是我们测量信号的时刻。已经确定了3个周期信号(0Hz, 1Hz, 2Hz),每个点为信号值的1/3.在这个例子里,周期[0 1 1]生成了时间量[2 -1 -1],从最大值(2)开始,然后降到最低(-1)。

  哦!刚才忘了考虑相位角了,现在我们要把它加上!加上数值:相位角。[0 1:45]是从45度开始的,1Hz的周期函数:

  它是[0 1]的进阶版本。时域上,我们用[.7 -.7]替换[1 -1]。因为我们的周期函数并不是沿着我们的测量时方向上,它们是还在运动的点(这是可被设置的)。

  通过改变周期信号的频率,强度和相位,傅立叶变换可以匹配任何时域信号。

  信号所谓“时域观测”或是“频域成分”已成为一种抽象的概念。

  说够了,就让我们把它讲明白吧!你可以选择模拟器里任何时间或类型的周期函数。如果它是时间表示的,你看到的许多构成所要周期函数的点(其集合被称为波)。

  

  但是——难道在黄色的时间间隔里不包括任何特殊的点么?当然包括。但是我们怎么知道没有测量的时候,信号是按照直线,曲线还是折线穿入另一象限呢?它在我们所需的等间隔时刻出现在我们希望的位置。

  创造一个脉冲信号

  我们可以用周期函数制造出一个脉冲信号么,像是(4 0 0 0)?(用括号表示时间点)

  尽管脉冲看起来很烦人(难道只是烦人?),还是要考虑周期函数的复杂性。我们的周期成分必须对齐(最大值为4),然后向外传播,每个周期函数都有其它函数可与其抵消。每个显示为0的点,都是因为多个周期函数在此获得平衡(你并不能关掉某个函数)。

  让我们看看每个时间点:

  在0时刻,每个周期函数都处于最大值,(4???)由4个周期函数(0Hz 1Hz 2Hz 3Hz)叠加而成,每个函数的幅值都是1,而相位角都为0(换言之, 1 + 1 + 1 + 1 = 4)。

  在之后的时刻(t = 1, 2, 3),所有周期函数的幅值必须相互抵消。

  下面是数值为0的秘诀:当周期函数的值处于对称轴的两端(南和北,东和西,等等。),它们的和为0(要是3个周期函数均匀的分布在0,120和240度,它们就能相互抵消)。

  想象许多绕圈旋转的点。先面试每个点在每个时刻的位置:

  时刻 0 1 2 3

  ------------

  0Hz:0 0 0 0

  1Hz:0 1 2 3

  2Hz:0 2 0 2

  3Hz:0 3 2 1

  要注意,3Hz的周期信号从0开始,然后到了3,然后到了6(只有4个位置,6Mod,然后是9(9Mod4=1)。

  每个周期长度为4个单位,周期函数在2个单位时的位置既不在一条线上(不同于0, 4, 8…),也不再相反的位置(不同于2, 6, 10…)。

  好了。让我们看看每个时间点的情况:

  时刻 0:所有的周期函数都处于最大值(其和为4)

  时刻 1:1Hz和3Hz函数值相互抵消(位置1和3是相反的值),0Hz和2Hz函数值相互抵消。最后结果为0.

  时刻 2:在0时刻,1Hz和3Hz函数值相等,在2时刻,0Hz和2Hz函数值相等(相反的值)。相加结果还是0.

  时刻 3:0Hz和2Hz函数值相互抵消.1Hz和3Hz函数值相互抵消。

  时刻4(重复时刻0的情况):所有函数值相等。

  秘诀在于让相互独立的函数相互抵消(0Hz 和 2Hz, 1Hz 和 3Hz),或是让同方向上数值和相互抵消(0Hz + 2Hz 和 1Hz + 3Hz)。

  当每个周期属性相等,相位为0时,就可以对齐并消去后面的值。(我并不能很好的证明这一点——有人能吗?——但你可以自己看到其发生。试试[1 1], [1 1 1], [1 1 1 1],你会注意到一个脉冲波峰:(2 0), (3 0 0), (4 0 0 0))。

  这里直观的显示了怎么对齐,接下来是消去相反值:

  

  改变峰值时间

  t=0时,什么都没有发生。接下来换到(0 4 0 0)?

  应该和(4 0 0 0)看起来差不多,但是周期函数必须在t=1时(当前时刻的1s后)对齐。然后要考虑相位。

  想象有4个人参与的赛跑。赛跑开始时,4个人都在起跑线上,(4 0 0 0)。没意思。

  怎么能让每个人都同时到达终点呢?很简单。只要让他们不停的你追我赶就行了。也许奶奶在终点线前两英尺,Usain Bolt离线还有100米,他们可以拉着手一起穿过终点线。

  相位变化,起始角度就是周期信号世界里的延迟。接下来要说怎么调整起始位置,来者每个周期都延迟1秒:

  0Hz周期函数不发生移动,所以它已经对齐了

  1Hz函数在4秒完成一次往复,所有延时一秒意味着1/4轮。相位延迟90度(-90),然后它在t=1时刻到达相位0,其最大值。

  2Hz函数的变化速度是1Hz函数的两倍,所以要两倍的角度来满足要求(-180或180,分别沿着不同的方向)。

  3Hz函数的速度是1Hz函数的3倍,所以要有3倍的移动距离(-270或90度的相位改变)

  如果时间点(4 0 0 0)是由函数[1 1 1 1]产生,那么(0 4 0 0)则是由[1 1:-90 1:180 1:90]产生。( 注意: 此处用1Hz来表示一个周期运动经过的时间)。

  天呐——我们在脑子里算出了周期函数!

  干扰可视化是与之类似的,除了要在t=1时刻进行对齐。

  

  试一下这个:你能想象出(0 0 4 0),即2秒延时时候的情况么?0Hz没有相位。1Hz是180度,2Hz是360度(也就是0度),3Hz是540度(即180度),结果为[1 1:180 1 1:180]。

  完整的傅立叶变换

  事实上:我们的信号只不过是一大堆脉冲信号的叠加!只要得到每个时刻组分,你就能知道整个信号的成分。

  傅立叶变换通过频率得到“配方”:

  把连续的信号(a b c d)分成不同的时刻:(a 0 0 0) (0 b 0 0) (0 0 c 0) (0 0 0 d)

  任意频率(例如2Hz),试验配方是“a/4 + b/4 + c/4 + d/4“(每个尖峰的强度被除以频率数目)

  等等!还要对每个脉冲设置延时(每一秒延时的角度取决于频率)。

  每个频率真正的配方=a/4 (无延时) + b/4 (1秒延时) + c/4 (2秒延时) + d/4 (3秒延时)。

  遍历每个频率就能得到完整的变换结果。

  这就是从“数学文字”到真正数学的过程:

  

  几个要点:

  N=时间样本的数量

  n=当前运算的样本编号(0 。。 N-1)

  xn=n时刻信号值

  k=当前频率(0Hz到N-1Hz)

  Xk=信号中频率k的值(幅度和相位,一个复数)

  1/N被用于反变换(从时域信号转化为频域信号)。这是可以实现的,尽管我更喜欢用1/N进行正变换,它表示了脉冲信号的正真大小。你也在变换过程(正反变换中仍含有1/N)中使用1/sqrt(N)。

  n/N是我们经过的时间比例。2πk是单位为弧度/秒的速度,e^-ix是反向经过的路径。合起来就是以当前时间和速度经过的实际路程。

  傅立叶变换的原始方程只告诉你“加上复数”。很多变成语言并不支持直接使用复数,因此要把它们转化成直角坐标系,然后相加。

  让我们开始吧

  这是我遇到的最有挑战性的课题。傅立叶变换涵盖了几个要点(离散/连续/有限长/无限长)的高深数学(狄拉克δ函数),很容易遗漏掉一些细节。这真的很挑战我的认知。

  但仍有简单的类比来说明这些——我拒绝用别的方式思考。无论是思暮雪还是Usain Bolt & Granny穿过终点线,都能让我们轻易的理解这一点。这个比喻是有缺陷的,但不算坏:它是一个木筏使用,一旦我们过河就把它们留下。

  我意识到我自己的理解是如何薄弱,我没办法在自己的脑海里想出(1 0 0 0 )的变换。对我来说,就像,我懂加法。但是,“1+1+1+1”到底等于几呢?为什么不呢?难道这些最简单的运算不该有个直观的展示么?