Telefonlarda arama yapılırken tuşların çıkardığı seslere DTMF (Dual Tone-MultiFrequency) tonları denir. Her bir dtmf tonu, sabit birer frekansı olan iki sinüzoidal dalganın toplamından meydana gelir. DTMF tonlarının tanınması, ancak sahip oldukları iki frekansın tespiti ile mümkündür.
Frekans tespiti için hızlı fourier dönüşümü kullanılabilir. Ancak sadece sekiz sabit frekanstan iki tanesinin varlığının tespiti yeterli olduğu için, tüm frekansların tespit edilmesi gerekmiyor. Belli frekansların varlığının tespit edilmesinde kullanılan başka bir algoritma daha var; goertzel algoritması. Bu algoritma ile tam bir frekans değerleri alınamasa da, verilen ses örneklerinin belli bir frekansı taşıyıp taşımadığı hızlıca tespit edilebilir.
Metot, örnek sayısına, varlığı kontrol edilecek olan frekansa, örnekleme frekansına ve tabi ses verisine, yani örneklenmiş sinyale ihtiyaç duyar. İşlem tekrarlarını önlemek için bazı sabitler en baştan hesaplanabilir:
Omega = 2 * pi * Frekans / OrneklemeOranı Sinüs = Sin(Omega) Kosinüs = Cos(Omega) Katsayi = 2 * Kosinüs
Sabitleri belirledikten sonra üç değişkene daha ihtiyacımız var. Bunlar son hesaplanan, sondan bir adım önce hesaplanan ve sondan iki adım önce hesaplanan değerleri tutacak. Bunlara sırayla Simdiki, BirÖnceki ve İkiÖnceki adlarını vermiş olalım. Bir de örnekler SesVerisi dizisinde bulunuyor olsun. Bu durumda:
i = 0 değerinden OrnekSayisi - 1 değerine kadar şunları yap: İkİÖncekiHesap = BirÖncekiHesap BirÖncekiHesap = SonHesaplanan SonHesaplanan = SesVerisi(i) + Katsayi * BirÖncekiHesap - İkİÖncekiHesap
Döngü tamamlandıktan sonra, hesaplanmayı bekleyen iki değer kalıyor. Goertzel algortiması biri gerçel diğeri sanal iki değer döndürür. Bu değerlerin karelerinin toplamının karekökü algoritmanın sonucudur.
Gercel = BirOncekiHesap - IkıOncekiHesap * Kosinus Sanal = IkıOncekiHesap * Sinus _________________ / 2 2 Sonuç = \/Gerçel +Karmaşık
Hesap tamamlamış oldu. Ancak sonuç tek başına pek bir anlam ifade etmiyor. Denediğimiz sinyaller arasından bize en büyük sonucu döndürecek frekans değeri, sesin frekansına en yakın değer olacaktır. Zaten DTMF tonlarının frekansları bellidir:
HERTZ | 1209 1336 1477 1633 ----------|-------------------------------- 697 | 1 2 3 A 770 | 4 5 6 B 852 | 7 8 9 C 941 | * 0 # D
Bu frekansların tamamı denenerek, dönen en büyük iki sonuca göre basılan tuşa karar verilir. Programımızın etraftaki gürültüden etkilenmesini önlemek için, özellikle mikrofondan ses alıyorsak iyi bir eşikleme uygulamamız başarı oranını %100 yapacaktır. Aşağıda, bu yöntemi kullanarak yazdığım program örneğinin ekran görüntüsü var. Programda Goertzel algoritması, tekleme yapmayacak ve mikrofondan alınan sesi gerçek zamanlı işleyebilecek kadar hızlı çalışıyor.
Dönen değerin, hesaplanan frekansları gösteren mavi ve kırmızı çubuklardan en büyük ikisine ait değerleri barındıran kümelerin kesişiminde yer aldığı gözlenebilir [ {1,2,3,A} kesişim {1,4,7,*} = {1} ]:
Resimdeki programı denemek isterseniz indirmek için tıklayın. Programı yanındaki dosyalarla birlikte, zipli dosyadan herhangi bir yere çıkardıktan sonra çalıştırıp ses aygıtınızı ve mikrofon kanalını seçin. Cep telefonunuzun tuşlarının ses çıkartmasını sağlayarak mikrofona iyice yaklaştırın ve tuşlara basın...
programı windows 7 de çalıştırmadım
Win7 üzerinde de denedim. Program çalışıyor. Ses seviyesini yükseltmeyi unutmuş olabilirsiniz...
Hüseyin bey benim bitirme projem var FSK demodülasyon goertzeli kullanmam gerek C ile işaret işleyip üstte yaptıgınıza benziyor. ancak ben gerçek zamanlı yapma kzorunda değilim. ses dosyasını nasıl register yapıp işleyebilirm?
"Wav Formatını Okuma, Yazma" yazısına gözatabilirsiniz. Yalnız registerden kastınızı anlamadım. Kolay gelsin...
merhaba öncelikle anlatımlarınız için çok teşekkürler, size bir şey danışmak istiyorum, kalp sesleri üzerinde ses tanıma projesi geliştireceğim ama hastalardan alacağım kalp seslerini nasıl kaydedeceğim bilemiyorum, bunun için cihazlar var ancak epey pahalı, önereceğiniz bir yöntem var mı?
Bir steteskopun kulaklıklarına giden hortumu, hortumun ikiye ayrıldığı noktanın gerisinden kesip oraya ufak bir mikrofon takarsanız, kalp seslerini bilgisayar üzerinden dinleyip kaydedebileceğinizi düşünüyorum. Zaten bilgisayarlara taktığımız harici miktofonların sesi alan asıl parçası tırnak kadar birşey. O hortuma girer herhalde.