形象理解傅利葉轉換順帶fft

2021-10-02 13:14:23 字數 3718 閱讀 6111

3傅利葉轉換取點

4快速傅利葉轉換

5程式eiπ-1=0;

i=(-1)1/2,就是虛數。

寫個方程

y=eix;

求導 y』=ieix;

如果把y看做向量,那麼y』則垂直於y,也就是垂直於實軸;

通常,導數可以看做y增長的速度;

那麼二次導數可以看做加速度;

求二次導 y』』=-1eix;

可以看出加速度垂直於速度,那麼這個y點,將做圓周運動;

由於導數的絕對值是1,所以當x=x1時,y點將走過一段長為x1的圓弧,當x=π時,剛好轉了半圈,所以才有

eiπ-1=0;

然後所以得出

eix=cos(x)+isin(x),x=[0,2π];

可以把復平面中的乘法理解為旋轉;

eia*eib=ei(a+b);

也就是複數相乘,等於模相乘,弧度相加,但在這裡,模都是1,所以只有弧度相加。

f(x)=a0+a1x+a2x2+……+anxn;

這是係數表示法

如果這樣的兩個多項式相乘,就會很麻煩,要算n2次,所以要把多項式轉化成一些點,然後將點相乘,就可以簡單點,只需算n次;

我們可以用幾個點來確定這個多項式,最簡單的情況就是告訴你兩個點,你可以確定一條直線,f(x)=a0+a1x,這條直線有a0,a1,兩個未知數,你可以用兩個點確定。

那麼對於f(x)=a0+a1x+a2x2+……+anxn;

你可以用n+1個點確定(從0到n)。

舉個例子

a(x)=a0+a1x;

由(x1,ya1),(x2,ya2)確定;

b(x)=b0+b1x

;由(x1,yb1),(x2,yb2)確定;

a(x) * b(x)=c(x)=c0+c1x+c2x2;

你把兩條直線相乘可以得到一條二次函式線(拋物線),你把a,b兩條直線的兩個點對應的y值相乘,可以得到位於c曲線上的兩個點

(x1,yc1),(x2,yc2),yc1=ya1 *yb2 , yc2=ya2 *yb2;

那麼很顯然,c有三個未知數(c0,c1,c2),需要三個點才能確定。

所以儘管你可以用兩個點確定這條直線,但為了用點值相乘後的點確定這條拋物線,你還是需要在這條直線上選取3個點才行。

所以a(x)=a0+a1x+…+anxn;

b(x)=b0+b1x+…+bmxm;

a(x)*b(x)=c(x)=c0+c1x+…cn+mxn+m;

c由m+n+1個點確定(從0到m+n);

所以a和b要取各m+n+1個點

(x1,ya1),(x2,ya2)…(xm+n+1,yam+n+1)

(x1,yb1),(x2,yb2)…(xm+n+1,ybm+n+1)

你按正常方法算這些點的y值也是很麻煩的

ya1=a0+a1x1+…+anx1

n;算乙個點就需要加n次

況且你需要算n+m+1個點;

所以我們選用傅利葉轉換的方法取點,

因為待會可以將其公升級為快速傅利葉轉換(fft);

傅利葉轉換取點是在復平面上取點,尤拉公式是在復平面上的乙個圓,

eix=cos(x)+isin(x),x=[0,2π];

我們要取m+n+1個點,也就是說需要m+n+1個x;

那我們就把這個圓用m+n+1個點平分,每乙個點代表乙個x的值;

設乙個t=(2π/(m+n+1)),那麼每一段弧度為eit,

設w=eit,我們可以將其稱為單位弧度;

這次的x我們從0來編號(因為在圓中,2π=0);

x0=w0,

ya0=a0+a1(w0)+a2(w0)2+…+an(w0)n;

yb0=b0+b1(w0)+b2(w0)2+…+bm(w0)m

下面以此類推,將w0換成w1,w2等

x1=w1;

x2=w2..

.xn+m=wm+n;

為什麼要這麼取點呢,因為除了可以fft外,還可以由點確定系數值時方便一些,你肯定不希望通過聯立方程組來求未知數吧。

傅利葉逆轉換就是由點確定係數

先不進行相乘,先只是傅利葉轉換然後逆轉換;

那麼只取n+1個點就行了

這裡t=2π/(n+1),w=eit;

