Processing math: 100%
Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
0 beğenilme 0 beğenilmeme
792 kez görüntülendi
Ingilizce kaynaklarda Fast Fourier Transform adi altinda gecen algoritmanin calisma prensibi nedir?
Teorik Bilgisayar Bilimi kategorisinde (1.6k puan) tarafından  | 792 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Hizli Fourier Donusumu algoritmasi Ayrik Fourier Donusumunu O(n2) den hizli hesaplamak icin kullanilan tum algoritmalarin genel adiymis. Bilgisiyar biliminde acik sorulardan bir tanesi bu donusumu O(nlogn) den hizli yapabilirmiyiz imis.

Ben Cooley-Tukey algoritmasindan bahsedecegim. Ilginc bir anektod olarak bu algoritmayi Cooley ve Tukeyden 160 sene kadar once Gauss  astreoidlerin yorungesini hesaplamak icin bulmus/kullanmis.

N uzunlugundaki xn dizisinin Ayrik Fourier Transformasyonu su sekilde veriliyor:

k[0,N1]Xk=N1n=0xne2πiNnk

Xk yi baska bir sekilde ifade edelim.

Xk=N21m=0x2me2πiN2mk+N21m=0x2m+1e2πiN(2m+1)k

Xk=N21m=0x2me2πiN/2mk+e2πiNkN21m=0x2m+1e2πiN/2mk

Dikkatli bakarsaniz toplamanin sagi x2k dizisinin , toplamanin sol tarafi x2k+1 dizisinin Ayrik Fourier Donusumu.

ei nin periyodikliginden yararlanip gosterebiliriz ki

Xk=N21m=0x2me2πiN/2mk+e2πiNkN21m=0x2m+1e2πiN/2mk

Xk+N2=N21m=0x2me2πiN/2mke2πiNkN21m=0x2m+1e2πiN/2mk

Bu sekilde ozyinelemeli olarak yazarsak yapacagimiz islem sayisi O(n2) den O(nlogn) duser.

Python da yazarsak

def hizli_fourier(x):
    N = len(x)
    if(N <=1):
       return x
    cift = hizli_fourier(x[0::2])
    tek = hizli_fourier(x[1::2])
    T= [ exp(-2j*pi*k/N)*tek[k] for k in range(N//2) ]
    sol = [ cift[k] + T[k] for k in range(N//2)] 
    sag =  [cift[k] - T[k] for k in range(N//2)]
    return sol+sag

 

Duzenleme :

Su soruyu da inceleyebilirsiniz. Verilen cevap matematiksel olarak daha temiz.

(1.6k puan) tarafından 
tarafından düzenlendi
20,312 soru
21,866 cevap
73,586 yorum
2,847,691 kullanıcı