Intégration temps réel d'un démodulateur FSK conforme à la recommandation V.21 de l'UIT-T (modem téléphonique 300 bauds) sur un DSP Analog Devices ADSP-BF706, par corrélation en quadrature insensible à la phase. Projet réalisé en binôme avec Steeve Mbock.
PDF Rapport complet3 pages · principe, implémentation DSP, validation Télécharger →Le modem V.21 transmet en full-duplex à 300 bauds par modulation FSK sur le réseau téléphonique commuté, avec deux voies à fréquences disjointes (déviation ±100 Hz). Ce projet traite la voie appel : fréquence porteuse 1080 Hz, F1 = 980 Hz (bit 1), F0 = 1180 Hz (bit 0).
La phase du signal reçu étant inconnue, la détection est non cohérente. Pour chaque fréquence candidate, on projette le signal sur cos(2πfₖt) et sin(2πfₖt) sur une période symbole : l'énergie de branche Rₖ = r²_kc + r²_ks est indépendante de la phase (identité cos² + sin² = 1). La règle de décision compare simplement R₁ à R₀. En canal bruité, la probabilité d'erreur théorique s'écrit Pe = ½ exp(−Eb/2N₀).
Développé sous CrossCore Embedded Studio, échantillonnage à 48 kHz, table de sinus (LUT) de 1600 points (le cosinus s'obtient par décalage de 400 points). Les quatre corrélateurs (cos/sin × F0/F1) sont calculés en continu par fenêtre glissante de 160 échantillons par bit, puis binarisés en 0x7F / 0x80 pour la trame UART.
// Extrait de SimDemodulatorFsk — corrélation cos(f0) glissante buf_rc0[index_rc0] = (ek * LUT[index_cosf0]) / 65536.0f; index_cosf0 = (index_cosf0 + pasf0) % N_LUT; index_rc0 = (index_rc0 + 1) % T; rc0 = 0.0f; for (int i = 0; i < T; i++) rc0 += buf_rc0[i]; rc0 = (rc0 * rc0) / 65536.0f; // énergie de branche R0 (cos) // ... même traitement pour sin(f0), cos(f1), sin(f1) ... outk = ((rc1 + rs1) - (rc0 + rs0)) / T; // R1 - R0 pDataOut[k] = (outk > 0) ? 30000 : -30000; // décision binaire
La trame UART (1 idle + 1 start + 8 data + 1 stop) occupe 1760 échantillons. Pour un octet de test 0xA2 (1010 0010), la trame démodulée reconstitue exactement la séquence attendue bit à bit. Les fréquences effectives (960 Hz / 1170 Hz) s'écartent légèrement des cibles V.21 à cause de la quantification de la LUT, mais modulateur et démodulateur partageant les mêmes pas, la corrélation reste parfaitement accordée.
| Idle | Start | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Stop |
|---|---|---|---|---|---|---|---|---|---|---|
| 7F | 80 | 7F | 80 | 7F | 80 | 80 | 80 | 7F | 80 | 7F |