Goertzel Algoritması İle DTMF Ton Tanıma
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 hesaplanabilir.
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:
Meşhur Frekans Tablosu :
___________________________________________
| 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...
Yayınlanma Tarihi: 12 Mayıs 2009 Salı - 15:59
Anahtar Kelimeler: dtmf, ses tonu, ses algılama, goertzel algoritması, dijital sinyal işleme
Yorumlar ( 4 )
hasan#1
04/02/2010, 23:36
programı windows 7 de çalıştırmadım
Hüseyin Atasoy#2
05/02/2010, 09:01
Win7 üzerinde de denedim. Program çalışıyor. Ses seviyesini yükseltmeyi unutmuş olabilirsiniz...
ismail#3
14/03/2010, 18:58
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#4
14/03/2010, 21:46
Aşağıdaki linkten wav dosya formatının nasıl okunabileceğiyle ilgili yazdığım yazıya ulaşabilirsiniz. Yalnız registerden kastınızı anlamadım. Kolay gelsin...
http://www.atasoyweb.net/blog/ses-isleme-k7s0/wav-formatini-okuma-yazma-y75.html
Yorum/Görüş Bildir