Identificando el cambio de frecuencia de 40Hz

4

Tengo una señal que está a 4 kHz. Esta señal cambia en 40 Hz dependiendo de la entrada del usuario. Me gusta detectar este cambio en el software tan rápido como puedo. ¿Cuál debería ser la frecuencia ADC que debería usar?

Actualmente planeo muestrear a 40 kHz y uso una ventana de 10 ms para hacer un FFT para descubrir este cambio. Pero antes de construir el sistema, me gustaría obtener una segunda opinión.

    
pregunta TGG

6 respuestas

12

Para reafirmar su problema, tiene una señal de entrada en el rango de frecuencia de 3960-4040 Hz y desea determinar esta frecuencia sobre la marcha. Muchos microcontroladores pueden hacer esto de manera bastante simple.

La frecuencia de interés más alta es 4.04 kHz, que tiene un período de 248 µs. Es un tiempo "largo" incluso para un micro pequeño y barato. En el otro extremo, 1 / 3.96 kHz = 253 µs, por lo que desea determinar el período de la señal en un rango de 5 µs. No dijiste qué resolución quieres, así que digamos 1 parte en 50, lo que significa que puedes obtener lo que quieres si puedes medir el período hasta 100 ns.

Todo esto es bastante factible en muchos microcontroladores, que tienen la capacidad de tomar una instantánea de un temporizador de funcionamiento libre en un borde particular de una señal de entrada. En los PIC de 8 bits, esta es una de las cosas que puede hacer el módulo CCP (comparación, captura, modulación de ancho de pulso). En los PIC de 16 bits se denomina módulo "Captura de entrada". De cualquier manera, terminas con una instantánea del temporizador de 16 bits en cada ciclo de tu señal entrante.

Para determinar el período del ciclo anterior, simplemente haga una resta sin firmar del nuevo valor de captura menos el anterior. Esto funciona ya sea que el temporizador finalice durante ese ciclo o no, siempre que el período no exceda el tiempo de reinicio del temporizador. Si registra el temporizador a 10 MHz, obtendrá valores de 2475 a 2525, y la resta arroja el período en unidades de 100 ns.

No dices para qué quieres la frecuencia, pero quizás puedas usar este período directamente. Si realmente necesita frecuencia (piénselo cuidadosamente, puede que no), entonces haga la división. Incluso si el micro solo funciona a 10 MHz, tiene más de 2000 ciclos de instrucción por ciclo de entrada, lo que es suficiente para una división. En un PIC de 16 bits, puede dividir el hardware en solo 18 ciclos.

De cualquier manera, haría un poco de filtrado de paso bajo en los periodos medidos antes de realizar cualquier otro procesamiento. Esto hará que su sistema sea menos susceptible a las vibraciones e incluso puede reducir un poco el ruido de cuantificación. Tenga en cuenta que una señal de banda limitada de 3960-4040 Hz no puede cambiar su frecuencia tan rápido. Se garantiza que los cambios aparentes en la frecuencia por encima de algún límite son ruidos.

    
respondido por el Olin Lathrop
3

¡Creo que la forma más fácil y rápida de observar el cambio de frecuencia de la señal de entrada es simplemente medirla directamente! Esto es lo que yo haría.

Proporcione una versión de niveles de señal digital de su señal. Si la señal es sinusoidal de bajo nivel o similar, esto puede requerir cierta amplificación y luego cuadrar la señal a los cambios de señal digital.

Consiga un microcontrolador simple que tenga unos temporizadores de 16 bits que puedan sincronizarse para contar el período de su señal de entrada desde el borde ascendente hasta el borde ascendente. Hay una gran cantidad de microcontroladores que pueden soportar este requisito.

Con una señal que tiene una frecuencia básica de 4 KHz, se trata de un período de 0,25 ms. Si configura su microcontrolador con un temporizador de 16 bits con una velocidad de reloj de 8 MHz, puede contar 2000 contadores en un período de la señal de entrada. Cuando la frecuencia de la señal de entrada cambia a 4.04 KHz, entonces estará contando ~ 1980 contadores de contadores en un período de la señal de entrada. Digamos que la señal de entrada se redujo a 3.96KHz, entonces un período de la señal de entrada pasará el tiempo del temporizador para contar ~ 2020 conteos.

Esta es realmente la forma más rápida de detectar el cambio de frecuencia dentro de un ciclo de la señal de entrada. También es extremadamente fácil de lograr, incluso con algunos de los componentes de MCU más sencillos y económicos.

En el pasado, he usado esta misma técnica para decodificar una señal FSK de baja frecuencia que enviaba datos modulados a frecuencias similares a través de cables extremadamente largos sin usar ninguna portadora de RF. En ese momento, algunos 8051 MCU generales que funcionaban a 8 o 16 MHz funcionaron muy bien. En mi caso con el decodificador FSK, fue necesario observar la sincronización de cada período de señal que viene por el cable. Como tal, configuré la MCU con dos temporizadores para medir el período de la señal en ciclos alternos de la señal de entrada. Esto permitió analizar y calcular la medición de un período mientras se medía el siguiente período. (En los procesadores más antiguos, se podrían perder varios conteos en el temporizador si se intentara volver a armar el uso del mismo temporizador para cada período y cuando se tratara con solo 20 conteos de los 2000 que pueden ser bastante graves).

