如何學會傅里葉變換?
我是計算機專業畢業的,想學習傅里葉變換,想用代碼實現快速傅里葉變換,去實現音頻降噪的功能,請問我該如何做?
———————————2014-0605——————————————————————
不少同學希望談談學習方法,我本身也是學渣(考研數學80/150),沒有資格談啊。不過我最近修了
RICE大學在edx上的相關課程「ELEC301x Discrete Time Signals and Systems」,真的非常不錯。初步總結, 有三大優點:
1.注重實踐,有大量的matlab相關的案例內容;
2.重離散、輕連續,這樣創新的思路拋棄了直接研究連續帶來的大量的理論負擔,同時也非常實用;當然,如果要做研究,後面還是要重新認真學習連續的,這可能需要藉助mit的課程了。
3.作業題有深度、有啟發,是很好的訓練。
推薦下學習教材(鑒於大家批評我說這些書不好買,這裡給出購買鏈接),
1.新手入門:
前驅知識,微積分、線性代數及格
優秀教材:
(1)Understanding Digital Signal Processing (3rd Edition): Richard G. Lyons: 9780137027415: Amazon.com: Books
評價相當之高,注重理解,對數學要求不高
購買鏈接:《國外高校電子信息類優秀教材經:數字信號處理(英文影印版)》([美]萊昂斯)【摘要 書評 試讀】
(2)Digital Signal Processing Using MATLAB: Vinay K. Ingle, John G. Proakis: 9781111427375: Amazon.com: Books
大量引入matlab,注重動手實踐增加認知,好像也是首個創新的直接講解離散的教材。
公開課:
RiceX:ELEC301x Discrete Time Signals and Systems
也是直接進入離散主題、注重理解、注重matlab操作的好課程。
購買鏈接:《數字信號處理:應用MATLAB》 Vinay K.ingle, John G.Proakis【摘要 書評 試讀】圖書
2.進階:
我還在學,學完推薦
談談學習成本:
經濟成本:我推薦的書國內亞馬遜都有正版,加起來二百出頭,公開課需要v~P·N工具,一年二百左右。新東方一個破輔導班3000+,一部紅米手機799.
時間成本:no pain, no gain。
最後恬不知恥的秀秀rice給我的課程成績,大家一定會做的更好。
下載鏈接
Dropbox - ELEC301x Discrete Time Signals and Systems.pdf
————---------————我正在和論文搏鬥 先給個簡單答案吧——————————
對工科生來講,傅里葉變換可以從三個層次來看:
傅里葉變換(Fourier Transform,FT)-&> 離散傅里葉變換(Discrete Fourier Transform, DFT)-&> 快速傅里葉變換(Fast Fourier Transform)
FT是理論基礎,以FT為理論基礎,可以完成從頻率估計到求解微分方程各式各樣的問題;
DFT是指信號被採樣之後你會得到離散(如你需要處理的音頻信號被採樣)而非連續的信號,這個時候就需要DFT來告訴你怎樣處理並告知你一些離散情況下的特殊問題;
FFT是一種計算DFT的演算法,計算複雜度很低也就是執行起來很快的意思。
舉個例子吧:有人通過在小黑屋按鋼琴的一個鍵不松會產生一個單音信號給你傳遞情報,
信號的頻率取決於他所按的鍵。你看不見他,卻希望獲知信號的頻率。怎麼辦?
1.FT的理論就會告訴你可以通過傅里葉變化獲知這個頻率。
但是這個信號飄蕩在空中,你需要先通過採樣得到一個離散信號
(是採樣頻率,香農和奈奎斯特告訴我們,需要)。
2.得到離散信號後如何計算,DFT就會告訴你怎麼辦;
3.你嫌DFT太慢了怎麼辦,FFT就粉墨登場了。
從你計算機的專業背景和希望做音頻降噪的需求來看。你需要掌握的是DFT和FFT我建議
1. 找本高等數學的書,花半個小時看看什麼是FT;
2. 強烈推薦《Understanding Digital Signal Processing》,一本只需高中數學,且英文比中文都易懂的書,在http://amazon.com上有很高的評價(Understanding Digital Signal Processing (3rd Edition): Richard G. Lyons: 9780137027415: Amazon.com: Books),國內有賣,建議認真看第1、2、3章。你會對離散傅里葉變換有很深入的了解;
3. 實踐出真知,看完什麼理論,立馬用matlab試試看,會理解的很透徹;
4. project可以沿著matlab-&>VC-&>DSP-&>FPGA的道路前進。
至於你說的語音降噪問題,需要首先用DFT分析信號與雜訊的頻率特性,降噪需要設計濾波器完成。變化與濾波是信號處理的兩大主題,看看《Understanding Digital Signal Processing》的後面幾章就明白了。
語音降噪問題已經發展成為一個成熟的子學科,要做進一步研究就需要你自己努力了。傅里葉分析和應用
學過《信號與系統》和《複變函數》等課程的人往往會被許多問題所困惑,如:
(1)周期信號傅里葉級數中的傅里葉係數物理意義是什麼?
(2)頻譜表示什麼?
(3)通過頻譜我們能知道什麼?
(4)非周期信號的傅里葉變換到底是什麼意思?傅里葉變換的物理意義?
(5)複數形式的傅里葉變換的物理意義?
(6)對信號用頻域分析有什麼好處?
(7)為什麼周期信號的傅里葉變換在相應頻率處出現衝激函數?
上述問題儘管看上去有些零碎,其實它們是有聯繫的,下面,我從頭到尾把這些問題串起來,內容可能比較多,希望大家耐心閱讀,並希望下面的內容能對大家有所幫助,更詳細的內容和應用還請參見我寫的《信號與系統分析和應用》一書,本書在高等教育出版社出版發行。
一、周期信號的傅里葉級數和信號頻譜
1、周期信號的三角函數形式傅里葉級數和信號頻譜
(1)周期信號三角函數形式的傅里葉級數
三、周期信號的傅里葉變換以及衝激函數的作用
五、其它函數的傅里葉變換及應用
《信號與系統》課程中還涉及到:
(1)
「自相關函數」的傅里葉變換;
(2)系統單位衝激響應的傅里葉變換;
(3)離散時間傅里葉變換DTFT;
(4)離散傅里葉變換DFT;
這些傅里葉變換都有其各自的物理意義和作用。
標準修鍊道路是:高等數學、複變函數、信號與系統的一部分(學會什麼是傅里葉變換,連續形式)、數字信號處理(離散形式,學會怎樣設計濾波器)。
由於題主是CS的,可以直接從後兩步開始,如果有高人指點,20小時就足夠入門到精通了。
而且,實用為主的話,完全不必自己寫FFT的程序。你只需要知道怎麼解釋得到的結果就可以了。
另外,降噪的方式還有許多種,傳統濾波器只是一個基礎,其他的還有許多。這些可以在精通FT後再進行學習。
-
最近真的是學霸氣滿滿,剛好最近也在研究DSP的內容,也開發相關語音識別的項目,所以來和你聊一聊心得體會。
FT在複變函數上就有過介紹,相對也不是很難,你要問的FFT,並不是一種實際意義上的變換方法,而是基於DFT的一種快速計算方法,實現方法包括基2 基4 分裂基 Chirp-z都有很成熟的演算法實現。你要想從頭學,應該沿著如下思路,FS FT DTFT DFS DFT FFT。大概一個星期,就能夠達到理解的水平。
關於FFT的實現,推薦用matlab,下載一個Signal Processing ToolBox 然後一步一步跟著做就行了,都是經驗豐富的代碼工程師編寫,配合相關說明書能達到事半功倍的效果。理解了之後跨平台,VisualStudio上用C寫,cpp上也能實現,c#則需要啟用unsafe coding然後導入cpp寫好的dll
實時處理和延時處理只需要對應不同的IIR FIR濾波器就可以了。
當然,以上都是技術層面上的,隨便問一個信通系二年級以上的都能說出個七七八八,我想跟你分享的是思想。為什麼是傅里葉變換,時域轉換到頻域,反變換,頻域到時域,聲音信號恰恰是在時域上混疊而頻域上分離的,所以我們可以應用到傅里葉變換及其反變換。現在頻域上去噪,工程中稱作加窗,就是做個濾波器嘛,然後再映射回去。這就是傅里葉變換的意義。
才疏學淺,恭迎斧正。以上
-
找一本西安電子科技大學出版社出的《數字信號處理》的書,裡面有介紹怎麼用代碼實現快速傅里葉變化,並且有清晰的流程圖。
正好我也寫了一個,用matlab實現的,可以參照著用其他語言實現。
function f = fft_manual(a)
%時域抽取法基2FFT(DIT-FFT)的函數實現
a = inverse_order(a);
n = length(a);
m = log2(n);
wn = exp(-(pi*2i)/n);
for l = 1:m
b = 2^(l-1);
for j = 0:b-1
p = 2^(m-l)*j;
for k = j+1:2^l:n
t = a(k)+a(k+b)*wn^p;
a(k+b) = a(k)-a(k+b)*wn^p;
a(k) = t;
end
end
end
f = a;
end
function b = inverse_order(a) 不要太糾結於怎麼實現,而是要理解傅里葉變換後得到的數值的意義。 function b = inverse_order(a) 仔細看快速傅里葉變換(FFT)和快速傅里葉逆變換(IFFT)演算法基本相同,就wn不同。 如果看了此文你還不懂傅里葉變換,那就過來掐死我吧【完整版】 我保證這篇文章和你以前看過的所有文章都不同,這是 2012 年還在果殼的時候寫的,但是當時沒有來得及寫完就出國了……於是拖了兩年,嗯,我是拖延症患者…… 這篇文章的核心思想就是: 傅里葉分析不僅僅是一個數學工具,更是一種可以徹底顛覆一個人以前世界觀的思維模式。但不幸的是,傅里葉分析的公式看起來太複雜了,所以很多大一新生上來就懵圈並從此對它深惡痛絕。老實說,這麼有意思的東西居然成了大學裡的殺手課程,不得不歸咎於編教材的人實在是太嚴肅了。(您把教材寫得好玩一點會死嗎?會死嗎?)所以我一直想寫一個有意思的文章來解釋傅里葉分析,有可能的話高中生都能看懂的那種。所以,不管讀到這裡的您從事何種工作,我保證您都能看懂,並且一定將體會到通過傅里葉分析看到世界另一個樣子時的快感。至於對於已經有一定基礎的朋友,也希望不要看到會的地方就急忙往後翻,仔細讀一定會有新的發現。 ————以上是定場詩————
%該函數是用來進行序列的倒序
l = length(a);
m = log2(l);
m1 =ceil(m);
l1 = 2^m1;
%判斷a的長度是否是2的整數次冪
%若不是在後面補零使a的長度為2的整數次冪
%便於進行快速傅里葉變換
if(m ~= m1)
a1 = zeros(l1-l,1);
a = [a;a1];
end
lh = l1/2;
j = lh;
n1 = l1-2;
for i=1:n1
if i&
j = j-k;
k = k/2;
end
j = j+k;
end
b = a;
end
其實降噪就是先將信號進行傅里葉變換,將變換後得到的數值中小於某一閾值的點置零(這些點代表的頻率信號可能就是雜訊),然後在進行傅里葉逆變換,於是就得到了降噪後的信號,這就是降噪的過程。
以下給出快速傅里葉逆變換function f = ifft_manual(a)
%時域抽取法基2IFFT(DIT-FFT)的函數實現
a = inverse_order(a);
n = length(a);
m = log2(n);
wn = exp((pi*2i)/n);
for l = 1:m
b = 2^(l-1);
for j = 0:b-1
p = 2^(m-l)*j;
for k = j+1:2^l:n
t = a(k)+a(k+b)*wn^p;
a(k+b) = a(k)-a(k+b)*wn^p;
a(k) = t;
end
end
end
f = a/n;
end
%該函數是用來進行序列的倒序
l = length(a);
m = log2(l);
m1 =ceil(m);
l1 = 2^m1;
%判斷a的長度是否是2的整數次冪
%若不是在後面補零使a的長度為2的整數次冪
%便於進行快速傅里葉變換
if(m ~= m1)
a1 = zeros(l1-l,1);
a = [a;a1];
end
lh = l1/2;
j = lh;
n1 = l1-2;
for i=1:n1
if i&
j = j-k;
k = k/2;
end
j = j+k;
end
b = a;
end
如果你只是為了實現音頻降噪等實用功能,完全不需要學會傅立葉變換,Matlab里有現成的fft函數,可以直接拿來用,其他編程語言里也有差不多現成的庫函數可以使用。你需要學會的是如何做到音頻降噪。至於傅立葉變換,那是數學家研究的東西。
下面進入正題:
抱歉,還是要啰嗦一句:其實學習本來就不是易事,我寫這篇文章的初衷也是希望大家學習起來更加輕鬆,充滿樂趣。但是千萬!千萬不要把這篇文章收藏起來,或是存下地址,心裡想著:以後有時間再看。這樣的例子太多了,也許幾年後你都沒有再打開這個頁面。無論如何,耐下心,讀下去。這篇文章要比讀課本要輕鬆、開心得多……
一、什麼是頻域從我們出生,我們看到的世界都以時間貫穿,股票的走勢、人的身高、汽車的軌跡都會隨著時間發生改變。這種以時間作為參照來觀察動態世界的方法我們稱其為時域分析。而我們也想當然的認為,世間萬物都在隨著時間不停的改變,並且永遠不會靜止下來。但如果我告訴你,用另一種方法來觀察世界的話,你會發現世界是永恆不變的,你會不會覺得我瘋了?我沒有瘋,這個靜止的世界就叫做頻域。
先舉一個公式上並非很恰當,但意義上再貼切不過的例子:
在你的理解中,一段音樂是什麼呢?
這是我們對音樂最普遍的理解,一個隨著時間變化的震動。但我相信對於樂器小能手們來說,音樂更直觀的理解是這樣的:
好的!下課,同學們再見。
是的,其實這一段寫到這裡已經可以結束了。上圖是音樂在時域的樣子,而下圖則是音樂在頻域的樣子。所以頻域這一概念對大家都從不陌生,只是從來沒意識到而已。
現在我們可以回過頭來重新看看一開始那句痴人說夢般的話:世界是永恆的。
將以上兩圖簡化:
時域:
頻域:
在時域,我們觀察到鋼琴的琴弦一會上一會下的擺動,就如同一支股票的走勢;而在頻域,只有那一個永恆的音符。
所以
你眼中看似落葉紛飛變化無常的世界,實際只是躺在上帝懷中一份早已譜好的樂章。抱歉,這不是一句雞湯文,而是黑板上確鑿的公式:傅里葉同學告訴我們,任何周期函數,都可以看作是不同振幅,不同相位正弦波的疊加。在第一個例子里我們可以理解為,利用對不同琴鍵不同力度,不同時間點的敲擊,可以組合出任何一首樂曲。
而貫穿時域與頻域的方法之一,就是傳中說的傅里葉分析。傅里葉分析可分為傅里葉級數(Fourier Serie)和傅里葉變換(Fourier Transformation),我們從簡單的開始談起。
二、傅里葉級數(Fourier Series)的頻譜還是舉個栗子並且有圖有真相才好理解。
如果我說我能用前面說的正弦曲線波疊加出一個帶 90 度角的矩形波來,你會相信嗎?你不會,就像當年的我一樣。但是看看下圖:
第一幅圖是一個鬱悶的正弦波 cos(x)
第二幅圖是 2 個賣萌的正弦波的疊加 cos (x) +a.cos (3x)
第三幅圖是 4 個發春的正弦波的疊加
第四幅圖是 10 個便秘的正弦波的疊加
隨著正弦波數量逐漸的增長,他們最終會疊加成一個標準的矩形,大家從中體會到了什麼道理?
(只要努力,彎的都能掰直!)
隨著疊加的遞增,所有正弦波中上升的部分逐漸讓原本緩慢增加的曲線不斷變陡,而所有正弦波中下降的部分又抵消了上升到最高處時繼續上升的部分使其變為水平線。一個矩形就這麼疊加而成了。但是要多少個正弦波疊加起來才能形成一個標準 90 度角的矩形波呢?不幸的告訴大家,答案是無窮多個。(上帝:我能讓你們猜著我?)
不僅僅是矩形,你能想到的任何波形都是可以如此方法用正弦波疊加起來的。這是沒有接觸過傅里葉分析的人在直覺上的第一個難點,但是一旦接受了這樣的設定,遊戲就開始有意思起來了。
還是上圖的正弦波累加成矩形波,我們換一個角度來看看:
在這幾幅圖中,最前面黑色的線就是所有正弦波疊加而成的總和,也就是越來越接近矩形波的那個圖形。而後面依不同顏色排列而成的正弦波就是組合為矩形波的各個分量。這些正弦波按照頻率從低到高從前向後排列開來,而每一個波的振幅都是不同的。一定有細心的讀者發現了,每兩個正弦波之間都還有一條直線,那並不是分割線,而是振幅為 0 的正弦波!也就是說,為了組成特殊的曲線,有些正弦波成分是不需要的。
這裡,不同頻率的正弦波我們成為頻率分量。
好了,關鍵的地方來了!!
如果我們把第一個頻率最低的頻率分量看作「1」,我們就有了構建頻域的最基本單元。
對於我們最常見的有理數軸,數字「1」就是有理數軸的基本單元。
(好吧,數學稱法為——基。在那個年代,這個字還沒有其他奇怪的解釋,後面還有正交基這樣的辭彙我會說嗎?)
時域的基本單元就是「1 秒」,如果我們將一個角頻率為的正弦波 cos(t)看作基礎,那麼頻域的基本單元就是。
有了「1」,還要有「0」才能構成世界,那麼頻域的「0」是什麼呢?cos(0t)就是一個周期無限長的正弦波,也就是一條直線!所以在頻域,0 頻率也被稱為直流分量,在傅里葉級數的疊加中,它僅僅影響全部波形相對於數軸整體向上或是向下而不改變波的形狀。
接下來,讓我們回到初中,回憶一下已經死去的八戒,啊不,已經死去的老師是怎麼定義正弦波的吧。
正弦波就是一個圓周運動在一條直線上的投影。所以頻域的基本單元也可以理解為一個始終在旋轉的圓
想看動圖的同學請戳這裡:
File:Fourier series square wave circles animation.gif
以及這裡:
File:Fourier series sawtooth wave circles animation.gif
點出去的朋友不要被 wiki 拐跑了,wiki 寫的哪有這裡的文章這麼沒節操是不是。
介紹完了頻域的基本組成單元,我們就可以看一看一個矩形波,在頻域里的另一個模樣了:
這是什麼奇怪的東西?
這就是矩形波在頻域的樣子,是不是完全認不出來了?教科書一般就給到這裡然後留給了讀者無窮的遐想,以及無窮的吐槽,其實教科書只要補一張圖就足夠了:頻域圖像,也就是俗稱的頻譜,就是——
再清楚一點:
可以發現,在頻譜中,偶數項的振幅都是0,也就對應了圖中的彩色直線。振幅為 0 的正弦波。
動圖請戳:
File:Fourier series and transform.gif
老實說,在我學傅里葉變換時,維基的這個圖還沒有出現,那時我就想到了這種表達方法,而且,後面還會加入維基沒有表示出來的另一個譜——相位譜。
但是在講相位譜之前,我們先回顧一下剛剛的這個例子究竟意味著什麼。記得前面說過的那句「世界是靜止的」嗎?估計好多人對這句話都已經吐槽半天了。想像一下,世界上每一個看似混亂的表象,實際都是一條時間軸上不規則的曲線,但實際這些曲線都是由這些無窮無盡的正弦波組成。我們看似不規律的事情反而是規律的正弦波在時域上的投影,而正弦波又是一個旋轉的圓在直線上的投影。那麼你的腦海中會產生一個什麼畫面呢?
我們眼中的世界就像皮影戲的大幕布,幕布的後面有無數的齒輪,大齒輪帶動小齒輪,小齒輪再帶動更小的。在最外面的小齒輪上有一個小人——那就是我們自己。我們只看到這個小人毫無規律的在幕布前表演,卻無法預測他下一步會去哪。而幕布後面的齒輪卻永遠一直那樣不停的旋轉,永不停歇。這樣說來有些宿命論的感覺。說實話,這種對人生的描繪是我一個朋友在我們都是高中生的時候感嘆的,當時想想似懂非懂,直到有一天我學到了傅里葉級數……
三、傅里葉級數(Fourier Series)的相位譜上一章的關鍵詞是:從側面看。這一章的關鍵詞是:從下面看。
在這一章最開始,我想先回答很多人的一個問題:傅里葉分析究竟是幹什麼用的?這段相對比較枯燥,已經知道了的同學可以直接跳到下一個分割線。
先說一個最直接的用途。無論聽廣播還是看電視,我們一定對一個詞不陌生——頻道。頻道頻道,就是頻率的通道,不同的頻道就是將不同的頻率作為一個通道來進行信息傳輸。下面大家嘗試一件事:
先在紙上畫一個sin(x),不一定標準,意思差不多就行。不是很難吧。
好,接下去畫一個sin(3x)+sin(5x)的圖形。
別說標準不標準了,曲線什麼時候上升什麼時候下降你都不一定畫的對吧?
好,畫不出來不要緊,我把sin(3x)+sin(5x)的曲線給你,但是前提是你不知道這個曲線的方程式,現在需要你把sin(5x)給我從圖裡拿出去,看看剩下的是什麼。這基本是不可能做到的。
但是在頻域呢?則簡單的很,無非就是幾條豎線而已。
所以很多在時域看似不可能做到的數學操作,在頻域相反很容易。這就是需要傅里葉變換的地方。尤其是從某條曲線中去除一些特定的頻率成分,這在工程上稱為濾波,是信號處理最重要的概念之一,只有在頻域才能輕鬆的做到。
再說一個更重要,但是稍微複雜一點的用途——求解微分方程。(這段有點難度,看不懂的可以直接跳過這段)微分方程的重要性不用我過多介紹了。各行各業都用的到。但是求解微分方程卻是一件相當麻煩的事情。因為除了要計算加減乘除,還要計算微分積分。而傅里葉變換則可以讓微分和積分在頻域中變為乘法和除法,大學數學瞬間變小學算術有沒有。
傅里葉分析當然還有其他更重要的用途,我們隨著講隨著提。
————————————————————————————————————
下面我們繼續說相位譜:
通過時域到頻域的變換,我們得到了一個從側面看的頻譜,但是這個頻譜並沒有包含時域中全部的信息。因為頻譜只代表每一個對應的正弦波的振幅是多少,而沒有提到相位。基礎的正弦波A.sin(wt+θ)中,振幅,頻率,相位缺一不可,不同相位決定了波的位置,所以對於頻域分析,僅僅有頻譜(振幅譜)是不夠的,我們還需要一個相位譜。那麼這個相位譜在哪呢?我們看下圖,這次為了避免圖片太混論,我們用7個波疊加的圖。
鑒於正弦波是周期的,我們需要設定一個用來標記正弦波位置的東西。在圖中就是那些小紅點。小紅點是距離頻率軸最近的波峰,而這個波峰所處的位置離頻率軸有多遠呢?為了看的更清楚,我們將紅色的點投影到下平面,投影點我們用粉色點來表示。當然,這些粉色的點只標註了波峰距離頻率軸的距離,並不是相位。
這裡需要糾正一個概念:時間差並不是相位差。如果將全部周期看作2Pi或者360度的話,相位差則是時間差在一個周期中所佔的比例。我們將時間差除周期再乘2Pi,就得到了相位差。
在完整的立體圖中,我們將投影得到的時間差依次除以所在頻率的周期,就得到了最下面的相位譜。所以,頻譜是從側面看,相位譜是從下面看。下次偷看女生裙底被發現的話,可以告訴她:「對不起,我只是想看看你的相位譜。」
注意到,相位譜中的相位除了0,就是Pi。因為cos(t+Pi)=-cos(t),所以實際上相位為Pi的波只是上下翻轉了而已。對於周期方波的傅里葉級數,這樣的相位譜已經是很簡單的了。另外值得注意的是,由於cos(t+2Pi)=cos(t),所以相位差是周期的,pi和3pi,5pi,7pi都是相同的相位。人為定義相位譜的值域為(-pi,pi],所以圖中的相位差均為Pi。
最後來一張大集合:
四、傅里葉變換(Fourier Tranformation)相信通過前面三章,大家對頻域以及傅里葉級數都有了一個全新的認識。但是文章在一開始關於鋼琴琴譜的例子我曾說過,這個栗子是一個公式錯誤,但是概念典型的例子。所謂的公式錯誤在哪裡呢?
傅里葉級數的本質是將一個周期的信號分解成無限多分開的(離散的)正弦波,但是宇宙似乎並不是周期的。曾經在學數字信號處理的時候寫過一首打油詩:
往昔連續非周期,回憶周期不連續,任你ZT、DFT,還原不回去。(請無視我渣一樣的文學水平……)
在這個世界上,有的事情一期一會,永不再來,並且時間始終不曾停息地將那些刻骨銘心的往昔連續的標記在時間點上。但是這些事情往往又成為了我們格外寶貴的回憶,在我們大腦里隔一段時間就會周期性的蹦出來一下,可惜這些回憶都是零散的片段,往往只有最幸福的回憶,而平淡的回憶則逐漸被我們忘卻。因為,往昔是一個連續的非周期信號,而回憶是一個周期離散信號。
是否有一種數學工具將連續非周期信號變換為周期離散信號呢?抱歉,真沒有。
比如傅里葉級數,在時域是一個周期且連續的函數,而在頻域是一個非周期離散的函數。這句話比較繞嘴,實在看著費事可以乾脆回憶第一章的圖片。
而在我們接下去要講的傅里葉變換,則是將一個時域非周期的連續信號,轉換為一個在頻域非周期的連續信號。
算了,還是上一張圖方便大家理解吧:
或者我們也可以換一個角度理解:傅里葉變換實際上是對一個周期無限大的函數進行傅里葉變換。
所以說,鋼琴譜其實並非一個連續的頻譜,而是很多在時間上離散的頻率,但是這樣的一個貼切的比喻真的是很難找出第二個來了。
因此在傅里葉變換在頻域上就從離散譜變成了連續譜。那麼連續譜是什麼樣子呢?
你見過大海么?
為了方便大家對比,我們這次從另一個角度來看頻譜,還是傅里葉級數中用到最多的那幅圖,我們從頻率較高的方向看。
以上是離散譜,那麼連續譜是什麼樣子呢?
盡情的發揮你的想像,想像這些離散的正弦波離得越來越近,逐漸變得連續……
直到變得像波濤起伏的大海:
很抱歉,為了能讓這些波浪更清晰的看到,我沒有選用正確的計算參數,而是選擇了一些讓圖片更美觀的參數,不然這圖看起來就像屎一樣了。
不過通過這樣兩幅圖去比較,大家應該可以理解如何從離散譜變成了連續譜的了吧?原來離散譜的疊加,變成了連續譜的累積。所以在計算上也從求和符號變成了積分符號。
不過,這個故事還沒有講完,接下去,我保證讓你看到一幅比上圖更美麗壯觀的圖片,但是這裡需要介紹到一個數學工具才能然故事繼續,這個工具就是——
五、宇宙耍帥第一公式:歐拉公式虛數i這個概念大家在高中就接觸過,但那時我們只知道它是-1 的平方根,可是它真正的意義是什麼呢?
這裡有一條數軸,在數軸上有一個紅色的線段,它的長度是1。當它乘以 3 的時候,它的長度發生了變化,變成了藍色的線段,而當它乘以-1 的時候,就變成了綠色的線段,或者說線段在數軸上圍繞原點旋轉了 180 度。
我們知道乘-1 其實就是乘了兩次 i 使線段旋轉了 180 度,那麼乘一次 i 呢——答案很簡單——旋轉了 90 度。
同時,我們獲得了一個垂直的虛數軸。實數軸與虛數軸共同構成了一個複數的平面,也稱複平面。這樣我們就了解到,乘虛數i的一個功能——旋轉。
現在,就有請宇宙第一耍帥公式歐拉公式隆重登場——
這個公式在數學領域的意義要遠大於傅里葉分析,但是乘它為宇宙第一耍帥公式是因為它的特殊形式——當x等於 Pi 的時候。
經常有理工科的學生為了跟妹子表現自己的學術功底,用這個公式來給妹子解釋數學之美:」石榴姐你看,這個公式里既有自然底數e,自然數 1 和0,虛數i還有圓周率 pi,它是這麼簡潔,這麼美麗啊!「但是姑娘們心裡往往只有一句話:」臭屌絲……「
這個公式關鍵的作用,是將正弦波統一成了簡單的指數形式。我們來看看圖像上的涵義:
歐拉公式所描繪的,是一個隨著時間變化,在複平面上做圓周運動的點,隨著時間的改變,在時間軸上就成了一條螺旋線。如果只看它的實數部分,也就是螺旋線在左側的投影,就是一個最基礎的餘弦函數。而右側的投影則是一個正弦函數。
關於複數更深的理解,大家可以參考:
複數的物理意義是什麼?
這裡不需要講的太複雜,足夠讓大家理解後面的內容就可以了。
六、指數形式的傅里葉變換有了歐拉公式的幫助,我們便知道:正弦波的疊加,也可以理解為螺旋線的疊加在實數空間的投影。而螺旋線的疊加如果用一個形象的栗子來理解是什麼呢?
光波
高中時我們就學過,自然光是由不同顏色的光疊加而成的,而最著名的實驗就是牛頓師傅的三稜鏡實驗:
所以其實我們在很早就接觸到了光的頻譜,只是並沒有了解頻譜更重要的意義。
但不同的是,傅里葉變換出來的頻譜不僅僅是可見光這樣頻率範圍有限的疊加,而是頻率從 0 到無窮所有頻率的組合。
這裡,我們可以用兩種方法來理解正弦波:
第一種前面已經講過了,就是螺旋線在實軸的投影。
另一種需要藉助歐拉公式的另一種形式去理解:
將以上兩式相加再除2,得到:
這個式子可以怎麼理解呢?
我們剛才講過,e^(it)可以理解為一條逆時針旋轉的螺旋線,那麼e^(-it)則可以理解為一條順時針旋轉的螺旋線。而 cos (t)則是這兩條旋轉方向不同的螺旋線疊加的一半,因為這兩條螺旋線的虛數部分相互抵消掉了!
舉個例子的話,就是極化方向不同的兩束光波,磁場抵消,電場加倍。
這裡,逆時針旋轉的我們稱為正頻率,而順時針旋轉的我們稱為負頻率(注意不是復頻率)。
好了,剛才我們已經看到了大海——連續的傅里葉變換頻譜,現在想一想,連續的螺旋線會是什麼樣子:
想像一下再往下翻:
是不是很漂亮?
你猜猜,這個圖形在時域是什麼樣子?
哈哈,是不是覺得被狠狠扇了一個耳光。數學就是這麼一個把簡單的問題搞得很複雜的東西。
順便說一句,那個像大海螺一樣的圖,為了方便觀看,我僅僅展示了其中正頻率的部分,負頻率的部分沒有顯示出來。
如果你認真去看,海螺圖上的每一條螺旋線都是可以清楚的看到的,每一條螺旋線都有著不同的振幅(旋轉半徑),頻率(旋轉周期)以及相位。而將所有螺旋線連成平面,就是這幅海螺圖了。
好了,講到這裡,相信大家對傅里葉變換以及傅里葉級數都有了一個形象的理解了,我們最後用一張圖來總結一下:
好了,傅里葉的故事終於講完了,下面來講講我的故事:
這篇文章第一次被卸下來的地方你們絕對猜不到在哪,是在一張高數考試的卷子上。當時為了刷分,我重修了高數(上),但是後來時間緊壓根沒複習,所以我就抱著裸考的心態去了考場。但是到了考場我突然意識到,無論如何我都不會比上次考的更好了,所以乾脆寫一些自己對於數學的想法吧。於是用了一個小時左右的時間在試卷上洋洋洒洒寫了本文的第一草稿。
你們猜我的了多少分?
6 分
沒錯,就是這個數字。而這 6 分的成績是因為最後我實在無聊,把選擇題全部填上了C,應該是中了兩道,得到了這寶貴的 6 分。說真的,我很希望那張卷子還在,但是應該不太可能了。
那麼你們猜猜我第一次信號與系統考了多少分呢?
45 分
沒錯,剛剛夠參加補考的。但是我心一橫沒去考,決定重修。因為那個學期在忙其他事情,學習真的就拋在腦後了。但是我知道這是一門很重要的課,無論如何我要吃透它。說真的,信號與系統這門課幾乎是大部分工科課程的基礎,尤其是通信專業。
在重修的過程中,我仔細分析了每一個公式,試圖給這個公式以一個直觀的理解。雖然我知道對於研究數學的人來說,這樣的學習方法完全沒有前途可言,因為隨著概念愈加抽象,維度越來越高,這種圖像或者模型理解法將完全喪失作用。但是對於一個工科生來說,足夠了。
後來來了德國,這邊學校要求我重修信號與系統時,我徹底無語了。但是沒辦法,德國人有時對中國人就是有種藐視,覺得你的教育不靠譜。所以沒辦法,再來一遍吧。
這次,我考了滿分,而及格率只有一半。
老實說,數學工具對於工科生和對於理科生來說,意義是完全不同的。工科生只要理解了,會用,會查,就足夠了。但是很多高校卻將這些重要的數學課程教給數學系的老師去教。這樣就出現一個問題,數學老師講得天花亂墜,又是推理又是證明,但是學生心裡就只有一句話:學這貨到底幹嘛用的?
缺少了目標的教育是徹底的失敗。
在開始學習一門數學工具的時候,學生完全不知道這個工具的作用,現實涵義。而教材上有隻有晦澀難懂,定語就二十幾個字的概念以及看了就眼暈的公式。能學出興趣來就怪了!
好在我很幸運,遇到了大連海事大學的吳楠老師。他的課全程來看是兩條線索,一條從上而下,一條從下而上。先將本門課程的意義,然後指出這門課程中會遇到哪樣的問題,讓學生知道自己學習的某種知識在現實中扮演的角色。然後再從基礎講起,梳理知識樹,直到延伸到另一條線索中提出的問題,完美的銜接在一起!
這樣的教學模式,我想才是大學裡應該出現的。
最後,寫給所有給我點贊並留言的同學。真的謝謝大家的支持,也很抱歉不能一一回復。因為知乎專欄的留言要逐次載入,為了看到最後一條要點很多次載入。當然我都堅持看完了,只是沒辦法一一回復。
本文只是介紹了一種對傅里葉分析新穎的理解方法,對於求學,還是要踏踏實實弄清楚公式和概念,學習,真的沒有捷徑。但至少通過本文,我希望可以讓這條漫長的路變得有意思一些。
最後,祝大家都能在學習中找到樂趣…
糾正一下,我覺得理論上應該是四個層次:FT---&>DTFT---&>DFT---&>FFT 一定要注意DTFT和DFT之間的區別。頻域採樣時域複製,時域採樣頻域複製。傅里葉變換非常美
http://zhuanlan.zhihu.com/wille/19759362
推薦網易公開課,斯坦福大學某老師講傅里葉變換,時不時可以看見上帝
拋開高數不說,只看一部奧本海姆的公開課的前十幾節課足夠弄懂各種傅立葉變換了,重點聽他講完幾頁課件,光說話的部分(也就是總結和對比),簡直不能再好,他的書不用全讀,當字典翻翻例題定義就行。 然後把schaum"s signal and system的3456章的題刷兩遍
看鄭君里的《信號與系統》!!!配合配套的matlab教程書使用效果更佳!!!
Alan V. Oppenheim的公共課也不錯,但到底語言關係,看起來、理解起來比較費時間,鄭君里的書至少是中文的,邏輯上很流暢,重數學(對CS的你一定沒問題,^_~ ),物理概念闡述得也很明了,給公式和結果時不會讓你有莫名其妙、從天上掉下來的感覺。
是的,我就是在諷刺另一本數字信號處理的渣教材(西電的那本!!!)——故弄玄虛,看起來好像是故意編給高段位選手看的(人家可能會說:看不懂是你low,怪我咯!),其實就是故意繞彎子,好好的話不會好好地說,極其不符合認知規律,千萬別買了!
最後,是從離散開始學還是從連續開始學,個人看法不同,每種都有相應教材和公開課。我是覺得連續開始會比較好懂,後面再學離散,平行、對比著記憶、理解會很簡單。但CS的孩紙是不是對離散有種天生的悟性我就不知道了(大霧!),看你自己的情況吧。
看書,推公式,做習題——如果你是天才就忽略後面兩步。
http://www.di.fc.ul.pt/~jpn/r/fourier/fourier.html
請問noise level 應該怎麼看
就是把一個函數或者波形用另一種坐標基來表示。我們平時描述一個波形通常使用幾個相互正交的向量來表示,而現在用一系列函數來表示,比如三角函數。而這些三角函數的波形的頻率又不一樣,這些三角函數又可以認為是各種諧波。每個不同諧波都帶著這個波形的一些信息,有些諧波對原波形影響大有的影響小,就跟矩陣特徵值或者奇異值類似,大的奇異值對應的向量對原矩陣性質影響比較大,而小的影響比較小。這些大小值在實際應用上打個比方吧,用時候需要壓縮可以把小的諧波或者小的奇異值去掉,因為他們對原來的影響不大,不過這是有損壓縮。
覺得這本書比較好,圖書館借的。
講解很獨到,解析很透徹
快速傅立葉變換你知道傅立葉級數是怎麼定義的 知道1的N次單位根是什麼 會一些最基本的線性代數就可以了 不需要學傅立葉變換…
強烈推薦只是畢設的話,直接調用寫好的函數啊,降噪的話實際代碼量不會超過100行的。然後從Wiki上和幾篇論文中把前面理論的部分抄一抄,就搞定了的,不用學懂。
推薦閱讀: