Pregunta

¿Alguien sabe de algún lugar donde pueda encontrar ejemplos de código reales de bucles de bloqueo de fase de software (SPLL)?

Necesito un SPLL que pueda rastrear una señal modulada en PSK que esté entre 1,1 KHz y 1,3 KHz.Una búsqueda en Google muestra muchos artículos académicos y patentes, pero nada utilizable.Incluso en un viaje a la biblioteca de la Universidad que contiene un estante lleno de libros sobre PLL de hardware, solo había un capítulo en un libro sobre SPLL y eso era más teórico que práctico.

Gracias por tu tiempo.

ian

¿Fue útil?

Solución

Este es un paquete de diseño interactivo para el diseño digital (es decir,Software) bucles bloqueados de fase (PLLS).Complete el formulario y presione el botón `` enviar '', y se diseñará un PLL para usted.

Diseño de bucle de bloqueo de fase digital interactivo

Esto te ayudará a empezar, pero en realidad Es necesario comprender los fundamentos del diseño de PLL lo suficientemente bien como para construirlo usted mismo y solucionarlo más adelante. Este es el ámbito del procesamiento de señales digitales y, aunque no es magia negra, ciertamente le permitirá competir por su dinero durante la depuración.

-Adán

Otros consejos

Supongo que probablemente sea demasiado tarde para ayudarte (¿qué terminaste haciendo?), pero puede ayudar al siguiente.

Aquí hay un ejemplo de golf de un bucle de bloqueo de fase de software que acabo de escribir en una línea de C, que cantará contigo:

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

Primero presento esta pequeña versión de golf para convencerlo de que los bucles de bloqueo de fase del software son en realidad bastante simples, aunque pueden ser complicados.

Si le alimenta muestras lineales de 8 bits en stdin, producirá muestras de 8 bits de una onda de diente de sierra que intenta rastrear una octava más arriba en stdout.A 8000 muestras por segundo, rastrea frecuencias cercanas a los 250 Hz, justo por encima de B, debajo del C medio.En Linux puedes hacer esto escribiendo arecord | ./pll | aplay.Los 9 bits bajos de b son el oscilador (lo que podría ser un VCO en una implementación de hardware), que genera una onda cuadrada (el 1 o -1) que se multiplica por la forma de onda de entrada (getchar()) para producir la salida del detector de fase.Luego, esa salida se filtra en paso bajo a para producir la señal de error de fase suavizada que se utiliza para ajustar la frecuencia de oscilación de b para empujar a hacia 0.La frecuencia natural de la onda cuadrada, cuando a == 0, es para b para incrementar en 16 cada muestra, lo que lo incrementa en 512 (un ciclo completo) cada 32 muestras.32 muestras a 8000 muestras por segundo son 1/250 de segundo, por lo que la frecuencia natural es 250 Hz.

Entonces putchar() toma los 8 bits bajos de b, que forman una onda de diente de sierra a aproximadamente 500 Hz y las arroja como flujo de audio de salida.

Faltan varias cosas en este sencillo ejemplo:

  1. no tiene nada bueno forma de detectar el bloqueo.Si tiene silencio, ruido o un tono de entrada fuerte y puro de 250 Hz, a será aproximadamente cero y b oscilará en su frecuencia predeterminada.Dependiendo de su aplicación, es posible que desee saber si ha encontrado una señal o no.La sugerencia de Camenzind en el capítulo 12 de Diseño de chips analógicos es alimentar un segundo "detector de fase" desfasado 90° respecto al detector de fase real;su salida suavizada le brinda la amplitud de la señal que teóricamente ha bloqueado.

  2. La frecuencia natural del oscilador es fija y no barre.El rango de captura de un PLL, el intervalo de frecuencias dentro del cual notará una oscilación si no está actualmente bloqueado en una, es bastante estrecho;es rango de bloqueo, sobre el cual se extenderá para seguir la señal una vez que esté fijada, es mucho mayor.Debido a esto, es común barrer la frecuencia del PLL en todo el rango donde espera encontrar una señal hasta obtener un bloqueo y luego dejar de barrer.

La versión de golf anterior se reduce de una ejemplo mucho más legible de un bucle de bloqueo de fase de software en C que escribí hoy, que detecta bloqueos pero no realiza barridos.Necesita alrededor de 100 ciclos de CPU por muestra de entrada por PLL en la CPU Atom de mi netbook.

Creo que si estuviera en su situación, haría lo siguiente (aparte de cosas obvias como buscar a alguien que sepa más que yo sobre procesamiento de señales y generar datos de prueba).Probablemente no filtraría ni convertiría la señal en una interfaz, ya que ya está en una frecuencia muy baja.La conversión descendente a una banda de 200 Hz-400 Hz no parece necesaria.Sospecho que PSK traerá algunos problemas nuevos, ya que si la señal cambia repentinamente de fase 90° o más, se pierde el bloqueo de fase;pero sospecho que esos problemas serán fáciles de resolver y no es un territorio inexplorado.

¿Tiene Matlab con Simulink?Hay archivos de demostración PLL disponibles en Matlab Central aquí.Las capacidades de generación de código de Matlab pueden llevarlo desde allí a un PLL escrito en C.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top