Question

Est-ce que quelqu'un sait où je peux trouver des exemples de code réels de boucles logicielles à verrouillage de phase (SPLL) ?

J'ai besoin d'un SPLL capable de suivre un signal modulé PSK compris entre 1,1 KHz et 1,3 KHz.Une recherche Google fait apparaître de nombreux articles universitaires et brevets, mais rien d'utilisable.Même lors d'un voyage à la bibliothèque universitaire qui contient une étagère pleine de livres sur les PLL matérielles, il n'y avait qu'un seul chapitre dans un livre sur les SPLL et c'était plus théorique que pratique.

Merci pour votre temps.

Ian

Était-ce utile?

La solution

Ceci est un package de conception interactif pour la conception du numérique (c'est-à-direLogiciel) Boucles verrouillées en phase (PLLS).Remplissez le formulaire et appuyez sur le bouton `` Soumettre '', et un PLL sera conçu pour vous.

Conception interactive de boucle à verrouillage de phase numérique

Cela vous permettra de démarrer, mais vous vraiment besoin de comprendre suffisamment bien les principes fondamentaux de la conception de la PLL pour la construire vous-même afin de la dépanner plus tard - C'est le domaine du traitement du signal numérique, et bien qu'il ne s'agisse pas de magie noire, cela vous donnera certainement du fil à retordre pendant le débogage.

-Adam

Autres conseils

Je suppose qu'il est probablement trop tard pour vous aider (qu'avez-vous fini par faire ?) mais cela pourrait aider le prochain gars.

Voici un exemple golfé d'une boucle logicielle à verrouillage de phase que je viens d'écrire sur une ligne de C, qui chantera avec vous :

main(a,b){for(;;)a+=((b+=16+a/1024)&256?1:-1)*getchar()-a/512,putchar(b);}

Je présente d'abord cette petite version golfée afin de vous convaincre que les boucles logicielles à verrouillage de phase sont en réalité assez simples, en tant que logiciel, même si elles peuvent être délicates.

Si vous lui donnez des échantillons linéaires de 8 bits sur stdin, il produira des échantillons de 8 bits d'une onde en dents de scie tentant de suivre une octave plus haut sur stdout.À 8 000 échantillons par seconde, il suit les fréquences aux alentours de 250 Hz, juste au-dessus du B en dessous du C moyen.Sous Linux, vous pouvez le faire en tapant arecord | ./pll | aplay.Les 9 bits faibles de b sont l'oscillateur (ce qui pourrait être un VCO dans une implémentation matérielle), qui génère une onde carrée (le 1 ou -1) qui est multipliée par la forme d'onde d'entrée (getchar()) pour produire la sortie du détecteur de phase.Cette sortie est ensuite filtrée passe-bas dans a pour produire le signal d'erreur de phase lissé qui est utilisé pour ajuster la fréquence d'oscillation de b pousser a vers 0.La fréquence naturelle de l'onde carrée, lorsque a == 0, est pour b pour incrémenter de 16 chaque échantillon, ce qui l'incrémente de 512 (un cycle complet) tous les 32 échantillons.32 échantillons à 8 000 échantillons par seconde correspondent à 1/250 de seconde, c'est pourquoi la fréquence naturelle est de 250 Hz.

Alors putchar() prend les 8 bits faibles de b, qui constituent une onde en dents de scie à environ 500 Hz, et les crache sous forme de flux audio de sortie.

Il manque plusieurs éléments dans cet exemple simple :

  1. Ça n'a rien de bon moyen de détecter le verrouillage.Si vous avez du silence, du bruit ou une forte tonalité d'entrée pure de 250 Hz, a sera à peu près nul et b oscillera à sa fréquence par défaut.En fonction de votre application, vous souhaiterez peut-être savoir si vous avez trouvé un signal ou non !La suggestion de Camenzind au chapitre 12 de Concevoir des puces analogiques consiste à alimenter un deuxième "détecteur de phase" déphasé de 90° par rapport au détecteur de phase réel ;sa sortie lissée vous donne l'amplitude du signal sur lequel vous avez théoriquement verrouillé.

  2. La fréquence propre de l'oscillateur est fixe et ne balaie pas.Le plage de capture d'une PLL, l'intervalle de fréquences dans lequel elle remarquera une oscillation si elle n'est pas actuellement verrouillée sur une, est assez étroit ;c'est plage de verrouillage, sur laquelle il s'étendra pour suivre le signal une fois verrouillé, est beaucoup plus grand.Pour cette raison, il est courant de balayer la fréquence de la PLL sur toute la plage où vous vous attendez à trouver un signal jusqu'à ce que vous obteniez un verrouillage, puis d'arrêter le balayage.

La version golfée ci-dessus est réduite d'un exemple beaucoup plus lisible d'une boucle logicielle à verrouillage de phase en C que j'ai écrit aujourd'hui, qui détecte les verrous mais ne balaie pas.Il a besoin d'environ 100 cycles de processeur par échantillon d'entrée et par PLL sur le processeur Atom de mon netbook.

Je pense que si j'étais dans votre situation, je ferais ce qui suit (mis à part des choses évidentes comme rechercher quelqu'un qui en sait plus que moi sur le traitement du signal et générer des données de test).Je ne filtrerais probablement pas et ne convertirais pas le signal dans un frontal, car il est déjà à une fréquence si basse.La conversion vers une bande 200 Hz-400 Hz ne semble guère nécessaire.Je soupçonne que le PSK posera de nouveaux problèmes, car si le signal déphase soudainement de 90° ou plus, vous perdez le verrouillage de phase ;mais je soupçonne que ces problèmes seront faciles à résoudre, et ce n’est guère un territoire inexploré.

Vous avez Matlab avec Simulink ?Des fichiers de démonstration PLL sont disponibles sur Matlab Central ici.Les capacités de génération de code de Matlab pourraient vous amener à une PLL écrite en C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top