Domanda

Qualcuno sa dove posso trovare esempi di codice reali di Software Phase Locked Loops (SPLL)?

Ho bisogno di un SPLL in grado di tracciare un segnale modulato PSK compreso tra 1,1 KHz e 1,3 KHz.Una ricerca su Google fa emergere numerosi documenti accademici e brevetti ma nulla di utilizzabile.Anche andando alla biblioteca dell'Università che contiene uno scaffale pieno di libri sui PLL hardware, c'era un solo capitolo in un libro sugli SPLL ed era più teorico che pratico.

Grazie per il tuo tempo.

Ian

È stato utile?

Soluzione

Questo è un pacchetto di design interattivo per la progettazione di digitale (cioèSoftware) Loop bloccato in fase (PLL).Compila il modulo e premi il pulsante `` invia '' e un PLL sarà progettato per te.

Progettazione digitale interattiva del circuito ad aggancio di fase

Questo ti farà iniziare, ma tu Veramente è necessario comprendere i fondamenti della progettazione PLL abbastanza bene da poterlo costruire da soli per risolverlo in seguito - Questo è il regno dell'elaborazione del segnale digitale e, sebbene non sia magia nera, ti darà sicuramente del filo da torcere durante il debug.

-Adamo

Altri suggerimenti

Suppongo che probabilmente sia troppo tardi per aiutarti (cosa hai fatto alla fine?), ma potrebbe aiutare il prossimo.

Ecco un esempio esagerato di un ciclo ad aggancio di fase del software che ho appena scritto in una riga di C, che canterà insieme a te:

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

Presento prima questa versione minuscola per convincervi che i loop ad aggancio di fase del software sono in realtà abbastanza semplici, come dice il software, anche se possono essere complicati.

Se gli fornisci campioni lineari a 8 bit su stdin, produrrà campioni a 8 bit di un'onda a dente di sega che tenta di tracciare un'ottava più alta su stdout.A 8000 campioni al secondo, traccia le frequenze intorno ai 250 Hz, appena sopra il SI sotto il DO centrale.Su Linux puoi farlo digitando arecord | ./pll | aplay.I 9 bit bassi di b sono l'oscillatore (quello che potrebbe essere un VCO in un'implementazione hardware), che genera un'onda quadra (l'1 o -1) che viene moltiplicata per la forma d'onda di ingresso (getchar()) per produrre l'uscita del rilevatore di fase.Tale uscita viene quindi filtrata passa-basso a per produrre il segnale di errore di fase livellato che viene utilizzato per regolare la frequenza di oscillazione di b spingere a verso 0.La frequenza naturale dell'onda quadra, quando a == 0, è per b per incrementare di 16 ogni campione, incrementandolo di 512 (un ciclo completo) ogni 32 campioni.32 campioni a 8000 campioni al secondo sono 1/250 di secondo, motivo per cui la frequenza naturale è 250 Hz.

Poi putchar() prende gli 8 bit bassi di b, che costituiscono un'onda a dente di sega a circa 500 Hz e li emettono come flusso audio in uscita.

Ci sono molte cose che mancano in questo semplice esempio:

  1. Non ha nulla di buono modo per rilevare il blocco.Se c'è silenzio, rumore o un forte tono di ingresso puro a 250 Hz, a sarà all'incirca zero e b oscillerà alla sua frequenza predefinita.A seconda della tua applicazione, potresti voler sapere se hai trovato un segnale o meno!Il suggerimento di Camenzind nel capitolo 12 del Progettazione di chip analogici consiste nell'alimentare un secondo "rivelatore di fase" sfasato di 90° rispetto al rilevatore di fase reale;la sua uscita livellata ti dà l'ampiezza del segnale su cui ti sei teoricamente agganciato.

  2. La frequenza naturale dell'oscillatore è fissa e non spazza.IL raggio di cattura di un PLL, l'intervallo di frequenze entro il quale noterà un'oscillazione se non è attualmente agganciato su una, è piuttosto ristretto;suo intervallo di blocco, sul quale si sposterà per seguire il segnale una volta agganciato, è molto più grande.Per questo motivo, è normale spazzare la frequenza del PLL su tutta la gamma in cui ci si aspetta di trovare un segnale finché non si ottiene un aggancio, quindi interrompere la scansione.

La versione con golf sopra è ridotta da a esempio molto più leggibile di un ciclo ad aggancio di fase software in C che ho scritto oggi, che rileva il blocco ma non esegue la scansione.Sono necessari circa 100 cicli CPU per campione di input per PLL sulla CPU Atom del mio netbook.

Penso che se fossi nella tua situazione, farei quanto segue (a parte le cose ovvie come cercare qualcuno che ne sappia più di me sull'elaborazione del segnale e generare dati di test).Probabilmente non filtrerei e non convertirei il segnale in un front-end, poiché ha già una frequenza così bassa.La conversione alla banda 200Hz-400Hz difficilmente sembra necessaria.Ho il sospetto che il PSK farà emergere alcuni nuovi problemi, poiché se il segnale cambia improvvisamente fase di 90° o più, si perde l'aggancio di fase;ma sospetto che questi problemi saranno facili da risolvere, e non si tratta di un territorio inesplorato.

Hai Matlab con Simulink?Sono disponibili file demo PLL su Matlab Central Qui.Le funzionalità di generazione del codice di Matlab potrebbero portarti da lì a un PLL scritto in C.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top