高阶技能学习,傅立叶变换的简易指南
2014年05月04日 09:36 来源:互联网 作者:秩名 我要评论(0)
关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人很难能够从感性上得到理解,对于这个有史以来最重要的发现之一。如何才能更轻易地理解这个公式呢?
那么。抛开枯燥难懂的数学符号,让我们用一种新方法来试着理解。这是一个纯中文的阐述:
傅立叶变换有什么用?拿一杯思暮雪,用它能找出配方。
该怎么做呢?把思暮雪放进过滤器(滤波器),然后萃取每一种成分。
为什么呢?因为配方比思暮雪本身更容易用来分析、比较和定义。
我们怎么能拿回原本的思暮雪呢?混合所有的成分。
然后,类似于“数学-中文”模式:
基于时域的傅立叶变换会检测每一种“周期成分”(周期长度,补偿,和转速),返回完成的“周期配方”(频率图谱)
现在要上公式了?当然不是!让我们自己动手,进行一次生动的模拟。
要是一切顺利的话,你会惊奇的发现,你已经直观的明白了为什么傅立叶变换能够实现。我们用下列步骤替代了所有的数学分析。
这并不是一次紧张的实验,而是一次舒心的体验。让我们开始吧!
由思暮雪得到配方
数学变换的实质是变量关系的改变。根据所算之物,把我们对数量的认知从“单一物体”(沙里的线条,计数系统)变成“许多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”到底等于几呢?为什么不呢?难道这些最简单的运算不该有个直观的展示么?
用户评论
查看全部 条评论
查看全部 条评论>>