AtasoyWeb - Hüseyin Atasoy
AtasoyWeb
Hüseyin Atasoy

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

Yazar: Hüseyin Atasoy
Yayın tarihi: 12/05/2009 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 (8)

hasan
Yanıtla
05/02/2010 00:36
#1

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

Hüseyin Atasoy
Yanıtla
05/02/2010 10:01
#2

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

ismail
Yanıtla
14/03/2010 19: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/03/2010 22:46
#4

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

ayşe
Yanıtla
05/12/2012 22: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/12/2012 23: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.

Mehmet
Yanıtla
07/12/2023 12:08
#7

Hocam merhaba,
Öncelikle verdiğiniz bilgilerden dolayı teşekkür ederim algoritmayı çalıştırdığımda tuş sesi harici sesleride alıyor bunu engellemenin bir yolu varmı? Bir de girilen sayılar hemen gidiyor bunu yana kaydetmek için ne yapmalıyım yapılabilir mi?
Geliştirme yapacağım da kaynak kodlarını almam mümkün mü?
Yeniden verdiğiniz bilgilerden dolayı teşekkür ederim.
Hoşçakalın

Hüseyin Atasoy
Yanıtla
08/12/2023 08:19
#8

Merhaba,
Tuş harici sesleri algılaması normal ama çevreden gelen seslerde bir dtmf tonunun frekans ikilisinin ikisinin de yüksek olma ihtimali düşük olacağı için tuşların algılanmasına çok fazla etki etmemesi lazım.
Program oldukça eski olduğu için kaynak kodları yok malesef.
İyi çalışmalar.

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