Una buena ventaja de este enfoque es que puede detectar un rango de conteos capturados por período como un rango de entrada válido en lugar de buscar un valor de conteo distinto. Esto permitirá que una pequeña desviación de frecuencia no altere la decodificación de la entrada. También con la medición ciclo por ciclo es posible medir el ancho de la envolvente de modulación FSK para verificar que esté dentro del rango adecuado para cualquier protocolo que esté en uso para enviar información por el cable.

Todo esto sin PLL, sin FFT, sin filtros. Simplemente simple.

    
respondido por el Michael Karas
2

El espectro de la señal solo se extiende hasta 4.04 kHz, por lo que 40 kHz será más que suficiente como se explica en la Teorema de Nyquist . Tenga en cuenta que la resolución del intervalo de muestreo no limita la resolución de frecuencia que puede detectar en la señal a menos que la esté cuantificando a 1 bit. Mientras los errores de cuantificación no inunden su señal, todo lo que necesita es el doble del componente de frecuencia más un poco de margen de filtro anti-aliasing. Cualquier cosa superior no está agregando ninguna información útil.

Con respecto a su algoritmo, parece bastante excesivo hacer una FFT simplemente para extraer un desplazamiento de frecuencia de banda estrecha. Si la frecuencia de la señal es lo suficientemente estable, consideraría tener un par de filtros de muesca a 4.04 kHz y 4.00 kHz, calculando la magnitud de salida de ellos y utilizando el más grande para determinar dónde está la señal. Puede usar un filtro de múltiples tasas para producir un algoritmo extremadamente eficiente.

Tenga en cuenta que esto es matemáticamente equivalente a realizar una DFT con muestreo ascendente y ventanas para obtener la discriminación de frecuencia requerida, luego descartar todos los coeficientes, excepto los dos que corresponden a las ubicaciones del filtro de muesca. Este es el algoritmo del que básicamente estás hablando, pero como tienes tanto espectro en blanco, no tiene mucho sentido calcular todos los otros coeficientes, por lo que una solución de dominio de tiempo debería ser más eficiente.

    
respondido por el Jon
1

Dado que desea una resolución de frecuencia de al menos 40 Hz, creo que necesita una ventana de al menos 1/40 Hz = 25 ms

¿Está familiarizado / dispuesto a aprender Matlab (u Octave, un clon gratuito de Matlab)? Luego, puedes probar esto fácilmente y ver lo que obtienes.

    
respondido por el Bimpelrekkie
1

10 milisegundos no funcionarán. Una FFT simple a 40kHz con un tamaño de bloque equivalente a 10 milisegundos le dará una resolución de frecuencia de 100Hz.

50milliSeconds te dará una resolución de 40Hz, que apenas te permitirá "ver" la diferencia. En esa resolución, habrá un "contenedor" entre 4040 y 4000, es decir, 4000, 4020, 4040.

Para calcular la resolución, haga esto:

  1. Calcular el número de contenedores: (longitud del bloque en segundos) * (frecuencia de muestreo) / 2
  2. Calcular resolución: ((tasa de muestreo) / 2) / (número de contenedores)

Sin embargo, una FFT puede no ser la opción correcta. Una FFT solo puede usar tamaños de bloque que tienen potencias de 2 (512, 1024, etc.) Las bandejas no se alinearán con las frecuencias deseadas en los tamaños de bloque necesarios, lo que hará que tenga que interpolar entre bandejas y otras diversiones. cosas.

Un DFT no se limita a tamaños de bloque particulares, sino que generalmente es mucho más lento. Podría ajustar los tamaños de bloque para obtener exactamente los contenedores que desea, pero puede ser mucho más lento de computar (más pasos, más ciclos de CPU).

Podría ser más rápido (desde el punto de vista de la CPU) utilizar una FFT de resolución mucho más alta en lugar de una DFT con exactamente los contenedores que desea. Luego, podría usar las sumas de los contenedores seleccionados para aproximar el valor verdadero de 4000 y 4040.

Si está restringido en ciclos de CPU, puede consultar el algoritmo de Goertzel. Un simple microprocesador puede ejecutarlo y realizar la detección en tiempo real de las frecuencias seleccionadas. Puede ser fácilmente sintonizado para dar la separación necesaria. En el código vinculado, use el método tandemRTgoertzelFilter. La variable "RESETSAMPLES" se puede usar para controlar la selectividad: un número más alto se separará mejor, pero se tomarán más muestras para calcular.

    
respondido por el JRE
1

También puede usar un hardware PLL (bucle de fase bloqueada) para detectar y demodulate varianza de frecuencia (fase) ( FSK o cambio de frecuencia) de la señal, siempre que tenga un buen operador o una frecuencia de referencia. No se necesitan muestreos, restas ni FFT extensivos, y la salida podría ser un estado lógico para "coincidencia de frecuencia" y "desajuste de frecuencia".

    
respondido por el rdtsc

Lea otras preguntas en las etiquetas