傅里葉變換和正弦函數和歐拉公式

知識點:重點講解正弦函數和歐拉公式的關係,以及它們在傅里葉變換中的作用,附加:傅里葉變換和卷積公式

這是我第二次學習傅里葉變換,其實第一次就已經懂了時域和頻域的關係,也知道一維傅里葉變換就是將一個函數轉化爲很多頻率不同的正弦函數的和,二維圖片傅里葉中的頻率指的是圖像中像素的梯度。頻率高的代表圖像的變換,頻率低表示圖像溫和。

但是我還是不會自己編寫代碼,最讓我不理解的就是爲什麼DFT的求解方程式就是Xk=N1n=0xn ei 2π k n/N ,IDFT就是xn=1NN1k=0Xk ei 2π k n/N ??而且說好的正弦函數作爲基呢!引入eit 是個什麼鬼??而且當我輸入的原函數f是正弦函數是,DFT分解後,並不是我想想中的,對應頻率的正弦函數是一個振幅1,而其餘頻率的正弦函數函數振幅是0的結果??而且還有就是圖像的頻率, 一維傅里葉變換中,很多資料都給出一個函數具體怎麼由其它基函數(正弦函數)組成的,每一個基長什麼樣子都可以看到,可是當講到二維圖像的時候,從來沒人畫出二維圖像的基函數的圖像??


下面是關於傅里葉一些資料,本文重點不是講解傅里葉的直觀上原理,而是幫助理解如何編程DFT。
傅里葉:
http://blog.jobbole.com/70549/

http://www.xuebuyuan.com/2052774.html

https://wenku.baidu.com/view/9687303f10661ed9ad51f3b6.html

快速傅里葉:
http://www.cnblogs.com/callback-w/p/4457507.html

https://www.zhihu.com/question/20456490

http://blog.jobbole.com/58246/

圖像傅里葉:
http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT4/node2.html

http://cns-alumni.bu.edu/~slehar/fourier/fourier.html#filtering

http://blog.csdn.net/abcjennifer/article/details/7622228

http://blog.163.com/zwg_1314@126/blog/static/35333246201041113154728/


一,正弦函數


這裏說的正弦函數是指一類函數,就像3x(12)xex 都是指數函數、log2xlogex 都是對數函數一樣,只要符合f(x)=Asin(Bx+C) 形式的函數都是正弦函數,其中A 表示振幅,B 表示週期、頻率,C 表示相位,是正弦函數的三要素。

cos(x)=sin(x3π2) ,餘弦函數也是正弦函數的一種。
asin(x)+bcos(x)=a2+b2sin(x+y) ,其中tan(y)=ba 。也是一種正弦函數。

正弦函數的一個理解就是一個點圍繞原點做圓周運動,它的y軸分量的時候歲時間變化的曲線,如下圖所示,這裏和上面的公式對應有三個要素,就是振幅A 對應圓周半徑,週期B 對應圓周運動的角速度,相位C 對應圓周運動的起始位置(即時間爲0的時候,點所在的位置)。

點做圓周圓周運動產生正弦函數

也就是確定了圓周運動的三要素後,對任給x,正弦函數給出,對應x時刻的點的y軸的座標值。

二,歐拉公式


eix=cos(x)+isin(x)eix=cos(x)isin(x)eiπ+1=0sin(x)=eixeix2icos(x)=eix+eix2

歐拉公式的推導過程大致如下:
ex=1+x1!+x22!+x33!+cos(x)=1x22!+x44!x66!+sin(x)=xx33!+x55!x77!+

ex 中的x 換成±ix ,因爲(±i)2=1,(±i)3=i,(±i)4=1, ,所以
e+xi=1+ix1!x22!ix33!+x44!+=(1+x44!x66!+)+i(xx33!+x55!x77!+)=cos(x)+isin(x)exi=cos(x)isin(x)

如果非要理解ei 次方是什麼意思的話,可以參考:
https://betterexplained.com/articles/intuitive-understanding-of-eulers-formula/

