J'implémente actuellement la modulation et la démodulation acoustique FSK. Je ne suis pas un spécialiste du traitement du signal…
Puisque vous dites que vous avez des filtres assortis et que vous mentionnez la détection non cohérente, je pense que vous êtes déjà à peu près une personne de communication numérique - l'étape pour devenir une personne DSP est assez petite :)
L'approche SDR du synchroniseur à part entière
Donc, la manière classique de le faire est de prendre les sorties de vos deux filtres, (magnitude) de les mettre en carré, de filtrer les résultats passe-bas à quelque chose au-dessus de , et pendant / après le filtrage décimer (si possible), afin de ne pas gaspiller les opérations par seconde.2fsymbol,max
Je me suis fait un démod FSK de signal passe-bande à valeur réelle rapide (je pense que si je l'avais fait à nouveau, j'aurais remplacé les deux filtres passe-bande par une traduction de fréquence combinée et un filtre passe-bas, me donnant une bande de base complexe, ou jeté un banc de filtres polyphasé au problème, mais peu importe) dans GNU Radio avec l'aide du compagnon GNU Radio (fichier graphique de flux ici ):
Le fait est que nous voulons probablement symboliser la synchronisation temporelle entre la division et le bloc de seuil. Nous pourrions le faire par la suite - l'approche classique de «conception de microcontrôleur et de matériel numérique» serait en fait le puits d'horloge Muller & Mueller et cela fonctionnerait tout aussi bien - mais ne gaspillons pas les informations sur la pente.
Donc, j'ajouterais ici une synchronisation d'horloge polyphasée; Je dois admettre que je n'ai pas pu formuler cela mieux que Tom, un disciple de harris, dans la documentation du bloc éponyme GNU Radio :
Synchroniseur de synchronisation utilisant des bancs de filtres polyphasés.
Ce bloc effectue une synchronisation de synchronisation pour les signaux PAM en minimisant la dérivée du signal filtré, qui à son tour maximise le SNR et minimise l'ISI.
Cette approche fonctionne en créant deux bancs de filtres; un banc de filtres contient le filtre adapté de mise en forme d'impulsion du signal (tel qu'un filtre en cosinus surélevé), où chaque branche du banc de filtres contient une phase différente du filtre. Le deuxième banc de filtres contient les dérivés des filtres du premier banc de filtres. En pensant à cela dans le domaine temporel, le premier banc de filtres contient des filtres qui ont une forme sincère. Nous voulons aligner le signal de sortie à échantillonner exactement au sommet de la forme sinc. La dérivée du sinc contient un zéro au point maximum du ( ). De plus, la région autour du point zéro est relativement linéaire. Nous utilisons ce fait pour générer le signal d'erreur.sincsinc(0)=1,sinc′(0)=0
Si le signal sortant des filtres dérivés est pour le ème filtre, et la sortie du filtre adapté est , nous calculons l'erreur comme:di[n]ixi[n]
e[n]=R{xi[n]}⋅R{di[n]}+I{xi[n]}⋅I{di[n]}2.0 .
Cette équation fait la moyenne de l'erreur dans les parties réelles et imaginaires. Il y a deux raisons pour lesquelles nous multiplions par le signal lui-même. Premièrement, si le symbole peut être positif ou négatif, mais nous voulons que le terme d'erreur nous dise toujours d'aller dans la même direction selon le côté du point zéro où nous nous trouvons. Le signe de ajuste le terme d'erreur pour ce faire. Deuxièmement, la magnitude de échelle le terme d'erreur en fonction de l'amplitude du symbole, donc des signaux plus gros nous donnent un terme d'erreur plus fort parce que nous avons plus confiance en la valeur de ce symbole. L'utilisation de la magnitude de au lieu du simple signe est particulièrement bonne pour les signaux à faible SNR.xi[n]xi[n]xi[n]
Le signal d'erreur, , nous donne une valeur proportionnelle à la distance du point zéro où nous sommes dans le signal dérivé. Nous voulons conduire cette valeur à zéro, nous avons donc mis en place une boucle de second ordre. Nous avons deux variables pour cette boucle; est le numéro de filtre dans le banc de filtres où nous sommes et est le taux que nous parcourons à travers les filtres en régime permanent. Autrement dit, en raison des différences d'horloge naturelles entre l'émetteur et le récepteur, représente cette différence et traverserait les chemins de phase du filtre pour garder le récepteur verrouillé. En considérant cela comme une PLL de second ordre, le est la fréquence et est la phase. Nous mettons donc à joure[n]dkdratedratedratedkdrate et utilisant les équations de boucle standard basées sur deux signaux d'erreur, et . Nous avons ces deux valeurs définies l'une sur l'autre pour un système à amortissement critique, donc dans le constructeur de blocs, nous demandons simplement "gain", qui est tandis que est égal à .dkdαdβdαdβgain24
Se rendre compte que c'est la fréquence audio
Donc, en paramétrant ce bloc correctement (et probablement en réduisant bpf_decim
et lpf_decim
pour donner plus de marge au synchroniseur pour les phases de décalage), vous pouvez créer une récupération de synchronisation de symbole très stable, ce qui serait totalement exagéré pour votre application 😁
Étant donné que vous effectuez un échantillonnage avec une carte son aux deux extrémités et que je suppose que vous n'avez pas à traiter avec le Doppler, le débit de symboles a une relation fixe avec les fréquences porteuses (par exemple, le côté émetteur a une porteuse plus élevée avec un période de 8 échantillons de carte son, et un symbole prend toujours disons 128 échantillons, donc il y a un rapport fixe), vous pouvez prendre un raccourci:
Si vous connaissez le rapport entre la fréquence porteuse et le débit de symboles, estimez simplement l'un et vous obtenez l'autre gratuitement! Dans ce cas, FSK, c'est particulièrement facile: attendez simplement une période pendant laquelle la bande supérieure, par exemple, est active, et utilisez un démodulateur en quadrature (c'est-à-dire pratiquement ) pour vous donner une estimation de la fréquence porteuse après votre filtre passe-bande décimateur, et utilisez la valeur résultante comme facteur de correction de fréquence - vous résolvez immédiatement le problème de récupération de fréquence porteuse et de récupération du débit de symboles à la fois. Je ne pense même pas que vous auriez besoin d'une récupération temporelle après cela - après un seuil, si vous suréchantillonnez suffisamment (ce qui, à ces taux, n'est pas un problème), vous pouvez simplement prendre une décision majoritaire dans une fenêtre, ou décaler cette fenêtre aussi longtemps que nécessaire pour obtenir un maximum dans la fenêtre.darctandt[n]
Concernant la synchronisation des paquets
Eh bien, puisque vous avez un démodulateur qui fonctionne probablement trop désynchronisé en l'absence de signal, utilisez simplement une séquence de données connue fixe pour trouver votre paquet.