AtasoyWeb - Hüseyin Atasoy
AtasoyWeb
Hüseyin Atasoy'un Programlama Günlüğü

Hızlı Fourier Dönüşümü ve Frekans Ölçme

Hızlı fourier dönüşümü (fast fourier transform) ile bir sinyalin frekansı nasıl ölçülür?
Frekans Spektrumu

Hızlı fourier dönüşümü bir sinyalin sahip olduğu frekansların ölçülebilmesini sağladığı için sinyal işlemede sıkça kullanılır. Bu dönüşüm, fourier dönüşümünün özel bir halidir:

     N-1       -i*(2π*k*n/N)
Xk =  ∑  x[n]*e
     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ğin indisini temsil eder.

eix ifadesi için aşağıdaki eşitlik geçerlidir:

 ix
e   = cosx+isinx

Bu eşitliği doğrulayalım. ex ifadesinin açılımı:

                   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!

i2=-1, i3=-i, ve i4=1 olmak üzere i'nin kuvvetlerini yerlerine yazalım:

                     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. (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 böylece eşitliği doğrulamış olduk:

 -ix
e    = cosx-isinx

Yukarıdaki ifadeyi kullanarak hızlı fourier dönüşümünü yeniden yazıp sanal (i ile çarpılan) ve gerçel ifadeleri ayıralım:

            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. Bu vektörler kullanılarak skaler frekans değerleri elde edilmek istendiğinde öncelikle her bir vektörün boyu hesaplanır:

       _________________________
      /          2            2
Xk = √(Gerçel Xk) + (Sanal Xk)

x(k) her zaman pozitiftir. Gerçek frekans değeri, k değerinin frekans çözünürlüğü ile çarpımı sonucunda elde edilir. Frekans çözünürlüğü örnekleme frekansının (SR), örnek sayısına(N) oranıdır.

     k*SR
F = ------
      N

X(k) değerinin sıfırdan büyük oluşu, sinyalde F frekanslı dalgalanmalar bulunduğu anlamına gelir.

k değeri N-1 değerine ulaştırıldığında ve X dizisinin elemanları grafiğe döküldüğünde, 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-1) büyük alınmaz, en çok N/2-1 değerinde olur. k maximum değerinde iken yerine yazılırsa:

     N*SR     SR
F = ------ = ----
     2*N      2

Bu genel bir kuraldır; bir sinyalin frekansı, örnekleme frekansının yarısından büyük olamaz. Daha doğrusu bir sinyal, sahip olduğu en yüksek frekans değerinin en az 2 katı kadar örnekleme frekansı ile örneklenmelidir. Aksi halde sinyal, örnekleme frekansının yarısını aşan frekans değerlerinin tümünü kaybeder...

Yazar: Hüseyin Atasoy
Posted: 13/05/2009 09:33
Keywords: hızlı fourier dönüşümü, frekans ölçme, fast fourier transform, fft

Leave Comment

 
You are replying to comment #-1. Click here if you want to cancel replying.

 

Comments (20)

Cemal
Reply
15/11/2009 12:47
#1

ç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
Reply
15/11/2009 14:41
#2

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

Mehmet
Reply
15/12/2009 04:15
#3

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
Reply
18/12/2009 20:08
#4

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
Reply
20/12/2009 00:54
#5

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
Reply
20/12/2009 09:27
#6

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
Reply
20/12/2009 16:40
#7

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
Reply
20/12/2009 17:00
#8

Evet aynen öyle :) ...

Ahmet
Reply
25/01/2010 23:31
#9

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

Aydın
Reply
17/03/2010 10:17
#10

Merhaba hüseyin Bey bu FFT  algoritması ampermetre voltmetre gibi uygulamalarda kullanılabilirmi ..bir fikir verirseniz sevinirim..FFT algoritmasını tam olarak anlamış deilim açıkçası mantığını anlatabilecek bi  yazı yayınlarsanız minnettar olurum iyi çalışmalar..

Hüseyin Atasoy
Reply
17/03/2010 17:49
#11

Konunun yukarıda anlattıklarımın da derinindeki matematiksel altyapısı konusunda ben de pek bilgi sahibi değilim. Ama bildiğim kadarıyla FFTnin elektronikte de uygulama alanları var.

serdarkoylu
Reply
17/09/2010 11:18
#12

"SES TANIMA" ile ne kastettiğinizi anlamakta sorun yaşadım kısacası. FFT gibi şeyler bir takım işlevler için kullanılabilir ve analog veya dijital olarak bolca da kullanılıyor zaten. Peki sizin amacınız tam olarak ne? Ses tanımadan kasıt konuşmayı algılama ise örneğin, FFT işin başında sesi çevredeki gürültüden ayırmak üzere kullanılabilir. Fakat kelimeleri vs. ayırtetmek için FFT pek işe yaramaz. Yani 1777 HZ'lik bir ses sinyalinin varlığı, konuşma babında bir anlam ifade etmez. FFT ile seçilen örnekleri işlemek için ortaya bir sürü karışık şey çıkar.
Eğer ses tanıma derken tam olarak neyi kastettiğinizi daha iyi ifade ederseniz, daha kolay yol gösterilebilir sanıyorum.

