知識 如何用快速傅利葉變換實現DFT

2022-05-10 19:10:51 字數 1098 閱讀 3776

如何以 \(o(n \log n)\) 的效率將係數多項式轉換為點值多項式。

眾所周知,\(x^n=1\)的根有n個,而且它們分別是\(e^}\),即在復平面內的座標為\((cos(2πi),sin(2πi))\)。

我們分別用\(ω_n^0~ω_n^\)來描述這n個根。而且等會我們要算的,就是多項式a在這n個點處的點值。

為了方便計算,我們設n為2的冪次。

由複數的性質可以得到一些公式:

\((ω_^)=ω_n^k\)

\((ω_n^k)^2=ω_n^=ω_^\)

\(ω_n^}=-ω_n^k\)

假設我們有乙個長度為n的多項式\(a(x)=a_0+a_1x...a_x^\),現在我們設乙個過程\(f(a)\)來遞迴地計算\(a(x)\)的點值多項式(而且點值的自變數就是上述n個單位複數根)。

簡單地把\(a(x)\)拆分成兩個多項式,即設:

\(a_0(x)=a_0+a_2x+a_4x^2...+a_x^-1}\)

\(a_1(x)=a_1+a_3x+a_5x^2...+a_x^-1}\)

容易發現\(a(x)=a_0(x^2)+x*a_1(x^2)\)

我們要求的是對於所有k,\(ω_n^k\) 處的點值。

且\(a(ω_n^k)=a_0((ω_n^k)^2)+ω_n^k*a_1((ω_n^k)^2)\)

先求所有的k滿足\(k∈[0,n/2)\)

化簡易得\(a(ω_n^k)=a_0(ω_}^k)+ω_n^k*a_1(ω_}^k)\)

而且對於\(k∈[0,n/2)\),我們也可以得到

\(a(ω_n^})=a_0(ω_n^)+ω_n^}*a_1(ω_n^)\)

\(=a_0(ω_n^)-ω_n^*a_1(ω_n^)=a_0(ω_}^k)-ω_n^*a_1(ω_}^k)\)

此時我們已經能求出所有的點值了,而且我們要用到的條件就是:

\(a_0(ω_}^k)\) 和 \(a_1(ω_}^k)\)

\(k∈[0,n/2)\)

容易發現這就是子問題,我們只需直接遞迴 \(f(a_0)\) 和 \(f(a_1)\) 即可。

由主定理,得效率為\(t(n)=o(n)+2*t(\frac)=o(n \log n)\)

離散傅利葉變換 快速傅利葉變換C 實現

傅利葉變換是將時域訊號變換為頻域訊號的一種方式,我主要用它來做兩件事情 1 求一段資料的週期性。2 通過傅利葉變換及其逆變換,進行低通濾波 去躁 首先需要做幾點說明 1.快速傅利葉變換是離散傅利葉變換的快速演算法,當資料來源較大時 大於1000 快速傅利葉變換有明顯優勢。2.快速傅利葉變換的訊號源長...

快速傅利葉變換C 遞迴演算法實現

快速傅利葉變換c 遞迴演算法實現 網上有些演算法資料經測試執行結果是錯誤的,雖然 的使用的是非遞迴形式。為了方便驗證快速傅利葉變換的準確性,我提供了自己設計的遞迴演算法。基於時域抽取的 基 2 快速傅利葉變換演算法 fouier.h 檔案 pragma once include complex.h ...

Python 實現簡單的快速傅利葉變換

相比於matlab自帶的fft函式以及詳盡的官方文件來說,python在傅利葉變換這個方面相比就不是那麼簡單了,處處需要使用help檢視相關函式的定義。但是本質來說,都是傅利葉變換,只是程式語言不同而已。import numpy as np from scipy.fftpack import fft...