Hata Bildir | Dosya Deposu | Anketler | Hakkında | İletişim | Sık Kullanılanlara Ekle
Tema Seçim Sayfası
Anasayfa > Dijital Sinyal İşleme > Hızlı Fourier Dönüşümü Ve Frekans Ölçme


Programlama Günlüğü

Bir Bilgisayar Mühendisi İçin Programlama Dili, Öğrendiklerini Sınadığı, Deneyler Yaptığı Bir Labaratuardır. Ve Mühendisler Deneylerini, Kestiremedikleri Sonuçları Gözlemlemek İçin Değil, Öngördükleri Sonuçları Doğrulamak İçin Yaparlar...
  Hızlı Fourier Dönüşümü Ve Frekans Ölçme

   Fourier dönüşüm formülleri matematikte ve fizikte de sıkça kullanılan önemli formüller. Bu formüllerinin şimdilik bizi ilgilendiren kısmı; belirli bir sinyale ait örneklerin, frekans tepkilerini ölçmeye ve frekans spektrumunu çıkartmaya yaraması. Bu formüller sesin en ayırt edici özelliklerinden biri frekans olduğundan, ses tanımada kullanılabilir. Fourier dönüşümleri bir dalganın genlik-zaman verilerini, frekans verilerine çevirir. Fourier'dan türemiş çeşitli yöntemler var, bu yazı FFT(Fast Fourier Transform) ile ilgili olacak.
  
   Aslında bu kategorideki ilk yazıda da değinmiştim, yine tekrar edelim. Frekans bir saniyede, tekrarlanma sayısıdır. Sinüsoidal bir dalga düşünüldüğünde, dalganın frekansı, bu dalganın bir saniyelik sinyalinin, örnekleri ile çizilecek grafikte bulunan tepe sayısıdır.

Frekans Spektrumu

   Yukarda, sabit frekanslarla üretilen sinüsoidal dalga, örneklenip wav dosyasına yazılmıştır. Daha sonra, genlik-zaman grafiği çizilmiş ve FFT kullanılarak, frekans spektrumu elde edilmiştir. Burada spektrum, yatayda frekansı göstermektedir. En soldaki değer sıfır hertz, en sağdaki değer de, ÖrneklemeOranı/2 hertztir. Yazının ileriki kısımlarında sebeplerini de okuyabilirsiniz...
  
   Artık Fourier dönüşüm formülünü de görelim. Genel formül şöyledir:         N-1
   Xk = x[n]*e-i*(2Π/N)*k*n
         n=0
   Burada k, sırası gelen frekans elemanını, N örnek sayısını, i karekök(-1) değerini, x() örneklenmiş sinyal verisini, n işlenmeyi bekleyen sıradaki örneği temsil eder. Kullanılan bir eşitlik daha vardır:    eix = cosx+isinx
   Bu eşitliğin ispatını da yapalım. e sayısının Taylor seri açılımı şöyledir:
                       2       3             n
     x        x       x       x             x
    e = 1 + ----- + ----- + ----- + ... + -----
              1!      2!      3!            n!

   x yerine ix değerini yazalım:
                          2       3             n
     ix        ix     (ix)    (ix)          (ix)
    e  = 1 + ----- + ----- + ----- + ... + -----
               1!      2!      3!            n!

   i'nin kuvvetlerini yerlerine yazalım:
     2         3         4
    i = -1    i = -i    i = 1

                         2        3       4
     ix         x       x        x       x
    e  = 1 + i----- - ----- - i----- + ----- ...
                1!      2!       3!      4!

   i çarpanlarına sahip terimleri i parantezine alıp ayrı iki toplam yazalım:
                2       4       6
     ix        x       x       x
    e  = 1 - ----- + ----- - ----- ...
               2!      4!      6!
 
               3       5       7
        /     x       x       x     \
    + i(x - ----- + ----- - ----- ...) = cosx-isinx
        \     3!      5!      7!    /

   Son durumda, x yerine (-x) yazılırsa, bildiğiniz gibi cos eksiyi yutar, sin dışarı atar.(İspatı, sinüs ve cosinüsün seri açılımlarında açıkça görülebilir. Cosinüs, terimlerinde çift kuvvetlere sahip olduğundan eksiyi yutar. Sinüste ise terimler, eksi parantezine alınır.) Ve asıl aradığımız eşitliğe de ulaşmış olduk:
    -ix
    e  =cosx-isinx

   İfade iki farklı toplam şeklinde yazılabilir. Bunlardan biri gerçel sayıları, diğeri sanal sayıları ayrı ayrı toplar.
                N-1
   Gerçel Xk = x[n]*cos(2Π/N)*k*n
                n=0
                N-1
   Gerçel Xk = x[n]*(-sin(2Π/N))*k*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

   İşte bu değer bize, sinyalin k hertzlik frekansa tepkisini gösterecektir. x(k) her zaman pozitiftir. Bu değere bir eşikleme uygulanarak tam frekans değerine erişmek için, k sayısı elde edilebilir. Ya da çizilecek frekans spektrumunda yerel maximum noktalar tespit edilerek, frekans belirtebilecek k değerlerine erişilebilir. Gerçek frekans, k değerin frekans çözünürlüğü ile çarpımı sonucunda elde edilir. Frekans çözünürlüğü örnekleme oranının, örnek sayısına oranıdır.:
         k*SR
    F = ------
          N

   k burada X dizisinin indisidir. X, frekans tepkilerini tutan dizidir. SR örnekleme oranı(SampleRate)dır. k değeri N değerine ulaşırsa ve X dizisinin elemanları grafiğe dökülürse, grafiğin tam ortadan simetrik olduğu görülecektir. Bu yüzden k sayısı örnek sayısının yarısından(N/2) büyük değerler almaz. Bu durumda k en çok N/2 değerinde olur. k maximum değerinde iken yerine yazılırsa :
         N*SR     SR
    F = ------ = ----
         2*N       2

