Necesito un dispositivo para calcular la FFT más de 100 veces por segundo (mi alcance tiene un máximo de 10 hz)

Estoy escribiendo un código Python que recupera los datos FFT que se generan en mi osciloscopio Rigol DS1102E a través de su conexión USB.

Mi problema es que no importa qué escala de tiempo establezca, no obtengo más de 10 resultados de FFT por segundo.

¿Hay algún dispositivo USB rápido que pueda producir resultados con más frecuencia? Esperaba lograr al menos 100 FFT por segundo.

Actualmente, mi osciloscopio genera 512 bins y mis formas de onda de entrada oscilan entre 100 Hz y 10 000 Hz.

Estaba pensando en usar una tarjeta de sonido para esto, pero en realidad esperaba encontrar un dispositivo "coprocesador DSP" y dejar que hiciera todo el trabajo independientemente del dispositivo en el que se ejecuta Python.

Debido a que Python no es muy rápido y al hecho de que es posible que desee monitorear varias entradas a la vez, sería difícil usar la tarjeta de sonido para la visualización FFT en vivo (especialmente en algo como una Raspberry PI)

¡¡Gracias!!

El procesamiento probablemente no sea el desafío, sino llevar los datos a un procesador adecuado. Pero hay varios osciloscopios USB, algunos de los cuales pueden ser capaces de transmitir de forma continua (o en ráfagas frecuentes) a través de USB. En el extremo realmente alto, una radio definida por software basada en FPGA puede estar dentro de la reconfiguración de lo que desea hacer. Concéntrese más en la naturaleza de los datos de origen y si los necesita todos, o solo ráfagas frecuentes.
¿Puedes explicar lo que realmente estás tratando de hacer? Suponiendo que sus señales de interés estén dentro del rango de frecuencia que especificó, y su rango dinámico no es demasiado extremo, usar una tarjeta de sonido + una computadora seguramente será la opción más sencilla y económica.
@ChrisStratton Tenía la esperanza de algún día sentarme con un Cyclone o Spartan y probar FPGA. Pero no estoy seguro si podría implementar correctamente las funciones para procesar el análisis espectral de datos de audio digital, y mucho menos lo que necesitaría en cuanto al hardware. Cualquier sugerencia sobre algunos buenos chipsets, proto-boards o IPs sería muy útil.
@ConnorWolf, la razón por la que me gustaría usar un "coprocesador" externo es porque puedo agregar muchos canales sin ralentizar mucho el tiempo de ejecución del código Python/SciPy (espero). Y sería más apropiado para un sistema que usa CPU lentas como una frambuesa pi
En general, si no sabe que necesita un FPGA, probablemente no necesite realmente un FPGA. Y para las FFT más pequeñas, simplemente agregar otro raspberry PI será mucho más conveniente (y económico) que un "coprocesador dedicado", que muy bien podría ser la misma CPU que el Pi. Realmente no hay nada "apto para pruebas" que lo lleve a cualquier lugar cerca de $/MIPS como el Pi.
De todos modos, si estás en una gran plataforma como una PC, la solución es básicamente usar FFTW ( python lib ). Necesitaría un sistema FPGA ENORME y enormemente costoso para obtener un rendimiento similar al de una CPU de escritorio moderna. Más o menos, a menos que tenga requisitos estrictos en tiempo real (y si está usando Python, no los tiene), ir a un FPGA es probablemente una pérdida de energía.
Para ser claros, esto sería una buena excusa para aprender cosas de FPGA, pero no espere que sea mejor que un gran sistema ARM o x86.
@ConnorWolf ¡Dios mío, me diste una idea ahora mismo! como dijiste, solo agrega un montón de PI de frambuesa, y todo su trabajo es no hacer nada más que calcular las FFT (usando C ++) y enviar los resultados a la máquina GUI de Python. es un enfoque fácil de modificar, muy escalable y de baja sobrecarga. y es barato!
Creo que está sobreestimando la sobrecarga de FFT. Asumiendo que su computadora de escritorio no es un pentium 2 antiguo o algo así, un paso de preprocesamiento externo es realmente una tontería. Algunas de las cosas que hago en el trabajo involucran FFT de 8Kpt en tiempo real más de 250 veces por segundo, lo que se hace trivialmente en cualquier CPU de escritorio moderna.
¿La Raspberry PI 2 (o cualquier ARM de cuatro núcleos) tendría suficiente potencia para generar este tipo de análisis espectral a 100 veces/segundo si se programara en C++ puro?
Casi seguro. Use FFTW a menos que GPL sea completamente inaceptable. (Editar: FFTW ahora tiene soporte ARM propio).
KISSfft es una alternativa razonable si no puede usar GPL, aunque no tan eficaz (uso FFTW y kissfft en el trabajo. Ambos son bastante fáciles de integrar).
Supongo que el punto de partida es determinar qué tan rápido es su FFT de 512 puntos en su procesador. ¿Es totalmente entero o usa coma flotante?
@AliChen Buen punto, según recuerdo, el alcance envía una secuencia de 512 bytes de datos dentro de un marco, por lo que cada contenedor FFT es un número entero 0-255
Caramba, solía hacer FFT complejo de entrada y salida de 1024 puntos en 3 ms en un ADSP-2111 con fecha de 1991 y aún más rápido en el ADSP-2181 cuando lo obtuve unos años más tarde. Datos ADC de 16 bits y el núcleo solo funciona a unos 40 MHz. Un ODROID-C2 de 4 núcleos, 2 GHz, cuesta aproximadamente lo mismo que un Pi y creo que funcionará a su alrededor. Si va por ese camino.
Python no es el lenguaje más rápido pero tampoco es necesariamente muy lento. Especialmente, tiene que haber bibliotecas matemáticas para python (pero no escritas en python) que tengan FFT optimizado.

