Bir bilgisayar mühendisi için programlama dili, öğrendiklerini sınadığı, deneyler yaptığı bir laboratuardır ve mühendisler deneylerini, kestiremedikleri sonuçları gözlemlemek için değil, öngördükleri sonuçları doğrulamak için yapar...

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 herbir 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...

Sayfayı
Yayın tarihi: 13 Mayıs 2009 Çarşamba, 09:33
Anahtar kelimeler: hızlı fourier dönüşümü, frekans ölçme, fast fourier transform, fft

Yorum Gönder

 
Yorumunuzu -1. yoruma yanıt olarak gönderiyorsunuz. Yanıtlamayı iptal etmek için buraya tıklayabilirsiniz.

 

Yorumlar (20)

Cemal
Yanıtla
15 Kasım 2009 Pazar, 11: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
Yanıtla
15 Kasım 2009 Pazar, 13:41
#2

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

Mehmet
Yanıtla
15 Aralık 2009 Salı, 03: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
Yanıtla
18 Aralık 2009 Cuma, 19: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
Yanıtla
19 Aralık 2009 Cumartesi, 23: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
Yanıtla
20 Aralık 2009 Pazar, 08: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
Yanıtla
20 Aralık 2009 Pazar, 15: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
Yanıtla
20 Aralık 2009 Pazar, 16:00
#8

Evet aynen öyle :) ...

Ahmet
Yanıtla
25 Ocak 2010 Pazartesi, 22: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
Yanıtla
17 Mart 2010 Çarşamba, 09: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
Yanıtla
17 Mart 2010 Çarşamba, 16: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
Yanıtla
17 Eylül 2010 Cuma, 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
Yanıtla
17 Eylül 2010 Cuma, 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
Yanıtla
17 Eylül 2010 Cuma, 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
Yanıtla
18 Eylül 2010 Cumartesi, 12:24
#15

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

dilay
Yanıtla
23 Mayıs 2011 Pazartesi, 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
Yanıtla
24 Mayıs 2011 Salı, 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
Yanıtla
29 Mayıs 2016 Pazar, 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
Yanıtla
14 Haziran 2016 Salı, 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
Yanıtla
24 Haziran 2016 Cuma, 08:25
#20

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

 
 
Sayfa 56 sorgu ile 0.052 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2017 Hüseyin Atasoy