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...
çok teşekkürler çok iyi birbilgi yazdığınız class ı sitenize ekleye bilrmisiniz
allah razıolsun allah bilginizi arttırsın
Fırsat bulur bulmaz wav okuma ve yazma ile ilgili bilgileri ayrıntılarıyla yazacağım...
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.
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ı...
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ı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...
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.
Çok teşekkür ederim, ilk denememi excelde yaptım çok işime yaradı bu yazı, tekrar teşekkür ederim :)
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..
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.
"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.
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...
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.
Keşke bunlarla uğraşacak zamanım ve yeterli birikimim olsaydı :(
Teşekkürler kaynak için...
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?
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...
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...
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.