Şimdi Ara

Fast Fourier Transform(FFT)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
11
Cevap
1
Favori
7.545
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Sinyal işlemede çokca kullanılan FFT için bir yazılım geliştirmek istiyorum. Fakat FFT nin tam olarak nasıl hesaplandığıyla ilgili bilgiye sahip değilim. İnternette yaptığım araştırmalarda tam anlamıyla hesabının nasıl yapıldığını anlamadım. Bilen arkadaşlardan bu konuda yardım almak için bu konuyu açıyorum.


    FFT elektronik için önemli bir konu olduğu için konuyu bu bölümde açmayı uygun gördüm.

    Saygılar...

    Emre



  • Matlab da bulunan fft fonksiyonuyla rahatlıkla yapabilirsin eger takılırsan help kısmına fft yazarsan sorularına cevap bulursun,example ları kullanarak kendi sistemini kurabilirsin.Kolay gelsin.
  • Ben bu sayfadan öğrendim
    http://www.atasoyweb.net/blog/dijital-sinyal-isleme-k8s0/hizli-fourier-donusumu-ve-frekans-olcme-y44.html

    Bu da yaptığım uygulama
    http://www.lugatek.com/forum/index.php?topic=22.0



    < Bu mesaj bu kişi tarafından değiştirildi Uykusuz. -- 6 Ağustos 2012; 10:51:59 >




  • Teşekkürler Uykusuz. Takıldığım bi yer hakkında soru sormak istiyorum.

    Şimdi diyelim ki elimizde şöyle bir vektör var ;

        [ 523 ] 
    [ 176 ]
    A= [ 912 ]
    [ 349 ]
    [ 277 ]

    Bu vektörün FFT sini alacağız.

     

    N-1
    Gerçel Xk = ∑ x[n]*cos(2Π*k*n/N)
    n=0

    N-1
    Sanal Xk = ∑ x[n]*(-sin(2Π*k*n/N))
    n=0
    Elde edilen değerler sanal düzlemde birer vektörü temsil eder. Son olarak herbir vektörün boyu hesaplanır.
    ________________________
    Xk = √(Gerçel Xk)2 + (Sanal Xk)2




    Bu formüle göre;
    k = (sırası gelen frekans elemanı)
    N = (örnek sayısını)
    n = (işlenmeyi bekleyen sıradaki örneğin indisi)
    x[n] =örneklenmiş sinyal verisini

    ifade etmektedir. Şimdi X[1] için hesap yapacak olursak ;
    Gerçel X[1] = x[n]cos[2pi*1*n/N]

    Buradaki n x[n] ve N ne olmalı ?



    < Bu mesaj bu kişi tarafından değiştirildi emter -- 6 Ağustos 2012; 18:03:14 >




  • hocam arkadaşın dediği gibi matlabte yazılmış kodu var. eğer nasıl yapıldığını merak ediyorsan formülün kodlarını açık bi şekilde görebiliosn matlabten
  • şöle bişi buldum hocam işine yararsa



    quote:

    % This programme is open source code of fast fourier transform in matlab.
    % Where y is the input argument and p is the normalized size of the input. Let
    % y = [1 2 3 4 ];
    % x= length(y);
    % m= log2(x);
    % p= ceil(m);
    % To call the function use
    % ft2(y,p);

    function Y=ft2

    size=length(input);
    l=log2(size);
    p=ceil(l);
    Y=input;
    N = 2^p;
    N2=N/2;
    YY = -pi*sqrt(-1)/N2;
    WW = exp(YY);
    JJ = 0 : N2-1;
    W=WW.^JJ;
    for L = 1 : p-1
    u=Y(:,1:N2);
    v=Y(:,N2+1:N);
    t=u+v;
    S=W.*(u-v);
    Y=[t ; S];
    U=W(:,1:2:N2);
    W=[U ;U];
    N=N2;
    N2=N2/2;
    end;
    u=Y(:,1);
    v=Y(:,2);
    Y=[u+v;u-v];
    Y




  • quote:

    Orijinalden alıntı: emter

    ......

    ifade etmektedir. Şimdi X[1] için hesap yapacak olursak ;
    Gerçel X[1] = x[n]cos[2pi*1*n/N]

    Buradaki n x[n] ve N ne olmalı ?

    X[1] = x[n]cos[2pi*1*n/N] değil. Toplam sembolü var orda bakın.


           
    N-1
    Xk = ∑ x[n]*cos(2Π*k*n/N)
    n=0


    N-1
    X[1] = ∑ x[n]*cos(2Π*1*n/N)
    n=0


    Buradaki n toplam sembolü üzerinden bir döngüye girecek ve x[n] dizisine indis olacak. Yani x[1], x[2], x[3] değerlerini alıcaksınız. x[n] dizisi ise giriş. Yani sizin A vektörünüz. N ise örnek sayısı. Sizin örneğinizde 5.

    Yalnız bu FFT değil DFT. Sinyalin ya da sistemin frekans tepkisini bulmak için DFT kullanılır. FFT ise DFT nin özel bir halidir.
    DFT yapısından dolayı frekans spektrumunu hesaplamak için çok sayıda gereksiz işlem yapar. Yapılan bu gereksiz işlemler bazı temel özellikler kullanılarak (periyodiklik, simetri gibi) azaltılır, yapılan işlem sayısı azaldığı için frekans spektrumu çok daha hızlı ve efektif olarak hesaplanır. İşte bu gereksiz işlemlerin atılmış haline FFT diyebilirsiniz. Farklı FFT algoritmaları vardır, araştırırsanız göreceksiniz.

    Fakat FFT yi öğrenmeden önce DFT yi öğrenmeniz gerekir. Yani işlemin nasıl yapıldığını öğrenin ki, daha efektif nasıl yapılabilir öğrenebilin. DFT en temel haliyle yukarıdaki formüllerde anlatıldığı gibidir.

    Formül şudur :

          N-1 
    Xk = ∑ x[n]*e^(-i*(2Π*k*n/N))
    n=0


    Basit bir uygulama yazdım sonuçları görün diye. Alttaki program yukarıdaki formülü kullanarak DFT hesaplar. Fakat bu şekilde pratikte kullanımı aşırı derecede gereksizdir çünkü çok işlem gücü ister. Bir deneme yaptım biraz önce,22 kHz de örneklenmiş 4-5 saniyelik bir ses kaydının frekans spektrumunu çıkarıyım dedim bunla, i7 işlemcili 6 GB ram olan bilgisayarım cevap veremedi
     
    % Temizlik
    clc
    clear all

    % Giris dizisi
    input = [523 176 912 349 277];

    % Sonuclarin daha belirgin olmasi icin
    % giris dizisini 2 periyot yapalım
    input = [input input];

    % Giris dizisinin boyutunu bul
    N = length(input);

    % Giris dizisiyle ayni boyutta "0" dolu dizi olustur
    X = zeros(1,N);

    % DFT hesaplanan bolum
    for k = 0:N-1
    for n = 0:N-1
    X(k+1) = X(k+1) + input(n+1) * exp((-i)*2*pi*k*(n)/N);
    end
    end

    % DFT yi cizdirelim
    subplot(2,1,1)
    manual_ft = fftshift(abs(X));
    plot(manual_ft);


    % Karsilastirmak icin, bilgisayar tarafından hesaplanan
    % Fourier Donusumunu de kendi grafigimizin hemen
    % altina cizdirelim
    automatic_ft = fftshift(abs(fft(input)));
    subplot(2,1,2)
    plot(automatic_ft);


    Sonuç :
     Fast Fourier Transform(FFT)


    Üstteki bizim DFT algoritmamız, alttaki ise MATLAB ın hesapladığı FFT algoritması. Gördüğünüz gibi hiçbir fark yok.

    Bu arada Allah kimseyi işsiz bırakmasın. Gece saat kaç olmuş üşenmeden oturup bunları yazdım.



    < Bu mesaj bu kişi tarafından değiştirildi Elektroniker -- 7 Ağustos 2012; 5:23:22 >




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • quote:

    Orijinalden alıntı: Elektroniker

    quote:

    Orijinalden alıntı: emter

    ......

    ifade etmektedir. Şimdi X[1] için hesap yapacak olursak ;
    Gerçel X[1] = x[n]cos[2pi*1*n/N]

    Buradaki n x[n] ve N ne olmalı ?

    X[1] = x[n]cos[2pi*1*n/N] değil. Toplam sembolü var orda bakın.


           
    N-1
    Xk = ∑ x[n]*cos(2Π*k*n/N)
    n=0


    N-1
    X[1] = ∑ x[n]*cos(2Π*1*n/N)
    n=0


    Buradaki n toplam sembolü üzerinden bir döngüye girecek ve x[n] dizisine indis olacak. Yani x[1], x[2], x[3] değerlerini alıcaksınız. x[n] dizisi ise giriş. Yani sizin A vektörünüz. N ise örnek sayısı. Sizin örneğinizde 5.

    Yalnız bu FFT değil DFT. Sinyalin ya da sistemin frekans tepkisini bulmak için DFT kullanılır. FFT ise DFT nin özel bir halidir.
    DFT yapısından dolayı frekans spektrumunu hesaplamak için çok sayıda gereksiz işlem yapar. Yapılan bu gereksiz işlemler bazı temel özellikler kullanılarak (periyodiklik, simetri gibi) azaltılır, yapılan işlem sayısı azaldığı için frekans spektrumu çok daha hızlı ve efektif olarak hesaplanır. İşte bu gereksiz işlemlerin atılmış haline FFT diyebilirsiniz. Farklı FFT algoritmaları vardır, araştırırsanız göreceksiniz.

    Fakat FFT yi öğrenmeden önce DFT yi öğrenmeniz gerekir. Yani işlemin nasıl yapıldığını öğrenin ki, daha efektif nasıl yapılabilir öğrenebilin. DFT en temel haliyle yukarıdaki formüllerde anlatıldığı gibidir.

    Formül şudur :

          N-1 
    Xk = ∑ x[n]*e^(-i*(2Π*k*n/N))
    n=0


    Basit bir uygulama yazdım sonuçları görün diye. Alttaki program yukarıdaki formülü kullanarak DFT hesaplar. Fakat bu şekilde pratikte kullanımı aşırı derecede gereksizdir çünkü çok işlem gücü ister. Bir deneme yaptım biraz önce,22 kHz de örneklenmiş 4-5 saniyelik bir ses kaydının frekans spektrumunu çıkarıyım dedim bunla, i7 işlemcili 6 GB ram olan bilgisayarım cevap veremedi
     
    % Temizlik
    clc
    clear all

    % Giris dizisi
    input = [523 176 912 349 277];

    % Sonuclarin daha belirgin olmasi icin
    % giris dizisini 2 periyot yapalım
    input = [input input];

    % Giris dizisinin boyutunu bul
    N = length(input);

    % Giris dizisiyle ayni boyutta "0" dolu dizi olustur
    X = zeros(1,N);

    % DFT hesaplanan bolum
    for k = 0:N-1
    for n = 0:N-1
    X(k+1) = X(k+1) + input(n+1) * exp((-i)*2*pi*k*(n)/N);
    end
    end

    % DFT yi cizdirelim
    subplot(2,1,1)
    manual_ft = fftshift(abs(X));
    plot(manual_ft);


    % Karsilastirmak icin, bilgisayar tarafından hesaplanan
    % Fourier Donusumunu de kendi grafigimizin hemen
    % altina cizdirelim
    automatic_ft = fftshift(abs(fft(input)));
    subplot(2,1,2)
    plot(automatic_ft);


    Sonuç :
     Fast Fourier Transform(FFT)


    Üstteki bizim DFT algoritmamız, alttaki ise MATLAB ın hesapladığı FFT algoritması. Gördüğünüz gibi hiçbir fark yok.

    Bu arada Allah kimseyi işsiz bırakmasın. Gece saat kaç olmuş üşenmeden oturup bunları yazdım.




    Verdiğiniz bilgiler için teşekkürler. Çok şeyi açıklığa kavuşturdum sayenizde. FFT alan c++ programını yazdım. Fakat asıl amacım mel ceptrum da. Ama onunla ilgilide bilgi toplamam lazım. Bilgisi olan arkadaşlar biraz bahsedebilir mi ?




  • FFT alabilen c sharp programı lazım..Ne yapabilirim yardımcı olabilecek olan varmı acill ??
  • Biz de şuan FFT ile uğraşıyoruz. Yaklaşık değerler neden 0 çıkıyor anlamış değilim.
  • integer mi kullanıyorsunuz? FFT'de büyüklükler logaritmik skalada olabiliyor.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.