我之前一直看不懂歐拉公式,不明白這是什麼意思,我覺得最關鍵的錯誤就是試圖去理解ei 次方是什麼意思。這裏我們簡簡單單的將eix 看做一種映射,一種函數,即fEuler(x)=eix 給定x ,函數f 輸出一個複數結果,函數f 將實數x 映射到複數空間,且這些複數點都在一個圓上。就好像知道一個函數fEuler(x) ,你不用管fEuler(x) 具體是什麼,只知道可以將實數映射到複數空間。而且進一步我們知道這種映射關係的計算方式:fEuler(x)=cos(x)+isin(x) 。反正我們不用思考ei 次方是什麼意思了,起碼對我來說,將它看做是實數空間到複數空間的一種映射,而不去思考ei 次方,會更容易讓我接受,把ei 次方當做是一種記號,一種規定的書寫形式而已。(其實輸入是x,一維的,輸出雖然是複數,但其實也是一維的,不過是一條旋轉的曲線,而輸入x是一條直線

三,正弦函數和歐拉公式


我的理解是正弦函數和歐拉公式都是在描述圓周運動。前面講過一個圓周運動有三個要素:半徑、角速度和初始位置。這都很容易對應到正弦函數,而歐拉公式也是可以。我們這裏說的歐拉公式爲:fEuler(x)=Aei(Bx+C)=Acos(Bx+C)+iAsin(Bx+C) 。注意Aei(Bx+C)ei(Bx+C)+aeaei(Bx+C) 是一樣的,因爲總可以找到a 來使得A=ea (負數的振幅A 應該是不被允許的)。如下所示:
這裏寫圖片描述

歐拉公式也是在描述一種特定的圓周運動,而歐拉公式的返回值是x時刻的點的位置,用複數來表示,不同於正弦函數(它返回的是x時刻的點的有座標值)。從描述圓周運動的角度,它們是一致的,它們都是根據時間x返回圓周運動上的點的一個指標上的值。複數和實數都是數,更或者說是信息的一種編碼形式。歐拉公式返回的複數的實部表示點在x軸的座標值,虛部表示點在y軸上的座標值。
這裏寫圖片描述
這裏寫圖片描述

上圖是wikipedia上關於歐拉公式的圖,不過我修改了些部分。圖中綠色線所標註的x軸,像時間在流失一樣,一直往前走。y和z組成了一個平面空間,點就在這個平面空間上轉動。歐拉公式中的自變量x是對應x軸上的時間點。歐拉公式返回的複數結果,對應點在yz平面上的座標。隨着自變量x的增大,點的移動軌跡就像紅色的線所標註的一樣,圍繞x軸做螺旋圓周運動,如果映射到yz平面上就是做圓周運動。歐拉公式和正弦函數都是在描述這樣一種運動,或者說映射規律,只不過歐拉公式根據x,輸出的是點映射到yz平面上的座標,用複數的形式來表示。而正弦函數將紅色的點的運動軌跡映射到y軸上,如圖中紫色的線所示,因爲x軸信息已知,只需要輸出y軸座標即可。

eixeix 的關係是點做圓周運動的方向不同,從x正半軸向負半軸看下去,eix 做逆時針旋轉,eix 做順時針旋轉。所以 sin(x)=eixeix2icos(x)=eix+eix2

歐拉函數的一個優點是,正弦函數一個週期內會輸出重複的函數值,而歐拉公式在一個週期內不會輸出重複的函數值

總結一下,正弦函數和歐拉公式都是描述圓周運動隨時間x變化的性質,都是一種映射,都是一種函數。歐拉公式更像是正弦函數的加強版,因爲它返回了更多的信息。不要在意返回的是實數還是複數,因爲都是數,都有完備的加減乘數運算。最原始的歐拉公式eix 是在描述半徑爲1,週期爲2π ,初始點在x 正半軸上的圓周運動。

最後說一下歐拉公式的編程實現。因爲上面已知在強調歐拉公式就是一種映射,返回的是一個複數而已,而複數的實部和虛部的計算方式都給出來了,只要不在意ei 次方就行。python代碼如下:

import numpy as np
def my_exp(x):
    if x is complex:
        res_real = np.exp(x.real)
        res_imaginary = ( np.cos(x.imag) + 1j*np.sin(x.imag) )
        return res_real * res_imaginary
    else:
        return np.exp(x)

x = 0.5
print np.exp(1+1j*x),my_exp(1+1j*x)
print np.exp(1+1j*x)==my_exp(1+1j*x)

最後再說下正弦函數和歐拉公式的正交性
頻率不相同的兩個三角函數相乘,在它們兩個共同的週期上積分爲0。

y(x)=A1sin(B1x+C1)×A2sin(B2x+C2)=A1A2cos(B1x+C1B2xC2)+cos(B1x+C1+B2x+C2)2     //=A1A2cos[(B1B2)x+(C1C2)]+cos[(B1+B2)x+(C1+C2)]2

因爲頻率不同,所以|B1| != |B2| ,所以cos[(B1B2)x+(C1C2)]cos[(B1+B2)x+(C1+C2) 都是餘弦函數,所以在它們共同的週期上進行積分,值爲0。

離散的情況,當在它們共同週期內等間隔均勻採樣的離散值求和也爲0,例如:

y(x)//[0,6)x=05y(x)=3sin((2π/3)x+2)×5sin((2π/2)x+7)=15cos[(π/3)x5]+cos[(5π/3)x+12]2=x=0515cos[(π/3)x5]+cos[(5π/3)x+12]2=(15/2)×[cos(5)+cos(π/35)+cos(2π/35)+cos(π5)+cos(4π/35)+cos(5π/35)+cos(12)+cos(5π/3+12)+cos(10π/3+12)+cos(5π/+12)+cos(20π/3+12)+cos(25π/3+12)]=0

對於歐拉公式也是一樣的fEuler(x)=Aei(Bx+C)=Acos(Bx+C)+iAsin(Bx+C)
y(x)y(x)=A1ei(B1x+C1)×A2ei(B2x+C2)=A1A2ei[(B1+B2)x+(C1+C2)]=A1A2[cos((B1+B2)x+(C1+C2))+isin((B1+B2)x+(C1+C2))]=A1ei(B1x+C1)×A2ei(B2x+C2)=A1A2{cos(B1x+C1)+iAsin(B1x+C1)}{cos(B2x+C2)+iAsin(B2x+C2)}=A1A2{cos(B1x+C1)cos(B2x+C2)sin(B1x+C1)sin(B2x+C2)+i[sin(B1x+C1)cos(B2x+C2)+cos(B1x+C1)sin(B2x+C2)]}=A1A2[cos((B1+B2)x+(C1+C2))+isin((B1+B2)x+(C1+C2))]

同樣的,只要B1!=B2 ,這一點和正弦函數不一樣,那麼y(x) 在共同的週期內積分爲0,離散的情況也一樣。
同時我們可以看到,正餘弦函數複雜的乘法運算,可以用簡單的指數乘積來替代,它們的結果是一樣的。

四,DFT編程的理解


很多文章都是從頻域和正餘弦函數來講解傅里葉變換,可是DFT的編程公式裏面偏偏出現了一個歐拉公式,讓我費解好久。DFT:Xk=N1n=0xn ei 2π k n/N ,IDFT:xn=1NN1k=0Xk ei 2π k n/N

這裏假設需要進行離散傅里葉變換的信號是X=(x0,x1,x2,x3) ,其DFT後的值爲Y=(y0,y1,y2,y3) 。從DFT和IDFT的公式中可以看出,就是向量內積的運算。

yk=n=03xn ei 2π k n/4=<X,fEuler_{2πk/4}>xn=14k=03yk ei 2π k n/4=14<Y,fEuler_{2πn/4}>

其中{2πn/4} 表示歐拉公式的參數,fEuler_{2πn/4}(x)=ei(2πn/4)×x ,也即圓周運動的週期頻率信息。所以很多資料才一直說的是域向頻域的轉換。下面寫成矩陣的形式:
DFT(X)=YIDFT(Y)=X=y0y1y2y3=fT{2π0/4}fT{2π1/4}fT{2π2/4}fT{2π3/4}×X=f{2π0/4}(0)f{2π1/4}(0)f{2π2/4}(0)f{2π3/4}(0)f{2π0/4}(1)f{2π1/4}(1)f{2π2/4}(1)f{2π3/4}(1)f{2π0/4}(2)f{2π1/4}(2)f{2π2/4}(2)f{2π3/4}(2)f{2π0/4}(3)f{2π1/4}(3)f{2π2/4}(3)f{2π3/4}(3)×X=f{2π/4}(0)f{2π/4}(0)f{2π/4}(0)f{2π/4}(0)f{2π/4}(0)f{2π/4}(1)f{2π/4}(2)f{2π/4}(3)f{2π/4}(0)f{2π/4}(2)f{2π/4}(4)f{2π/4}(6)f{2π/4}(0)f{2π/4}(3)f{2π/4}(6)f{2π/4}(9)×X=M2π/4×X=x0x1x2x3=fT{2π0/4}fT{2π1/4}fT{2π2/4}fT{2π3/4}×Y/4=f{2π0/4}(0)f{2π1/4}(0)f{2π2/4}(0)f{2π3/4}(0)f{2π0/4}(1)f{2π1/4}(1)f{2π2/4}(1)f{2π3/4}(1)f{2π0/4}(2)f{2π1/4}(2)f{2π2/4}(2)f{2π3/4}(2)f{2π0/4}(3)f{2π1/4}(3)f{2π2/4}(3)f{2π3/4}(3)×Y/4=f{2π/4}(0)f{2π/4}(0)f{2π/4}(0)f{2π/4}(0)f{2π/4}(0)f{2π/4}(1)f{2π/4}(2)f{2π/4}(3)f{2π/4}(0)f{2π/4}(2)f{2π/4}(4)f{2π/4}(6)f{2π/4}(0)f{2π/4}(3)f{2π/4}(6)f{2π/4}(9)×Y/4=M2π/4×Y/4

M2π/4M2π/4 分別描述的是振幅相同、相位相同、轉速相同、但旋轉方向相反的兩種圓周運動。根據上一節歐拉公式的正交性可以容易計算出M2π/4×M2π/4=M2π/4×M2π/4=4I ,如下所示:

M2π/4×M2π/4=f{2π0/4}(0)f{2π1/4}(0)f{2π2/4}(0)f{2π3/4}(0)f{2π0/4}(1)f{2π1/4}(1)f{2π2/4}(1)f{2π3/4}(1)f{2π0/4}(2)f{2π1/4}(2)f{2π2/4}(2)f{2π3/4}(2)f{2π0/4}(3)f{2π1/4}(3)f{2π2/4}(3)f{2π3/4}(3)×f{2π0/4}(0)f{2π1/4}(0)f{2π2/4}(0)f{2π3/4}(0)f{2π0/4}(1)f{2π1/4}(1)f{2π2/4}(1)f{2π3/4}(1)f{2π0/4}(2)f{2π1/4}(2)f{2π2/4}(2)f{2π3/4}(2)f{2π0/4}(3)f{2π1/4}(3)f{2π2/4}(3)f{2π3/4}(3)=f{2π0/4}(0)f{2π1/4}(0)f{2π2/4}(0)f{2π3/4}(0)f{2π0/4}(1)f{2π1/4}(1)f{2π2/4}(1)f{2π3/4}(1)f{2π0/4}(2)f{2π1/4}(2)f{2π2/4}(2)f{2π3/4}(2)f{2π0/4}(3)f{2π1/4}(3)f{2π2/4}(3)f{2π3/4}(3)×f{2π0/4}(0)f{2π0/4}(1)f{2π0/4}(2)f{2π0/4}(3)f{2π1/4}(0)f{2π1/4}(1)f{2π1/4}(2)f{2π1/4}(3)f{2π2/4}(0)f{2π2/4}(1)f{2π2/4}(2)f{2π2/4}(3)f{2π3/4}(0)f{2π3/4}(1)f{2π3/4}(2)f{2π3/4}(3)=fT{2π0/4}fT{2π1/4}fT{2π2/4}fT{2π3/4}×[f{2π0/4}f{2π1/4}f{2π2/4}(f{2π3/4}]=4000040000400004=4I

其中f{B}(0)f{B}(0)=1f{B}(1)f{B}(1)=1f{B}(2)f{B}(2)=1f{B}(3)f{B}(3)=1B2π0/42π1/42π2/42π3/4

也就是說M2π/4M2π/4/4 互爲逆矩陣。

最初我們希望X 可以分解爲多個頻域的向量相加,也就是X=(1/N)M2π/NY ,那麼等式兩邊乘以(1/N)M2π/NM2π/N ,即可得到Y的求解方程:M2π/NX=Y

矩陣可以看做是一種變換器,乘以一個矩陣相當於對數據進行對應的變換。我們首先用矩陣M2π/NX 進行轉變得到Y=M2π/NX ,接着可以用M2π/N 的逆變換,也就是(1/N)M2π/NY 操作在得到X ,即:X=(1/N)M2π/NY=(1/N)M2π/NM2π/NX=X

X=(1/N)M2π/NY 可知,我們選取頻率的基向量M2π/N=[f{2π1/N},f{2π2/N},,f{2π(N1)/N}] 來分解X 。爲什麼選取(1/N)M2π/N 爲頻率的基向量,我想有一個原因應該是它的逆矩陣很容易求。DFT和IDFT的代碼:

# 當然實際生活中用到的是快速傅里葉變換FFT
def my_DFT(x):
    '一維離散傅里葉變換'
    x = np.asarray(x,dtype=complex)
    N = x.shape[0]
    n = np.arange(N)
    k = n.reshape((N,1))
    M = np.exp(-2j*np.pi*k*n/N)
    return np.dot(M,x)

def my_IDFT(y):
    '一維逆離散傅里葉變換'
    y = np.asarray(y,dtype=complex)
    N = y.shape[0]
    n = np.arange(N)
    k = n.reshape((N,1))
    M = np.exp(2j*np.pi*k*n/N)
    print M
    return np.dot(M,y)/N

簡單的例子X=(1/4)M2π/4Y 如下:

X1234M2π/4111111j11j111111j11jY102+2j222j

總結一下,我們現在知道,隨便一個可逆方陣都可以先用矩陣M進性正變換Y=MX,然後再用逆矩陣M進行逆變換得到原來的值X=MY=MMX=X。至於爲什麼選擇的是歐拉函數作爲頻域的基向量: 第一點肯定是矩陣M和其逆矩陣都非常容易計算,從代碼中可以看到,任給定N,都可以給出M和逆M。第二點,如果你同意用正弦函數作爲頻域的基向量的話,那你就更沒辦法拒絕歐拉函數作爲基向量了,因爲之前已經說了,歐拉函數是正弦函數的加強版,包含更多信息,正弦函數有的優點,它都有。或許還有其它原因。比如或許並不是任意一個可逆方陣都能夠被當做頻域信息。還有就是,正弦波作爲基向量對應的矩陣是實可逆矩陣,而歐拉函數作爲基向量對應的矩陣是復可逆矩陣,本質上沒有區別,因爲都滿足基本的運算規則,加減乘除、一元、零元之類的。

五,2維 傅里葉 圖像傅里葉


先推薦良心教材:
http://fourier.eng.hmc.edu/e101/lectures/Image_Processing/node6.html
http://fourier.eng.hmc.edu/e101/lectures/Image_Processing/Image_Processing.html

我是看了上面的的文章才懂了圖像頻率的含義,也真正知道了傅里葉變換後圖像中點的含義,這裏我做一個知識的搬運工。

(待續)
(草稿:)
先理解z=sin(x),理解z=Asin(Bx+C),在理解z=Asin(B(x+y)+C),再理解z=Ae^{j[Bx+C]},再理解z=Ae^{j[B(x+y)+C]}。
這裏寫圖片描述

也要區別,爲什麼二維不能直接轉爲一維的來處理,它們之間的差別是什麼。我想就像上面說的一樣,不同的矩陣,理解爲不同的視角,但有些矩陣,真的可能不能被解讀爲頻域信息,所以矩陣的選擇,和視角選擇很重要。。。還有就是,正弦波作爲基向量對應的矩陣是實可逆矩陣,而歐拉函數作爲基向量對應的矩陣是復可逆矩陣,本質上沒有區別,因爲都滿足基本的運算規則,加減乘除、一元、零元之類的。

六,傅里葉變換和卷積公式


卷積公式:y(x)=+f(α)g(xα) dα=f(x)g(x)
如果兩個函數的卷積的傅里葉變換等於兩個函數的傅里葉變換的乘積,如下。

F[f(x)g(x)]=+f(x)g(x)eiwxdx=+[+f(α)g(xα)dα]eiwxdx=+f(α)[+g(xα)eiwxdx]dα  //=u=xα+f(α)[+g(u)eiw(u+α)du]dα=+f(α)eiwα[+g(u)eiwudu]dα=+f(α)eiwαdα[+g(u)eiwudu]=F[f(x)]F[g(x)]

所以一些卷積運算可以先傅里葉運算,再乘積,再逆傅里葉運算即可,來降低運算複雜度。卷積運算複雜度爲n2 ,而兩次快速傅里葉(FFT)是2nlogn ,加上乘積運算n ,最終是n(2logn+1)

上面的公式有點亂,注意的是卷積y(x) 返回的是一個標量,而F[y(x)] 返回的是向量,而在推理的過程中一直用的是標量,不過關係不大,除了推理公式的頭和尾,其它沒有什麼問題。

卷積可以參考:
https://www.zhihu.com/question/22298352


我的另一篇關於傅里葉的雜亂的博客:
http://blog.sina.com.cn/s/blog_1541b2bcf0102x7pi.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章