Saya mencoba mengirimkan data biner dari satu perangkat ke perangkat lain melalui saluran audio (speaker / mic). Saya menggunakan AFSK (Audio Frequency Shift Keying) seperti dalam Packet Radio, dengan dan dua frekuensi f m a r k = 1200 Hz dan f s p a c e = 2200 Hz . Saya bermain-main sedikit di Ruby dan implementasi pertama saya hanya meniru demodulator tidak koheren klasik, yang berfungsi dengan baik, sejauh ini.
Masalahnya adalah, saya mencoba port ini ke platform mobile di mana kinerja menjadi perhatian dan solusi saya saat ini terlalu lambat. Saya telah menemukan banyak cara untuk mendemodulasi AFSK dalam perangkat lunak:
- Sliding DFT (FFT)
- Sliding Görtzel Filter
- Fase Terkunci Loop
- Zero Crossing
Apa yang akan menjadi cara untuk pergi? Ada terlalu banyak opsi untuk dipilih. Saya yakin ada lebih banyak opsi yang tersedia. Mungkin ada solusi yang lebih baik daripada yang saya sebutkan di atas? Apakah ada yang punya contoh kode untuk saya? Saya khawatir
- Kinerja (harus dijalankan pada Platform seluler, katakanlah perangkat iOS atau Android)
- Stabilitas (harus mampu menangani beberapa kebisingan)
Setiap saran dan petunjuk sangat dihargai!
sumber
Jawaban:
Saya pikir Anda bisa mendapatkan kinerja terbaik dalam hal demodulator bit-error rate (BER) dengan loop fase-terkunci. Anda harus cepat. Saya pikir taruhan terbaik Anda untuk algoritma cepat yang masih berkinerja cukup baik adalah zero crossing.
Sebagai catatan, saya ingin menyarankan Anda mengubah 2200 Hz menjadi 2400 Hz. Implementasi naif skema 1200/2200 Hz akan menghasilkan diskontinuitas, seperti terlihat sekitar dua pertiga ke dalam plot di bawah ini, di mana 2200 Hz transisi ke 1200 Hz.
Untuk meminimalkan bandwidth yang Anda gunakan dan menghindari diskontinuitas yang akan mendistorsi sinyal Anda harus membuat fase berlanjut. Bahkan jika Anda membuat fase pemancar terus menerus, masih ada masalah bahwa simbol 2200 Hz tidak akan selalu memiliki jumlah penyeberangan nol yang sama karena fase yang berbeda. Biasanya mereka akan memiliki empat penyeberangan nol, tetapi kadang-kadang mereka akan memiliki tiga penyeberangan. Simbol 1200 Hz di sisi lain, akan selalu memiliki dua penyeberangan nol karena baud rate membagi secara merata ke dalam frekuensi FSK.
Anda dapat menyelesaikan kedua masalah ini dengan mengubah 2200 Hz menjadi 2400 Hz. Kemudian simbol akan selalu mulai dan berakhir pada 0 derajat (sehingga secara otomatis membuat mereka fase kontinu), dan mereka akan selalu memiliki jumlah yang sama dari nol penyilangan - dua dan empat.
sumber
Saya membuat dekoder untuk AFSK (standar Bell 202) menggunakan penerima korelasi untuk 1200 Hz dan 2200 Hz, dengan hasil yang sangat baik.
Amplitudo yang dihasilkan cukup independen dari fase sinyal, dan output SNR sangat baik.
sumber
Dalam kasus RTTY 45,45 baud, Anda juga akan memiliki simbol yang bukan jumlah integer sampel, jadi Anda memerlukan fungsi yang dapat disebut masing-masing sampel dan memberi sinyal pada nilai pengembaliannya ketika simbol itu telah berakhir. Dan Anda membutuhkan akumulator fase, yang membuat penghitungan berjalan di mana fase gelombang sinus.
Untuk mengirim simbol yang panjangnya bukan kelipatan integer dari laju sampel, Anda memerlukan fungsi ini ...
Untuk menggunakannya, hasilkan sampel gelombang sinus berikutnya dan panggil fungsi ini, lalu periksa apakah nilai kembali TIDAK sama dengan dua. Jika tidak sama dengan dua, lanjutkan ke simbol berikutnya dan putuskan apakah Anda mengirim tanda spasi, lalu panggil fungsi ini lagi di dalam blok kode yang dieksekusi ketika Anda mengetahui bahwa nilai balik tidak sama dengan dua.
Dan inilah akumulator fase dari firmware Rockbox, dengan perubahan untuk memungkinkan perubahan amplitudo (volume penuh adalah 32767, 180 derajat dari fase volume penuh adalah -32768).
sumber