y0=a0+a1(w0)+a2(w0)2+…+an(w0)n=σi=0

n(ai(w0)i);

y1=σi=0

n(ai(w1)i);

y2=σi=0

n(ai(w2)i);..

yn=σi=0

n(ai(wn)i);

然後再設乙個多項式

p(x)=y0+y1x+y2x2+…+ynxn;

然後先說乙個結論,

p(w-i)=ai/(n+1);

形象理解一下,p(x)一共有n+1項,每一項都含有ai(其餘的a會相互抵消),所以要除(n+1),然後它為什麼會等於ai呢,

舉個例子『

p(w-2)=a2/(n+1);

p(w-2)=σi=0

n(ai(w0)i)+σi=0

n(ai(w1)i)(w-2)1+σi=0

n(ai(w2)i)(w-2)2+…+σi=0

n(ai(wn)i)*(w-2)n;

會發現,當每一項的i=2時,其對應的a2的係數都會為一,可以說每一項的a2都「恰好被轉回來了」,而其他的a的係數會相互抵消,假設n=4,然後以a3的係數被抵消為例,

第1項的a3的係數為1;

第2項的a3的係數為(w1)3 *(w-2)1=w1;

第3項的a3的係數為(w2)3 *(w-2)2=w2;

第4項的a3的係數為(w3)3 *(w-2)3=w3;

第5項的a3的係數為(w4)3 *(w-2)4=w4;

w=ei(2π/5);

這五個數在復平面上的點剛好是正五邊形的五個頂點,畫個圖試試,把這五個數代表的復平面向量加起來,剛好為零。

所以這個傅利葉逆轉換可以理解為,所求的係數剛好都被剛好「逆轉」到了實數軸,其他的係數散落在負平面上的圓上,其點組成的圖形的重心在圓心,所以互相抵消為零。

主要快在取點上,從這裡開始,多項式一共有n項,且n為2的整數次冪;

舉個例子,假設n=8;

a(x)=a0+a1x1+a2x2+…+a7x7;

y0=a0+a2+a4+a6 + a1+a3+a5+a7;

y4的,我就直接把w4(w=ei(2π/8))帶進去算出來

y4=a0+a2+a4+a6 - a1-a3-a5-a7;

y2=a0+a4-a2-a6 +w2(a1+a5-a3-a7);

y6=a0+a4-a2-a6 -w2(a1+a5-a3-a7);

把每個y分為兩部分,a下標為偶數一部分,奇數一部分。

y=(a0+a2x2+a4x4+a6x6)+x(a1+a3x2+a5x4+a7x6);

而wi=-wi+n/2;

yi=x+y;

yi+n/2=x-y;i<=n/2;

所以我們只求出一半的y就可以直接得出另一半,既然可以這樣那我們得寸進尺只求出一半的一半就可以了,再少一點…

仔細觀察y0與y2

y0=a0+a2+a4+a6 + a1+a3+a5+a7;

y2=a0+a4-a2-a6 +x(a1+a5-a3-a7);

所以,一半的一半

y=(a0+a4x4+x2(a2+a6x4))+x(a1+a5x4+x2(a3+a7x4));

然後一直二分,複雜度只有nlogn;

所以我們先求最小的一部分然後兩兩合併…

快速逆轉換也和這個一樣,只是係數變了;

快速傅利葉(FFT)

快速傅利葉 更加形象的理解傅利葉變換 大概了解之後 從傅利葉級數到傅利葉變換 太大,只能裁剪為兩張 刨根問底的同學 雷德演算法 輸出序列是按自然順序排列的,而輸入序列的順序則是 位元反轉 方式排列的。也就是說,將序號用二進位制表示,然後將二進位制數以相反方向排列,再以這個數作為序號。如011變成11...

FFT快速傅利葉

description 給出兩個n位10進製整數x和y,你需要計算xy。input 第一行乙個正整數n。第二行描述乙個位數為n的正整數x。第三行描述乙個位數為n的正整數y output 輸出一行,即xy的結果。資料範圍 n 60000 乙個整數x a nan 1.a 0x a na a 0 x an...

FFT 快速傅利葉演算法 for java

package com.test.test2 public class fft bitreverse i reve double theta,dt 2 3.14159265358979323846 fft n for i 0 i fft n 1 i 用於頻譜顯示的快速傅利葉變換 param real...