Respuestas (1)

mis formas de onda de entrada oscilan entre 100 Hz y 10 000 Hz.

En serio, eso significa (por Nyquist) que una frecuencia de muestreo de 20 kHz es suficiente; probablemente desee sobremuestrear un poco, pero todo lo que esté por encima de 40 kHz es un lujo.

En otras palabras, este es el territorio de la mejor tarjeta de sonido.

Obtenga una tarjeta de sonido USB barata (<10 $), retire los condensadores de acoplamiento de la entrada del micrófono y use algún tipo de amplificador basado en opamp ajustable para llevar su señal de entrada al rango de la tarjeta de sonido. Hecho.

Sería difícil usar la tarjeta de sonido para la visualización FFT en vivo (especialmente en algo como una Raspberry PI)

¡Estás haciendo suposiciones equivocadas aquí!

Procesar esta cantidad de datos definitivamente no es un problema en nada más rápido que las calculadoras de bolsillo más baratas. Una raspberry Pi, una computadora portátil, una PC o un teléfono inteligente definitivamente funcionarán. Realmente, el esfuerzo de hacer una FFT en esta cantidad de muestras es ridículamente pequeño. Decodificar un MP3 es mucho más complicado para cualquier computadora (dato curioso: el MP3 requiere una operación bastante similar a la FFT).

No se preocupe por si Python lo ralentiza: ninguna biblioteca de Python que conozco hace la FFT en python en sí, pero confíe en FFTpack o FFTw (numpy, por ejemplo). Puede hacer FFT tan cortas (es decir, "menos de cien mil bins") a tasas de muestreo de múltiples Megamuestras por segundo en una PC normal, así que no se preocupe por la carga de trabajo que representa la FFT. En serio, ¿más de 100 transformaciones de longitud 1024 por segundo? Más como 1 millón de transformaciones por segundo, en mi experiencia . No puedo dejar de preguntarme por qué la gente piensa que eso es difícil, pero ven videos codificados en MPEG4 a pantalla completa al mismo tiempo en todos sus dispositivos.

Para demostrar lo fácil que es esto: escribí una respuesta hace un tiempo que demuestra cómo visualizar datos de audio. Si no hace todo el baile de bucle invertido, sino que simplemente selecciona su tarjeta de sonido como fuente, ya ha terminado y tiene su visualización de FFT:

Visualización usando GNU Radio

También escribí un firmware mínimo hace un tiempo (no puedo encontrarlo, lo siento) que usaba una placa de evaluación Tiva-C ARM de 6 $ para convertir y enviar muestras a una PC a hasta 200kS/s a través de USB como transferencias masivas. Tendría que escribir su propio software de "controlador" de espacio de usuario para comunicarse con dicho dispositivo, pero también funcionaría. Pero no se gana mucho al hacerlo en comparación con comprar una tarjeta de sonido, a menos que de todos modos necesite usar un microcontrolador de este tipo, por ejemplo, para controlar otra cosa.