eşitliği elde edilir. Bu genel bir kuraldır; frekans, örnekleme oranın yarısından büyük olamaz. Bu eşitlik şunu da gösterir; frekans çözünürlüğü 1 değilken, frekans bulmada hata oluşabilir. En sağlıklı ölçüm için, en azından örnekleme oranı kadar örnek sayısı alınmasında fayda vardır.(en az 1 saniyelik veri). Hatta örnekleme oranı, örnek sayısına eşit seçilirse bölüm halinde bulunduklarından, birbirlerini yok ederler ve frekans değeri k değerinin kendisi olur. Böylece frekans çözünürlüğü ile fazlaca ilgilenilmesine gerek kalmaz...
         F*N
    k = ------
          SR

   Bu eşitlik te şunu gösterir; k değeri elde edilirken, frekans çözünürlüğünün birin üstünde olması durumunda, hesaplanacak frekans çözünürlüğün katlarıdır. Bunu önlemek için N ve SR değerlerine birbirleri ile sadeleşecek şekilde değerler verilmesi önemlidir. k bir tamsayı olmalıdır ki, asıl hesaplanan frekans değeri tam bir sonuç versin. Yani çözünürlük birden büyükse ve F*N ile SR aralarında asal ise FFT yaklaşık sonuç döndürecektir:

