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

Goertzel Algoritması İle DTMF Ton Tanıma

Goertzel algoritması kullanılarak telefon tuşlarının çıkardıkları sesin (dtmf) agılanması

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.

Goertzel Algoritması

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} ]:

Goertzel Algoritması İle DTMF Ton Tanıma

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

Sayfayı
Yayın tarihi: 12 Mayıs 2009 Salı, 15:59
Anahtar kelimeler: goertzel algoritması, dtmf ton tanıma

Yorum Gönder

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

 

Yorumlar (6)

hasan
Yanıtla
04 Şubat 2010 Perşembe, 23:36
#1

programı windows 7 de çalıştırmadım

Hüseyin Atasoy
Yanıtla
05 Şubat 2010 Cuma, 09:01
#2

Win7 üzerinde de denedim. Program çalışıyor. Ses seviyesini yükseltmeyi unutmuş olabilirsiniz...

ismail
Yanıtla
14 Mart 2010 Pazar, 18:58
#3

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?

Hüseyin
Yanıtla
14 Mart 2010 Pazar, 21:46
#4

"Wav Formatını Okuma, Yazma" yazısına gözatabilirsiniz. Yalnız registerden kastınızı anlamadım. Kolay gelsin...

ayşe
Yanıtla
05 Aralık 2012 Çarşamba, 21:19
#5

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ı?

Hüseyin Atasoy
Yanıtla
06 Aralık 2012 Perşembe, 22:30
#6

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.

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