2008-09-02 5 views
7

Est-ce que quelqu'un sait où que ce soit où je peux trouver des exemples réels de code de boucle à verrouillage de phase logiciel (SPLL)?Exemple de code de boucle verrouillée en phase logicielle nécessaire

J'ai besoin d'un SPLL capable de suivre un signal modulé PSK compris entre 1,1 et 1,3 KHz. Une recherche Google apporte beaucoup de documents académiques et de brevets, mais rien d'utilisable. Même un voyage à la bibliothèque de l'Université qui contient une étagère pleine de livres sur les PLL de matériel, 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

+0

J'ai posé une question connexe à http://dsp.stackexchange.com/questions/8456/how-to-perform-carrier-phase-recovery-in-software – Keith

Répondre

2

Ceci est un ensemble de design interactif pour la conception numérique (par exemple le logiciel) boucles à verrouillage de phase (PLL) de. Remplissez le formulaire et appuyez sur le bouton «Soumettre», et un PLL sera conçu pour vous.

Interactive Digital Phase Locked Loop Design

Cela vous aider à démarrer, mais vous vraiment besoin de comprendre les fondements de la conception PLL assez bien pour construire vous-même afin de résoudre plus tard - C'est le domaine du signal numérique le traitement, et bien que ce ne soit pas de la magie noire, il vous donnera certainement une course pour votre argent pendant le débogage.

-Adam

+1

Cette page ne fonctionne dans aucun navigateur J'ai essayé - comment l'avez-vous fait fonctionner? – Keith

+0

@Keith La page Web est en effet cassée, malheureusement la personne qui l'a créée est décédée en 2000, et la page Web et le site Web ne sont plus maintenus activement. La page a été copiée ailleurs, par exemple sur http://www.piclist.com/techref/uk/ac/york/cs/www-users/http/~fisher/mkpll/index.htm mais le script du serveur d'origine rejette les entrées d'autres sites Web. Vous pourriez être capable de concocter quelque chose avec des scripts intelligents pour donner au serveur ce qu'il veut et recevoir votre code PLL, mais je pense qu'à ce stade, les gens devront utiliser les autres réponses à cette question. –

2

Avez-vous Matlab avec Simulink? Il existe des fichiers de démonstration PLL disponibles auprès de Matlab Central here. Les capacités de génération de code de Matlab peut vous arriver de là à un PLL écrit en C.

12

Je suppose que cela est probablement trop tard pour vous aider (qu'est-ce que vous finissez par faire?), Mais il peut aider le gars à côté.

Voici un exemple golfed d'une boucle à verrouillage de phase logiciel que je viens d'écrire dans une ligne de C, qui va chanter avec vous:

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

Je vous présente cette petite la version golfed d'abord pour vous convaincre Les boucles logicielles à verrouillage de phase sont en fait assez simples, comme le dit le logiciel, bien qu'elles puissent être difficiles. Si vous alimentez des échantillons linéaires 8 bits sur stdin, vous obtiendrez des échantillons 8 bits d'une onde en dents de scie essayant de suivre une octave plus haut sur la sortie stdout. À 8000 échantillons par seconde, il suit les fréquences au voisinage de 250Hz, juste au-dessus de B sous le milieu C. Sur 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 (1 ou -1) qui est multipliée par la forme d'onde d'entrée (getchar()) pour produire la sortie de la phase détecteur. Cette sortie est ensuite filtrée par passe-bas en a pour produire le signal d'erreur de phase lissé qui est utilisé pour ajuster la fréquence d'oscillation de b pour pousser a vers 0. La fréquence naturelle de l'onde carrée, lorsque a == 0, est pour augmenter de 16 chaque échantillon, qui l'incrémente de 512 (un cycle complet) tous les 32 échantillons. 32 échantillons à 8000 échantillons par seconde sont 1/250 de seconde, ce qui explique pourquoi la fréquence naturelle est de 250Hz.

Ensuite, putchar() prend les 8 bits bas de b, qui forment une onde en dents de scie à 500 Hz ou plus, et les crache comme flux audio de sortie.

Il y a plusieurs choses qui manquent dans cet exemple simple:

  1. Il n'a pas une bonne façon de détecter verrouillage. Si vous avez du silence, du bruit ou une forte tonalité d'entrée de 250 Hz pure, a sera à peu près nul et b oscillera à sa fréquence par défaut. Selon votre application, vous voudrez peut-être savoir si vous avez trouvé un signal ou non! La suggestion de Camenzind au chapitre 12 de Designing Analog Chips est d'alimenter un second "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 que vous avez théoriquement verrouillé. La fréquence propre de l'oscillateur est fixe et ne balaie pas. La 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 un, est assez étroite; sa plage de verrouillage , sur laquelle il va varier afin de suivre le signal une fois qu'il est verrouillé, est beaucoup plus grande. Pour cette raison, il est courant de balayer la fréquence de la PLL dans toute la plage où vous vous attendez à trouver un signal jusqu'à ce que vous obteniez un verrou, puis d'arrêter le balayage.

La version ci-dessus est golfed réduite d'un much more readable example of a software phase-locked loop in C que j'ai écrit aujourd'hui, qui fait faire la détection de verrouillage mais ne balaie pas. Il faut environ 100 cycles de CPU par échantillon d'entrée par PLL sur le processeur Atom de mon netbook. Je pense que si j'étais dans votre situation, je ferais ce qui suit (en dehors de choses évidentes comme la recherche de quelqu'un qui en sait plus sur le traitement du signal que moi et qui génère 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 à la baisse vers une bande de 200Hz-400Hz semble à peine nécessaire. Je suspecte que PSK soulèvera de nouveaux problèmes, puisque si le signal change soudainement de phase 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 non-intrus.