F*N ile SR aralarında asal ise FFT yaklaşık bir sonuç döndürecektir.

   Yukardaki örnekte, çözünürlük 100 hertz, bu durumda dönecek frekans değerleri de çözünürlüğün katıdır. Bu yüzden, çözünürlüğün 1 seçilemesi(örnekleme oranı = örnek sayısı) uygundur.

   FFT adına rağmen işlemciyi oldukça yoran bir algoritma. Cd kalitesinde (44100 hertzlik örnekleme oranında), 1 saniyelik ses verisini(44100 tane örneği) bu algoritmayla işleme tabi tutmak, toplamda 972405000 adımlık içiçe döngülerin tamamlanmasını beklemeye razı olmak demek.(N örnek sayısı iken, adım sayısı=N*N/2) Üstelik herbir adımda tek işlem yapılmadığını göz önünde bulundurursak, yöntemin yavaşlığı daha iyi anlaşılır.

   Örnek sayısı azaltılarak hızda büyük bir artış sağlanabilir. Üstelik örnek sayısındaki azalma, ses tanıma amacıyla oluşturulacak bir programda avantaj sağlayabilir. Çünkü örnek sayısı azalınca, yukarıda da yazdığım gibi dönecek frekans, çözünürlüğün katlarına yuvarlanır. Böylece farklı zamanlarda aynı kaynaktan çıkan benzer seslerin aralarında oluşabilecek küçük frekans farklılıkları, frekanslar aynı değerlere yuvarlanacakları için yoksayılmış olur. Belli bir eşik değerin üstüne çıkabilmiş büyüklüğe ait frekans değerleri kaydedilerek saklanabilir, daha sonra da kayıtlı frekans değerleri ile gerçek zamanlı karşılaştırma yapılarak ses tanıma ya da eşleştirme yapılabilir...
 
Okunma Sayısı: 1759
Yayınlanma Tarihi: 13 Mayıs 2009 Çarşamba - 09:33
Anahtar Kelimeler: fourier, transform, frekans, tepkisi, ölçümleri, e üzeri ix, sanal, dijital sinyal işleme, fast, hızlı fourier dönüşümü

Yorumlar ( 13 )

Hakan
#1


VBde nasıl wav dosyalarını okutuyorsunuz, kullandığınız ocx veya dll dosyasını da paylaşsaydınız çok iyi olurdu...
Hüseyin Atasoy
#2


Ocx veya dll kullanmadım, onun için ayrı bir class yazmıştım. Onu da bir ara bu kategoriye eklerim...
MUSTAFA
#3


iyi çalışmalar diliyorum,
verdiğiniz bilgilerden dolayı.
genliği 0-10 v Arasında 500 HZ frekansında, örnekleme oranı (sample rate)= 10000 Hz ve örnekleme sayısı = 10000 olan bir sinüs sinyali üretiyorum. Bunu low pass filtreden geçirim FFT sini aldığımda X ekseni 0 ile 5000 Hz arasında olan ve 500 Hz noktasında peak yapmış spectrum grafiğini buluyorum.Bu noktaya kadar FFT 'nin vermiş olduğu tepki normal.Fakat Sinyalin magnitude(genlik) değeri kaynak sinyalde 0 ile 10 V iken Fourier transform da 0 ile -350 değerine kadar düşüyor.Ayrıca Sinyalin 500 Hz frekansdaki yani peak yaptığı noktadaki genliği ise -12.0 seviyelerin de. Kaynak sinyalin genliğinden çok farklı noktalarda çıkmaktadır.BUnun sebebi nedir acaba.

Teşekkür ediyorum.
Mustafa
Hüseyin Atasoy
#4


Öncelikle ben de iyi çalışmalar diliyorum...
FFTniz tam olması gerektiği gibi işlemiş. FFTnin amacı zaten frekans tepkisini bulmak. Fourier dönüşümü sonucunda bulduğunuz genlik değerleri örnek sayısına bağlı. Ama bu fft sonucunda elde edilen verilerin genlik karşılıklarının, sinyalin genliğinden bağımsız olduğu anlamına gelmez. Sinyalin genliği arttıkça fft sonucunda elde edilen genlik değerlerinde bir değişim olacaktır, çünkü bu iki değer orantılıdır. Bu değişimi, frekansı değiştirmeden sadece genlik değeri ile oynayarak gözlemleyebilirsiniz.
Uzun lafın kısası elde edilen genlik değerleri, eğer düşük genlikli gürültüleri giderme amacıyla herhangi bir değer ile eşiklenmeyecekse işinize yarayabilecek bir değer değil. Zaten fftnin amacı sinyallerin frekansları ile ilgili bilgi sağlamak...
Cemal
#5

