Bir Bilgisayar Mühendisi İçin Programlama Dili, Öğrendiklerini Sınadığı, Deneyler Yaptığı Bir Labaratuardır. Ve Mühendisler Deneylerini, Kestiremedikleri Sonuçları Gözlemlemek İçin Değil, Öngördükleri Sonuçları Doğrulamak İçin Yaparlar...
  Goertzel Algoritması İle DTMF Ton Tanıma
   Ton algılama bazı sistemlerde kullanılan, sesin frekansının algılama yöntemlerine dayalı bir çeşit ses yorumlama yöntemi. Bu algoritmayı kullanarak ses tanıma işine de adım atmış olacağız.

   Dtmf tonları, telefonların rakam tuşlarına basınca çıkan ses tonlarıdır. Yukarıda da söylediğim gibi bunları algılayıp yorumlamak, sesin frekansını algılamaya dayanıyor. Bunun için, Fourier Transform metodundan türemiş çeşitli yöntemleri var. Ancak hızlı fourier dönüşümü(Fast Fourier Transform) yöntemiyle yapmaya çalıştığım ses frekans algılama programı, oldukça ağır çalıştı. O kadar ki program, ancak 3-4 saniyede bir kere cevap veriyor ve onda da topu topuna 4410 örnek işleyebilmiş oluyor. Bu da, seçtiğim örnekleme oranı 44100 olduğu için, programın saniyenin onda birlik bölümü içinde yapılması gereken bir işin 3-4 saniyede yapılabilmesi demek oluyor. Gerçek zamanlı(realtime) olarak sesin bu şekilde işlenemeyeceği açık. Ayrıca bu metodta şöyle bir şey gözlemledim; örneklenmiş bir frekansın FFT algoritması ile doğru şeklilde hesaplanabilmesi için, örnekleme oranının en az bu frekansın iki katından büyük olması gerekir. Aksi halde FFT doğru sonuç vermiyor. (Hatta bu durumda sonuç, gerçekfrekans-(gerçekfrekans mod (örneklemeoranı/2)) olmuştu. Sanki sınırdan yansıyıp geri dönüyor gibi...) Sonuçta FFT'nin gerçek zamanlı ses işleme işlemlerinde kullanılabilmesi için galiba daha da hızlandırılması lazım. (Fast FT'ye daha da hızlandırılırsa UltraFast FT mi derler artık bilemem) Ya da hız sorun benden de kaynaklanıyor olabilir tabi.(Bu yazıyı yazdığımda pencereleme fonksiyonlarını bilmiyordum)

   Herneyse kısacası başka bir metod denememiz lazım. Dr. Gerald Goertzel diye bir adam tarafından geliştirilmiş Goertzel algoritması, işte tam bu tür işler için. Goertzel, FFT'ye göre kat kat daha hızlı bir algoritma. Tam bir frekans değeri döndürmese de verilen ses örneklerinin frekansı hakkında yeterli bilgi edinilebilmesine yetiyor. İşte bu yöntemi kullanarak nasıl ton algılanabileceğini yazacağım.

   En öncelikli olarak fonksiyonun işleyeceği paramatrelerin ne olması gerektiğine karar verelim. Fonksiyon, örnek sayısına, kontrol edilecek frekansa, örnekleme oranına(SampleRate) ve tabi ses verisine yani örneklenmiş sinyale ihtiyaç duyar.

   Sırada hesaplanması gereken sabitler var:
   Omega = 2 * pi * Frekans / OrneklemeOranı
   Sinüs = Sin(Omega)
   Kosinüs = Cos(Omega)
   Katsayi = 2 * Kosinüs

   Bu katsayılar hesaplandıktan sonra üç değişkene daha ihtiyacımız var. Bunlar son hesaplanan, sondan bir önce hesaplanan ve sondan iki ö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 kurulacak döngü şöyle :
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. Ve geriye yapılacak son bir iş kalıyor. Dijital sinyal işlemede, sanal değerler genelde aşağıdaki işlemle kullanılır hale getirilir :
   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 sinyalleri 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.  Bu arada 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. Bu yöntemi kullanarak aşağıda vb ile 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. Programda dönen değerin, hesaplanan frekansları gösteren mavi ve kırmızı çubuklardan en büyük ikisine ait değerlerin kesişim kümesi olduğu gözlenebilir [ {1,2,3,A} kesişim {1,4,7,*} = {1} ] :

Goertzel Algoritması İle DTMF Ton Tanıma

   Resimdeki programı denemek isterseniz programı indirmek için tıklayın. Programı yanındaki dosylarla 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...
 
Okunma Sayısı: 1258
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
Yorumları html kodu veya özel karakter kullanmadan, yazım kurallarına
dikkat ederek ve düzgün bir Türkçe kullanarak yazalım...
 
    Atasoy Blog v3.0 © 2009-2010 Hüseyin Atasoy | Tema Tasarımı: Hüseyin Atasoy
AtasoyWeb 1 yaşında, bu tema benden ona doğum günü hediyesi :)    
Programlama Günlüğü > Dijital Sinyal İşleme > Ses İşleme > Goertzel Algoritması İle DTMF Ton Tanıma
Menü