Mikroişlemcileri kullanarak frekans kaydırmalı anahtarlama yöntemi ile veri iletimi konusunda internette pekçok bilgiye rastlayabilirsiniz. Ama bunu bir programlama dili aracılığıyla bilgisayar üzerinde yapmak ile ilgili belki de hiç birşey bulamayacaksınız. Saatlerce bu konuyu internette araştırmıştım. Amacım sabit hatlarda CallerID (arayanın kimliği) verisini modem olmadan tespit etmekti. Ama turktelekomun bu konuda kullandığı standartları henüz bulabilmiş değilim...
Yazının asıl konusu ve amacı, normalde modemlerde veri iletiminde veya radyo dalgalarının modülasyonunda kullanılan FSK (Frequency Shift Keying - Frekans Kaydırmalı Anahtarlama) yöntemini bilgisayar üzerinde uygulamak.
AM ve FM kısaltmalarını daha önce duymuşsunuzdur. (Radyoların üzerinde yazar) AM (Amplitude Modulation) genlik modülasyonu demektir. Veriler genlik kaydırılarak kodlanır. FM (Frequency Modulation) de frekans modülasyonu demektir.
Modülasyon, düşük frekanslı bir sinyalle, yüksek frekanslı bir başka sinyali şekillendirmektir. Şekillenen yüksek frekanslı sinyal, iletime uygun haldedir ve çok fazla mesafe katedebilir. Bu sinyale taşıyıcı sinyal denir.
FSK yöntemini bilgisayarda uygularken verileri bitler haline getirmemiz gerekir. Sinüs dalgasını da taşıyıcı dalga olarak kullanacağız. Bit 1 değerinde iken sinüsün frekansı için belli bir değer, 0 iken bir başka değer kullanmalıyız. Hazırladığım örnek programda 1 için 1200, 0 için 2800 hertzlik frekans kullandım.
1 saniyede gönderilecek bit sayısı her bitin kaç örnek ile kodlandığına bağlı. Frekansları Goertzel Algoritması ile çözeceğimiz için de her biti kodlayacak örnek sayısını yüksek tutmak hata oranını azaltacaktır. Bunları da belirledikten sonra veriyi kodlayabiliriz.
Buraya kadarki kısım çok da zor değil. Ancak asıl zor kısım alıcı ile verici arasında oluşabilecek zamanlama farkını gidermek. Çünkü FSK ile yaptığımız şey aslında saniyenin yüzde, hatta eğer istersek binde birlik kısmında bir biti kodlamak veya çözmek. Dolayısıyla meydana gelecek 0.01 saniyelik sapmalar bile verinin tamamının yanlış okunmasına sebep olur. Üstelik daha gürültü hesapta bile değil. Bunu engellemek için verinin gönderilmeye başlanacağını, demodülatöre bildirmek amacıyla başlangıç biti yollamamız gerekir. Veri iletimi yokken, 0 bitler akarken, veri gönderilmeye başlanmadan hemen önce, bir tane 1 bit kodlanarak, veri iletimine başlanacağı bildirilmelidir. Veri iletiminden sonra, sonlanma bitleri gönderilerek, veri iletiminin sonlandırılacağına işaret edilir.
Hazırladığım modülatör-demodülator programında başlangıç bitinden hemen sonra, veri boyutunun yollanmasını sağladım. Veri boyutunu sonlandırmak için de "veri okumaya başla" anlamına gelecek "B" harfinin ascii kodunun 8 bitlik ikili değerini kodladım. Böylece sonlandırıcı bit ile verinin karışma ihtimali ortadan kalkmış oldu. Örneğin 3 baytlık HUS verisini kodlayacaksak:
"....00000000000[1:başlangıçbiti][B:sekiz bit][HUS:24 bit]000000000....."
Sonuçta, modüle ettiğimiz sinüs dalgası içerisine, kodladığımız verinin pozisyonunu bulabilmemizi sağlayan işaretler yerleştirmiş oluyoruz.
Demodülasyon işleminde ise başlangıç bitini bulabilmek için başlangıç bitine rastlayana kadar, sadece birer örnek ilerlenerek, her ilerlemede örnek başına bit değeri kadar örnek işlenerek 1 bitinin aranması gerekir. Başlangıç biti bulunduktan sonra hizaya dikkat edilerek B harfinin ascii kodunu karşılayan 8 bit okunmalıdır. Hizalamaya dikkat edilmezse, hizanın bozulduğu noktadan sonraki tüm veriler yanlış okunur:
0 1 1 0 0 0 1 1 ---> Karşılık gelen bitler |-|-|-|-|-|-|-|-| ---> Yazılmış veri |-|-|-|-|-|-|-|-| ---> Okunan hatalı veri; hiza bozuk ? 1 1 0 0 0 1 1 ? ---> Hatalı okunan bitler
Program ile "Merhaba Dünya Merhaba Dünya Merhaba Dünya Merha" (1 saniyelik veri) şeklindeki veri kullanılarak modüle edilmiş sinüs dalgasını dinlemek için tıklayınız. Resimde görülen ayarlamalarla, başlangıç pozisyonu (100 örneklik, yani bir baytlık boşluk) da hesaba katılarak saniyede 377 bit kodlanabilmektedir. Teknik deyimle 377 baud hızıyla veri örneklenip, çözülebilmektedir. (Veri transferini sağlayabilmek için iki bilgisayarın ses kartlarını birbirine bağlamak gerekir. Program transfer yapmaz, modüle edilen sinüs dalgasını wav dosyasına örnekler.) Bu, bir bitin yaklaşık 2 milisaniyelik (0.002sn) süre ile gönderildiği anlamına gelir. Programı bilgisayarınıza indirmek için tıklayınız.
Örnekleme frekansı düşürülerek, dolayısıyla süre uzatılarak modüle edilmiş ses dosyasında verilerin kodlanışını daha rahat kavranabilir. Çünkü bu durumda her bitin kodlanması için gereken frekanstaki ses daha uzun süre çıkacaktır. Örnekleme frekansı 2205'e ayarlanarak modüle edilmiş olan wav dosyasını dinlemek için tıklayınız. Eğer sesi program yardımıyla demodüle etmek isterseniz, örnekleme frekansını 2205'e ayarlayınız. (Kodlanan veri:"@@@@@@@[cr+lf]Merhaba Dünya[cr+lf]&!?#$%?*", 256 bit). Dosyadaki ses dinlenerek, önce başlangıç bitlerinin ve veri boyutunun kodlandığı, sonra "@" karakterinin tekrarı sebebiyle aynı frekans dizisinin 7 kere tekrar ettiği ve daha sonra diğer verilerin kodlandığı gözlemlenebilir.
Program, Goertzel algoritmasını kullanmaktadır. Dolayısıyla, bit başına kullanılan örnek sayısı azalırsa çözümlemede başlangıç bitinin yeri yanlış tespit edilecektir. Örnekleme frekansı 44100 iken, doğru sonuç verecek minimum örnek başına bit değeri 40 olarak ölçülmüştür. Bu değerde 1024 baud hızına çıkılabilmiştir. Goertzelda dönen büyüklüğün eşikleneceği değer, ayarlara uyum sağlayabilmesi amacıyla BitBasinaOrnek*2250 olarak seçilmiştir. Bu çarpım deneme yanılma yoluyla elde edilmiş ve başarılı sonuç vermiştir.
Goertzel algoritması, her seferinde BitBaşınaÖrnek değeri kadar örnek sayısı işlemektedir. "1" biti aranırken, bu algoritmaya her adımda bu kadar örnek sağlanması gerekir. İlerlenen her adım 1 örneklik olduğundan bu işlem, veri çözümleme işlemine göre daha yavaş çalışır. Ayrıca goertzel algoritması, normalde 0 bitine ait örneklerin küçük bir kısmı ile, 1 bitine ait örneklerin bir kısmını aynı anda işlediğinde, sonuçta örnek sayısı fazla olan hangisi ise, o değeri büyük döndürecektir. Eşik değeri, bu sebeple oluşacak hizalama hatalarını büyük oranda gidermektedir. Başlangıç pozisyonunu bulmak amacı ile yapılan denemelerde, hizalama hatası, +-3 örneği geçmemektedir. Buradan, yapılacak maximum hatanın bile, çözümleme işlemine olumsuz yansımayacağı söylenebilir...
Örnekleme frekansı azaldıkça, her bit için gereksinim duyulan örnek sayısında önemli bir değişiklik olmayacağı için, belli bir boyuttaki verinin iletimi daha çok zaman alır.
Tşk. güzel yazmışsınız da acaba kaynak kod vermez misiniz olmasa da hangi kütüphaneyi kullanabiliriz (C'de). telefon sinyalini FSK demodulasyon yapıp caller id sini bulmam gerekiyor :(
Önce telefon sinyalini nasıl alacağınızı planlamalısınız. İşin en zor kısmı bu bence. Goertzel algoritması ile kodlama kısmını halledersiniz diye düşünüyorum. Sinyali alma ile ilgili size bir fikir verir diye karşılaştığım sıkıntıyı yazayım:
Yaptığım denemelerde sinyali almak için ses kartını kullanmıştım. Herşey yolunda gitti, sinyali hattan gerçek zamanlı olarak örnekleyebildim. Fakat sebebini anlayamadığım ve dolayısıyla engelleyemediğim bir cızırtı karışıyor sinyale. Dolayısıyla, demodülasyonu bir türlü sağlıklı bir şekilde yaptıramadım. Eğer bu cızırtıyı engelleyecek birşey bulursanız bana da yazarsanız sevinirim...
Merhabalar , 512 kb'lık bir dosyayı sinüslere çevirip alıcı bilgisayara 2 dakikada iletmem ve bu dosayayı alıcıya kaydetmem gerekiyor.Modulasyon için fsk kullanıyorum.Benim saniyede 5kb verilik sinusler göndermem gerek.Örnekleme olayında bu işi beceremedim.Ses çok bozuk çıkıyor ve fourier transform ile analiz doğru edemiyorum.Yardımcı olabilirmisiniz ?
512kb veriyi 2 dakikada iletmek istiyorsunuz. Bu boyut 4294967296 bite karşılık geliyor. 2 dakikada iletimin tamamlanması için saniyede 35791394,1 bit gönderebilmelisiniz. Bir bitin tek bir örnek ile simgelenemeyeceği göz önünde tutulursa bu imkansız. 1 biti 10 örnek ile simgeliyor olalım. O zaman örnekleme frekansımız yaklaşık 357913941 olmalı. Ses kartının bu hızla örnekleme yapması mümkün değil.
Özetle bir bilgisayarın ses karıtını kullanacaksanız 2 dakika çok dar bir süre. Çalışmalarınızda başarılar...
Tebrik ederim. ama bu işlerle uğraşmak için gereken zaman ve parayı nasıl buluyorsun?
Teşekkürler.
Buradaki çalışmaların büyük bir kısmını lisans öğrencisi iken yapmıştım. Maliyetli şeyler değil. Öğrenciyken bir şekilde zaman ayırabiliyorsunuz.