15/11/2009, 11:47

çok teşekkürler çok iyi birbilgi yazdığınız class ı sitenize ekleye bilrmisiniz
allah razıolsun allah bilginizi arttırsın
Hüseyin Atasoy
#6

15/11/2009, 13:41

Fırsat bulur bulmaz wav okuma ve yazma ile ilgili bilgileri ayrıntılarıyla yazacağım...
Mehmet
#7

15/12/2009, 03:15

Verdiğiniz bilgiler için çok teşekkürler.Yukarıda gösterdiğiniz fft frekans tespit programını upload edebilir misiniz?Birde bu tespit edilen frekansları nasıl kullanıyoruz Goertzel Algoritması ile mi?Mesela 4 adet en yüksek genlikli frekans elde etmişsek bunları nasıl işleme tabi tutacağız bu konuda aydınlatırsanız çok sevinirim.
Hüseyin Atasoy
#8

18/12/2009, 19:08

Sanırım ne sormak istediğinizi pek anlamadım. Frekans tesbiti ses tanıma, frekans demodülasyonu gibi çeşitli amaçlarla kullanılabilir. Goertzel algoritması ise frekansların kullanılması için düşünülmüş bir yöntem değil. Bu algoritma fftye alternatif olarak kullanılır. Goertzel algoritması, kendisine verilen frekans değerinin sinyalde bulunup bulunmadığına bakarken FFT sıfırdan örnekleme frekansının yarısına kadar olan değerlerde, sinyalin sahip olduğu frekansları tespit eder. Son olarak 4 adet frekans tespit etmiş olmanız, sinyale ait ayırt edici bir bilgi elde etmiş olmanız anlamına gelir. Bu bilgiyi nerede kulanacağınız ise amacınıza bağlı...
Mehmet
#9

19/12/2009, 23:54

Teşekkür ederim ilginiz için ben o bulduğum frekansları ses tanıma işleminde kullanmak istiyorum o frekansları nasıl kullanabilirim sormak istediğim buydu.
Hüseyin Atasoy
#10

20/12/2009, 08:27

Hımm anladım şimdi, bu iş gerçekten zor. Ben de şu an ses tanıma üzerinde çalışıyorum. Elde ettiğiniz frekanslar direkt olarak ses tanıma için kullanılamaz. Kaba hatlarıyla ses tanımada şu adımlar izlenir:
- Sesin başladığı ve bittiği anın tesbiti
- Pencereleme ile spektral sızıntının azaltılması ve sesin küçük, daha işlenebilir pencerelere ayrılması
- Elde edilen pencerelerin frekans spektrumlarının elde edilmesi
- Her pencere için öznitelik vektörlerinin elde edilmesi
- Öznitelik vektörlerinin veritabanındakilerle karşılaştırılması ve puanlama
- Eşik puan değeri ile karşılaştırma ve karar kılma
Daha değişik yöntemlerde var, bu şu an üzerinde çalıştığım yöntem. Bu yöntemlerle ilgili adımları attıkça bloga yazıyorum zaten...
Mehmet
#11

20/12/2009, 15:40

Teşekkürler bu konuda aydınlandım biraz.fft sadece tanımada kullanılan adımlardan biri bu konuda ciddi çalışmak lazım ufak araştırmalarla yapılacak bişey değil anlaşılan.
Hüseyin Atasoy
#12

20/12/2009, 16:00

Evet aynen öyle :) ...
Ahmet
#13

25/01/2010, 22:31

Çok teşekkür ederim, ilk denememi excelde yaptım çok işime yaradı bu yazı, tekrar teşekkür ederim :)

Yorum/Görüş Bildir

Yorumları html kodu veya özel karakter kullanmadan, yazım kurallarına
dikkat ederek ve düzgün bir Türkçe kullanarak yazalım...
    Atasoy Blog v2.7 © 2009-2010 Hüseyin Atasoy | Tema Tasarımı: AtasoyWeb
Rss Besleme | Yukarı Çık