Birde mümkünse, bu gibi bir geliştirme süreci için blog yerine forum tarzı bir şey, insanların katkı sağlayabileceği bir ortam daha kullanışlı olacaktır.

Hüseyin Atasoy
Reply
17/09/2010 11:50
#13

Sanırım son paragrafa takıldınız :). Bu sadece basit bir fikir idi. Tabi ki ses tanıma sadece frekans tespiti ve eşleştirmesinden ibaret değil. Frekans tespiti atılması gereken adımlardan sadece biri, ses tanımayla ilgili okuduğum bütün makalelerde fourier dönüşümü hep vardı.

Ses tanıma çok genel bir kavram. Derine inildiğinde konuşmacı tanıma, konuşmacıdan bağımsız ayrık/sürekli kelime/hece tanıma gibi pek çok kola ayrılır. Daha da derine inildiğindeyse bunların da ötesinde doğal dil işleme tekniklerine de ihtiyaç duyulduğu görülür. Ama frekans ses için ayırt edici ve ölçülebilir bir nitelik olduğu için genel anlamda ses tanıma işlemlerinin bir parçası...

Bu türden konuların tartışılacağı, bu konulara merak duyan insanların birikimlerini paylaşıp birlikte birşeyler yapmaya gayret edecekleri bir forum ortamının olması gerçekten güzel olurdu. Ama katılım konusunda şüphelerim var. Denemek lazım aslında...

serdarkoylu
Reply
17/09/2010 15:18
#14

Bazen, heleki böyle konularda, nicelik önemsizdir. Katılımın çok olması arzu edilse de, az olması kaygılanılacak şey değil bence.
Signal gürültü oranını düşük tutmak için sadece konuşmayı alacak bir filtre elbette olmazsa olmaz. Fakat, ses tanıma için bu amaçla FFT'den daha farklı şeylerde mevcut. Webster denklemleri filan gibi.
Bakmayın, bende bu işten çok anlarmış gibi konuşuyorum. Size en iyisini bir kaynak önereyim, sanırım ilginizi çekecektir:

Mathematical Models of Speech Technology,Stephen E. Levinson., Wiley 2005.
Spoken Language Processing, A Guide to Theory, Algorithm and System Development, Xuedong Huang, Alex Acero, Hsiao-Wuen Hon, Prentice-Hall 2001

İlk kitap bu işte kullanılan algoritmaları izah etmeye çalışıyor. Ağız dil, dudak vs. matematik modelinden başlayıp öyle devam edip gidiyor. Diğeri ise, biraz daha pratiğe yönelik, recognition, search vs. gibi işlevleri ön plana alıyor.

Hüseyin Atasoy
Reply
18/09/2010 12:24
#15

Keşke bunlarla uğraşacak zamanım ve yeterli birikimim olsaydı :(
Teşekkürler kaynak için...

dilay
Reply
23/05/2011 17:54
#16

Cok tesekkurler, yaziniz cok yararli oldu. Yalniz bir sorum olacak. Uzerinde calistigim matlab komutlarinin FFT kismini asagiya da kopyaladim. Aklima takilan sey su: yukarida belirttigniz k degeri, fourier donusumu sonucunda elde ettigimiz vektorun boyutu mudur?  eger oyleyse X'in boyutu N'e bagli oluyor, yani N kadar noktada hesap yapilip degerler ataniyor ve bu nedenle de k sayisi her zaman N'e esit oluyor.  Yanlis bir yorumlama mi yapiyorum acaba? Yardimci olursaniz cok sevinirim. 

nfft = 2^(nextpow2(length(t1))-1); % N: the number of points
fs = 10000;  %% sample rate [Hz]
X = abs(fft(t1, nfft)); %% FFT
fr = (1:length(X))*fs/nfft); % % real frequency?

Hüseyin Atasoy
Reply
24/05/2011 11:32
#17

k sabit bir değer değil, 0dan N/2-1 aralığında değerler alan bir tamsayı. k'yı veren denklemi yazmamın sebebi k'nın N/2den sonra hesaplanmasına gerek kalmadığını göstermekti.
Özetle k frekansları tutacak dizinin indisidir...

Fikret Aysel
Reply
29/05/2016 23:27
#18

Arkadaşlar Matlab Konuşmacı tanıma örneğini aşağıdaki linkten inceleyebilirsiniz..
https://www.youtube.com/watch?v=-7uNsGSJ_LE
İyi Çalışmalar...

Dolphy
Reply
14/06/2016 07:59
#19

Google da FFT nin ne olduğunu ararken buldum burayı, sene 2016 olmuş ben yeni keşfediyorum. Burada çok şey var, eline sağlık. Ben liseyi yeni bitirdim öğrenmek istediğim bazınlarından bihaber olduğum konular burada. Şimdilik hedefim javada sesin frekanslarını elde etmek ve mobile taşımak.

Hüseyin Atasoy
Reply
24/06/2016 08:25
#20

Teşekkür ederim. Başarılar...

 
Şu an bu sayfada 1, blog genelinde 1 çevrimiçi ziyaretçi bulunuyor. Ziyaretçiler bugün toplam 404 sayfa görüntüledi.
 
Sayfa 63 sorgu ile 0.227 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2024 Hüseyin Atasoy