Aplicación práctica de la transformada de Fourier para el procesamiento de señales. Procesamiento de señales digitales en microcontroladores ARM7 Transformada de Fourier avr

El teorema de Fourier establece que cualquier señal puede expandirse en una serie en términos de un conjunto ortonormal de funciones periódicas (por ejemplo, en términos de senos y cosenos) con frecuencias que son múltiplos de la frecuencia de la señal periódica. Así, el análisis espectral de la señal se basa en la búsqueda de coeficientes de peso (en el caso general, complejos), cuyo módulo corresponde a la fracción de la potencia de oscilación del armónico correspondiente introducida en la superposición general de todos los armónicos. .

Transformada rápida de Fourier

La Transformada Rápida de Fourier es un algoritmo de cálculo que explota con éxito las propiedades de periodicidad de las funciones trigonométricas para evitar cálculos innecesarios en la Transformada Discreta de Fourier (DFT), encontrando así los coeficientes en la expansión de Fourier más rápido. La principal diferencia con la transformación discreta está solo en el método de cálculo de valores numéricos (algoritmo), y no en el procesamiento de la señal en sí. Y en el caso de la FFT, y en el caso de la DFT, el resultado del cálculo es el mismo. El único requisito para el algoritmo FFT es un tamaño de muestra que sea un múltiplo de N = 2L, donde L es cualquier número entero positivo. Los algoritmos FFT de base 2 más comunes son diezmados por tiempo y diezmados por frecuencia.

En este trabajo se implementa el algoritmo FFT en base 2 con reducción de tiempo (algoritmo Cooley-Tukey). Es fácil obtenerlo examinando algunos patrones DFT. Introduzcamos el llamado coeficiente de giro:

En este caso, en la DFT, los coeficientes de Fourier para una serie de valores de señal (f0,f1,…,fN-1) se expresan mediante la relación:

Considere una serie de señales de 4 valores: (f0,f1,f2,f3). Representemos la transformada de Fourier en forma de matriz (el coeficiente de normalización 1/N se ingresa en el vector columna Cij en el lado derecho de la expresión):

Habiendo escrito los coeficientes de rotación de acuerdo con la fórmula de Euler y habiendo determinado sus valores para k = 0, 1, 2, .. 9, es posible construir un diagrama (Fig. 2), a partir del cual el patrón de coeficientes repetidos es visible.

Figura 2. Serie de potencias w para N=4

Sustituyendo los valores numéricos en (4) obtenemos:

Es decir, los valores de w a partir de w4 son iguales al valor correspondiente de w0 a w3. A continuación, reescribimos la ecuación matricial (4) en una forma no estándar (se introducen designaciones similares para mayor claridad de las operaciones posteriores):

Intercambiemos las columnas de la matriz, dividiéndola en dos grupos: por índices pares f0, f2 e impares f1, f3:

Tomamos en cuenta que wk+1 = wkw1, entonces la expresión (6) se reescribirá como:

Usando las proporciones:

Obtenemos los coeficientes de expansión deseados en forma de un vector de columna con valores de celda:

La representación gráfica del algoritmo (Fig. 3) parece una mariposa con las alas abiertas, por lo que este método de cálculo se denomina "mariposa".

Figura 3. Cuenta "Mariposa" para una serie de 4 miembros

Entonces, en el primer paso del algoritmo, los miembros de una serie de valores de señal se dividen en índices pares e impares. Luego se ejecuta el gráfico de mariposa, consta de dos pasos, su número es igual a la potencia de dos del tamaño de la muestra (N = 4 = 22). En cada etapa, se realizan dos "mariposas" y su número total no cambia. Cada operación mariposa corresponde a una operación de multiplicación. A modo de comparación: en la DFT con una muestra de (f0,f1,f2,f3), la operación de multiplicación debería realizarse 4x4 = 16 veces, y en el caso de la FFT, solo 4 veces.

Esta serie también se puede escribir como:

(2),
donde , k-ésima amplitud del complejo.

La relación entre los coeficientes (1) y (3) se expresa mediante las siguientes fórmulas:

Tenga en cuenta que todas estas tres representaciones de la serie de Fourier son completamente equivalentes. A veces, cuando se trabaja con series de Fourier, es más conveniente utilizar los exponentes del argumento imaginario en lugar de senos y cosenos, es decir, utilizar la transformada de Fourier en forma compleja. Pero nos conviene usar la fórmula (1), donde la serie de Fourier se representa como una suma de ondas cosenos con las correspondientes amplitudes y fases. En cualquier caso, es incorrecto decir que el resultado de la transformada de Fourier de la señal real serán las amplitudes complejas de los armónicos. Como dice correctamente la wiki, "La transformada de Fourier (?) es una operación que asigna una función de una variable real a otra función, también de una variable real".

Total:
La base matemática del análisis espectral de señales es la transformada de Fourier.

La transformada de Fourier nos permite representar una función continua f(x) (señal) definida sobre el segmento (0, T) como la suma de un número infinito (serie infinita) de funciones trigonométricas (seno y/o coseno) con ciertas amplitudes y fases, también consideradas en el segmento (0, T). Tal serie se llama serie de Fourier.

Señalamos algunos puntos más, cuya comprensión es necesaria para la correcta aplicación de la transformada de Fourier al análisis de señales. Si consideramos la serie de Fourier (la suma de las sinusoides) en todo el eje X, entonces podemos ver que fuera del segmento (0, T), la función representada por la serie de Fourier repetirá periódicamente nuestra función.

Por ejemplo, en el gráfico de la Fig. 7, la función original está definida en el segmento (-T \ 2, + T \ 2), y la serie de Fourier representa una función periódica definida en todo el eje x.

Esto se debe a que las sinusoides mismas son funciones periódicas, respectivamente, y su suma será una función periódica.


fig.7 Representación de una función original no periódica por una serie de Fourier

De este modo:

Nuestra función original es continua, no periódica, definida en algún intervalo de longitud T.
El espectro de esta función es discreto, es decir, se presenta como una serie infinita de componentes armónicos, la serie de Fourier.
De hecho, una cierta función periódica está definida por la serie de Fourier, que coincide con la nuestra en el segmento (0, T), pero esta periodicidad no es esencial para nosotros.

Los periodos de las componentes armónicas son múltiplos del segmento (0, T) sobre el que se define la función original f(x). En otras palabras, los períodos armónicos son múltiplos de la duración de la medición de la señal. Por ejemplo, el período del primer armónico de la serie de Fourier es igual al intervalo T en el que se define la función f(x). El periodo del segundo armónico de la serie de Fourier es igual al intervalo T/2. Y así sucesivamente (ver Fig. 8).


fig.8 Períodos (frecuencias) de los componentes armónicos de la serie de Fourier (¿aquí T = 2?)

En consecuencia, las frecuencias de los componentes armónicos son múltiplos de 1/T. Es decir, las frecuencias de los componentes armónicos Fk son iguales a Fk= k\T, donde k varía de 0 a?, por ejemplo, k=0 F0=0; k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (a frecuencia cero - componente constante).

Sea nuestra función original una señal registrada durante T=1 seg. Entonces el periodo del primer armónico será igual a la duración de nuestra señal T1=T=1 seg y la frecuencia del armónico es de 1 Hz. El periodo del segundo armónico será igual a la duración de la señal dividida por 2 (T2=T/2=0.5 seg) y la frecuencia es de 2 Hz. Para el tercer armónico T3=T/3 seg y la frecuencia es de 3 Hz. Etcétera.

El paso entre armónicos en este caso es de 1 Hz.

Así, una señal con una duración de 1 segundo se puede descomponer en componentes armónicos (para obtener un espectro) con una resolución de frecuencia de 1 Hz.
Para aumentar la resolución 2 veces a 0,5 Hz, es necesario aumentar la duración de la medición 2 veces, hasta 2 segundos. Una señal con una duración de 10 segundos se puede descomponer en componentes armónicos (para obtener un espectro) con una resolución de frecuencia de 0,1 Hz. No hay otras formas de aumentar la resolución de frecuencia.

Existe una manera de aumentar artificialmente la duración de la señal agregando ceros a la matriz de muestras. Pero no aumenta la resolución de frecuencia real.

3. Señales discretas y transformada de Fourier discreta

Con el desarrollo de la tecnología digital, las formas de almacenar los datos de medición (señales) también han cambiado. Si antes la señal podía grabarse en una grabadora y almacenarse en cinta en forma analógica, ahora las señales se digitalizan y almacenan en archivos en la memoria de la computadora como un conjunto de números (conteos).

El esquema habitual para medir y digitalizar una señal es el siguiente.


fig.9 Esquema del canal de medición

señal de transductor de medida llega al ADC durante un período de tiempo T. Las muestras de señal (muestra) recibidas durante el tiempo T se transfieren a la computadora y se almacenan en la memoria.


fig.10 Señal digitalizada - N lecturas recibidas en el tiempo T

¿Cuáles son los requisitos para los parámetros de digitalización de señales? Un dispositivo que convierte una señal analógica de entrada en un código discreto ( señal digital) se denomina convertidor de analógico a digital (ADC) (Wiki).

Uno de los principales parámetros del ADC es la frecuencia de muestreo máxima (o frecuencia de muestreo, frecuencia de muestreo en inglés): la frecuencia de toma de muestras de una señal continua en el tiempo durante su muestreo. Medido en hercios. ((Wiki))

De acuerdo con el teorema de Kotelnikov, si una señal continua tiene un espectro limitado por la frecuencia Fmax, entonces puede restaurarse de forma completa y única a partir de sus muestras discretas tomadas a intervalos de tiempo. , es decir. con frecuencia Fd? 2*Fmax, donde Fd - frecuencia de muestreo; Fmax - frecuencia máxima del espectro de la señal. En otras palabras, la tasa de muestreo de la señal (ADC sample rate) debe ser al menos 2 veces la frecuencia máxima de la señal que queremos medir.

¿Y qué pasará si tomamos lecturas con una frecuencia más baja que la requerida por el teorema de Kotelnikov?

En este caso, se produce el efecto de "aliasing" (también conocido como efecto estroboscópico, efecto muaré), en el que la señal de alta frecuencia después de la digitalización se convierte en una señal de baja frecuencia que en realidad no existe. En la fig. 5 ondas sinusoidales rojas de alta frecuencia son la señal real. La onda sinusoidal azul de baja frecuencia es una señal ficticia que resulta del hecho de que más de la mitad de un período de una señal de alta frecuencia tiene tiempo de pasar durante el tiempo de muestreo.


Arroz. 11. La aparición de una señal falsa de baja frecuencia cuando la tasa de muestreo no es lo suficientemente alta

Para evitar el efecto de aliasing, se coloca un filtro anti-aliasing especial frente al ADC - LPF (filtro de paso bajo), que pasa las frecuencias por debajo de la mitad de la frecuencia de muestreo del ADC y corta las frecuencias más altas.

Para calcular el espectro de una señal a partir de sus muestras discretas, se utiliza la transformada discreta de Fourier (DFT). Observamos una vez más que el espectro de una señal discreta está "por definición" limitado por la frecuencia Fmax, que es menos de la mitad de la frecuencia de muestreo Fd. Por lo tanto, el espectro de una señal discreta se puede representar por la suma de un número finito de armónicos, en contraste con la suma infinita de la serie de Fourier de una señal continua, cuyo espectro puede ser ilimitado. De acuerdo con el teorema de Kotelnikov, la frecuencia armónica máxima debe ser tal que represente al menos dos muestras, por lo que el número de armónicos es igual a la mitad del número de muestras de la señal discreta. Es decir, si hay N muestras en la muestra, entonces el número de armónicos en el espectro será igual a N/2.

Considere ahora la transformada discreta de Fourier (DFT).

Comparando con la serie de Fourier

Vemos que coinciden, excepto que el tiempo en la DFT es discreto y el número de armónicos está limitado a N/2, la mitad del número de muestras.

Las fórmulas DFT están escritas en variables enteras adimensionales k, s, donde k son los números de muestras de señal, s son los números de componentes espectrales.
El valor de s muestra el número de oscilaciones completas del armónico en el período T (la duración de la medición de la señal). La transformada discreta de Fourier se utiliza para encontrar las amplitudes y fases de los armónicos numéricamente, es decir, "en la computadora"

Volviendo a los resultados obtenidos al principio. Como se mencionó anteriormente, al expandir una función no periódica (nuestra señal) en una serie de Fourier, la serie de Fourier resultante en realidad corresponde a una función periódica con período T. (Fig. 12).


fig.12 Función periódica f(x) con período Т0, con período de medición Т>T0

Como puede verse en la Fig. 12, la función f(x) es periódica con período Т0. Sin embargo, debido a que la duración de la muestra de medida T no coincide con el periodo de la función T0, la función obtenida como serie de Fourier tiene una discontinuidad en el punto T. Como resultado, el espectro de esta función será contienen un gran número de armónicos de alta frecuencia. Si la duración de la muestra de medida T coincidiera con el periodo de la función T0, entonces sólo el primer armónico (una sinusoide con un periodo igual a la duración de la muestra) estaría presente en el espectro obtenido tras la transformada de Fourier, ya que la función f (x) es una sinusoide.

En otras palabras, el programa DFT "no sabe" que nuestra señal es una "parte de una onda sinusoidal", pero está tratando de representar una función periódica como una serie, que tiene un espacio debido a la inconsistencia de las partes individuales de la onda sinusoidal.

Como resultado, aparecen armónicos en el espectro, que en total deberían representar la forma de la función, incluida esta discontinuidad.

Así, para obtener el espectro "correcto" de la señal, que es la suma de varias sinusoides con diferentes periodos, es necesario que en el periodo de medida de la señal quepa un número entero de periodos de cada sinusoide. En la práctica, esta condición puede cumplirse durante una duración suficientemente larga de la medición de la señal.


Fig.13 Ejemplo de la función y espectro de la señal del error cinemático de la caja de cambios

Con una duración más corta, la imagen se verá "peor":


Fig.14 Un ejemplo de la función y el espectro de la señal de vibración del rotor

En la práctica, puede ser difícil entender dónde están los "componentes reales" y dónde están los "artefactos" causados ​​por la no multiplicidad de los períodos de los componentes y la duración de la muestra de la señal o los "saltos y rupturas" de la forma de onda Por supuesto, las palabras "componentes reales" y "artefactos" no se citan en vano. La presencia de muchos armónicos en el gráfico de espectro no significa que nuestra señal en realidad "conste" de ellos. Es como pensar que el número 7 "consiste" en los números 3 y 4. El número 7 se puede representar como la suma de los números 3 y 4; esto es correcto.

Así es nuestra señal… o mejor dicho, ni siquiera “nuestra señal”, sino que una función periódica compilada repitiendo nuestra señal (muestreo) se puede representar como una suma de armónicos (sinusoides) con ciertas amplitudes y fases. Pero en muchos casos importantes para la práctica (véanse las figuras anteriores), es posible relacionar los armónicos obtenidos en el espectro con procesos reales que son de naturaleza cíclica y contribuyen significativamente a la forma de la señal.

algunos resultados

1. La señal real medida, de duración T seg, digitalizada por el ADC, es decir, representada por un conjunto de muestras discretas (N piezas), tiene un espectro discreto no periódico, representado por un conjunto de armónicos (N/2 piezas ).

2. La señal está representada por un conjunto de valores reales y su espectro está representado por un conjunto de valores reales. Las frecuencias armónicas son positivas. El hecho de que a los matemáticos les resulte más conveniente representar el espectro de forma compleja utilizando frecuencias negativas no significa que “sea correcto” y que “siempre se deba hacer así”.

3. La señal medida en el intervalo de tiempo T se determina solo en el intervalo de tiempo T. Lo que sucedió antes de que comenzáramos a medir la señal y lo que sucederá después de eso, esto es desconocido para la ciencia. Y en nuestro caso, no es interesante. La DFT de una señal de tiempo limitado da su espectro "real", en el sentido de que, bajo ciertas condiciones, permite calcular la amplitud y frecuencia de sus componentes.

Materiales usados ​​y otros materiales útiles.

Se utiliza un indicador LCD de caracteres de dos líneas como dispositivo de visualización. El punto principal en la implementación de este proyecto no es el hardware, sino el software, o más bien la implementación de la transformada discreta de Fourier (DFT) en un microcontrolador de 8 bits. Cabe señalar de inmediato que el autor no es un experto en este campo y, por lo tanto, comenzó desde lo básico, con una simple transformada discreta de Fourier. El algoritmo de transformada rápida de Fourier no solo es rápido, sino también bastante complejo.

La Transformada Discreta de Fourier (en la literatura inglesa DFT, Discrete Fourier Transform) es una de las transformadas de Fourier ampliamente utilizadas en algoritmos de procesamiento de señales digitales (sus modificaciones se utilizan en la compresión de audio en MP3, compresión de imágenes en JPEG, etc.), así como en otros, áreas relacionadas con el análisis de frecuencias en una señal discreta (por ejemplo, analógica digitalizada). La transformada discreta de Fourier requiere una función discreta como entrada. Tales funciones a menudo se crean mediante muestreo (valores de muestreo de funciones continuas).

Diagrama esquemático de un analizador de espectro. señal de sonido Es muy simple y condicionalmente se puede dividir en una parte digital y otra analógica.

La parte digital está formada por un microcontrolador y un indicador LCD conectado a él. El microcontrolador está cronometrado resonador de cuarzo El voltaje de suministro de 16 MHz, +5 V se utiliza como voltaje de referencia para el ADC del microcontrolador.
El bus de datos del indicador LCD está conectado al puerto C del microcontrolador (líneas de E/S PC0-PC3), el bus de control está conectado al puerto D (PD5, PD6) del microcontrolador. El indicador funciona en modo de 4 bits. Se utiliza una resistencia variable de 4,7 kΩ para ajustar el contraste. Para trabajar con el indicador, se crearon caracteres personalizados para mostrar 8 barras horizontales del analizador, estos caracteres personalizados ocupan los 64 Bytes de RAM del indicador LCD.

El microcontrolador está alimentado por un resonador de cuarzo externo de 16 MHz.

La parte analógica del dispositivo es la parte más importante y es un preamplificador de la señal del micrófono electret, cuya salida está conectada al canal ADC0 del ADC integrado en el microcontrolador. Necesitamos establecer el nivel cero en la entrada del ADC exactamente a la mitad del voltaje de referencia, es decir 2.5 V. En este caso, podemos usar la media onda positiva y negativa de la señal, pero su amplitud no debe exceder el límite establecido, es decir. la ganancia debe ajustarse con precisión para evitar la sobrecarga. Todas las condiciones anteriores se cumplen con un chip amplificador operacional común de baja potencia.

El algoritmo DFT es algo más lento en comparación con la transformada rápida de Fourier. Pero nuestro analizador de espectro no requiere alta velocidad, y si puede proporcionar una tasa de actualización de unos 30 cuadros por segundo, esto será más que suficiente para visualizar el espectro de una señal de audio. En cualquier caso, en nuestra versión es posible alcanzar una velocidad de 100 fotogramas por segundo, pero este ya es un valor de parámetro demasiado alto para un indicador LCD de dos líneas de caracteres y no se recomienda. La frecuencia de muestreo es de 20 kHz para una transformada de Fourier discreta de 32 puntos y dado que el resultado de la transformada es simétrico, necesitamos usar solo la primera mitad, es decir primeros 16 resultados. Por lo tanto, podemos mostrar el espectro de frecuencias hasta 10 kHz y la resolución del analizador es de 10 kHz/16 = 625 Hz.

El autor del diseño intentó aumentar la velocidad de cálculo de la DFT. Si esta transformación tiene N puntos, entonces tenemos que encontrar N2/2 valores de seno y coseno. Para nuestra transformación de 32 puntos, necesitamos encontrar 512 valores de seno y coseno. Pero, antes de encontrarlos, necesitamos calcular el ángulo (grados), lo que requerirá algo de tiempo de procesador, por lo que se decidió utilizar tablas de valores para estos cálculos. Los cálculos en el programa del microcontrolador no utilizan cálculos de punto flotante y números de doble precisión (doble), ya que llevará más tiempo procesarlos en un microcontrolador de 8 bits. En cambio, los valores en las tablas de búsqueda son datos enteros de 16 bits multiplicados por 10000. Luego, después de realizar la conversión, los resultados se dividen por 10000. Con este enfoque, es posible realizar 120 conversiones de 32 puntos por segundo, que es más que suficiente para nuestros dispositivos.

Demostración del funcionamiento del analizador de espectro en el microcontrolador ATmega32

Descargas

Código fuente (programa de microcontrolador, tablas de datos de seno, coseno y ángulo) -

  • Está claro que en el AVR-ke es difícil ir más allá de la música ligera, no los mismos parámetros. Pero 120 conversiones de 32 puntos por segundo pueden ser suficientes para la mayoría de las tareas. Una muestra de 625Hz, por supuesto, te puedes llevar otra, o mejor dicho, perdiendo la frecuencia de refresco. Vale la pena señalar que el MK se sentirá mal, en términos de rendimiento, es poco lo que puede esperar. Pero aquí también puede organizar la emisión del resultado por métodos de transferencia de datos de hardware. Entonces será un MK auxiliar, y el principal solo recibirá datos de él y los procesará de forma compatible con otros procesos. En general, todavía se basa en la frecuencia del procesador. Alguna vez fue posible overclockear el mega por encima de 20 MHz, pero para estas tareas probablemente solo obtendremos fallas en las altas frecuencias. La idea es buena, si solo se pintara más parte de la alfombra ... es su implementación en el MK
  • También hice analizadores más interesantes: You Tube o una variante en una pantalla LCD a color: You Tube se basa en la famosa biblioteca Chen :)
  • "necesitamos calcular el ángulo (grados)" ¿Alguien puede explicar cómo se calculan los valores de estas tablas?
  • Con la tabla de senos y cosenos todo queda claro. ¿No está claro cómo se calculan los valores en la tabla degree_lookup?

Todas las señales, ya sea que las hayas inventado o las hayas observado en el universo, en realidad son solo la suma de sinusoides simples de diferentes frecuencias.

Hice un pequeño analizador de espectro de audio (0 - 10 kHz) a partir de una pantalla LCD de 16x2 y un microcontrolador ATmega32. Empecé con simples DFT (Transformada Discreta de Fourier). La FFT (Fast Fourier Transform) difiere de la DFT solo en una velocidad más alta y un algoritmo un poco más complejo, no lo usé, tal vez lo agregue más adelante.

La DFT es lenta en comparación con la FFT. Mi analizador de espectro LCD no requiere la alta velocidad que puede proporcionar una FFT, y si la pantalla cambia a una velocidad de unos 30 fotogramas por segundo, esto es más que suficiente para visualizar el espectro de audio. Pero puedo llegar a alrededor de 100 fps de todos modos, pero no se recomienda una frecuencia de actualización demasiado alta para una pantalla LCD. El audio muestreado a 20 kHz da como resultado 32 puntos DFT. Como el resultado de la transformación es simétrico, solo necesito usar los primeros 16 resultados. En consecuencia, la frecuencia máxima es de 10 kHz. Entonces 10kHz/16 = 625Hz.

Estaba tratando de acelerar el cálculo de la DFT. Si hay una DFT de N puntos, entonces necesitamos encontrar el seno y el coseno de (N^2) / 2. Para una DFT de 32 puntos, necesitamos encontrar el seno y el coseno de 512. Antes de buscar el seno y coseno, necesitamos encontrar el ángulo (grados) que ocupa algo de tiempo de CPU. Para hacer esto, hice tablas para seno y coseno. Hice variables de 16 bits de seno y coseno multiplicando los valores de seno y coseno por 10000. Después de la conversión, tengo que dividir cada resultado por 10000. Ahora puedo calcular 120 DFT de 32 puntos por segundo, que es más de suficiente para un analizador de espectro.

Mostrar

Usé caracteres personalizados para la pantalla LCD cargados en la memoria interna de 64 bytes de la pantalla LCD. En Internet, vi un video en el que se usa una pantalla LCD de 16x2 como analizador de espectro y usé esta idea.

Entrada de audio

Una de las partes más importantes de un analizador de espectro es obtener la señal del micrófono electret. Debe prestarse especial atención al desarrollo preamplificador para micrófono Necesitamos establecer el nivel cero en la entrada ADC y el nivel máximo igual a la mitad del voltaje de suministro, es decir 2,5 V. Se le puede aplicar voltaje de -2.5V a +2.5V. El preamplificador debe estar sintonizado para no exceder estos límites. Usé un amplificador operacional LM324 como preamplificador de micrófono.

Lista de elementos de radio

Designación Tipo Denominación Cantidad NotaComerciomi bloc de notas
Mostrar
MK AVR de 8 bits

ATmega32

1 Al bloc de notas
Condensador22pF2 Al bloc de notas
Condensador0.1uF1 Al bloc de notas
capacitor electrolítico100uF1 Al bloc de notas
Resistor

100 ohmios

1 Al bloc de notas
Resistencia de corte4,7 kiloohmios1 Al bloc de notas
resonador de cuarzo16 MHz1 Al bloc de notas
pantalla LCD16x21 Al bloc de notas
unidad de poder5 voltios1 Al bloc de notas
Entrada de audio
U1 Amplificador operacional

LM324

1 Al bloc de notas
C1 Condensador1 uF1 Al bloc de notas
C8 Condensador0.01uF1 Al bloc de notas
R1 Resistor

220 kiloohmios

1 Al bloc de notas
R2, R3 Resistor

10 kilohmios

2 Al bloc de notas
R4, R9 Resistor

1 kiloohmio

2 Al bloc de notas
R5 Resistor

Para el procesamiento de señales digitales (DSP), hay muchos procesadores especializados, esta es la serie Texas Instruments TMS320 DSP, que incluye núcleos enteros simples y monstruos como la subfamilia de la familia C6000 que procesa datos de punto flotante. Hay toda una serie de ADSPs de Analog Devices (que incluye el más o menos universal BlackFin), hay más soluciones simples de MicroChip - dsPIC.

Sin embargo, un DSP especializado es bueno, pero ¿siempre es tan necesario? Sí, con un gran flujo de información, es simplemente indispensable, pero también hay tareas de procesamiento más simples. Específicamente, estaba interesado en la tarea de la doble conversión: la señal de audio se convoluciona, obteniendo así un espectro, luego se puede realizar cualquier operación en el espectro y se puede realizar la conversión inversa, obteniendo así una señal procesada. Todo esto debe hacerse en tiempo real y obtener una calidad no inferior a la de un teléfono.

Ahora no es el año 2000, hay soluciones de un solo chip basadas en núcleos productivos ARM7 / Cortex-M3 que han bajado significativamente de precio, son de 32 bits, tienen una implementación de hardware de una operación de multiplicación de 32 bits (además, casi una operación de multiplicación DSP con acumulación y resultado de 64 bits), y Cortex-M3 también incluye división de hardware.

Quiero advertir de inmediato que el procesamiento de señales no es mi perfil, casi todo el conocimiento (o más bien la comprensión de los principios) se ha conservado desde el instituto, ahora solo quería verificarlos e implementarlos. Con esto quiero decir que pueden existir imprecisiones en la descripción, sustitución de conceptos, etc. En realidad, la precisión académica no me molestaba mucho.

Para casi cualquier DSP, la tarea anterior es simple y fácil. Pero, ¿cómo se comportará en él un núcleo RISC de propósito general? Si consideramos AVR o PIC, es poco probable que sean suficientes. Afecta a 8 bits y baja frecuencia de reloj. Aunque, Elm-Chan tiene diseños en los que realiza una FFT en el AVR y dibuja el espectro de la señal. Sin embargo, en este caso, la representación en tiempo real solo se realiza (con una precisión de procesamiento mínima) y no el procesamiento completo de la señal con una calidad de audio aceptable.

El LPC2146 basado en el núcleo ARM7TDMI-S y con una frecuencia de reloj máxima de 60 MHz fue elegido como chip experimental (en la práctica, no funciona a 72 o incluso a 84 MHz). ¿Por qué? En primer lugar, tengo una placa de depuración y, en segundo lugar, hay un ADC y un DAC a bordo, es decir. Requiere una moldura externa mínima.

un poco de teoria

En primer lugar, fue interesante evaluar el rendimiento de la FFT (Fast Fourier Transform) en microcontroladores ARM. Con base en esta evaluación, podemos concluir: ¿tendrá suficiente velocidad para procesar el flujo de datos de audio y la señal con qué frecuencia de muestreo y cuántos canales se pueden procesar en dicho microcontrolador?

Sobre la base de la transformada de Fourier, puede construir filtros complicados (y con características muy tentadoras). Estaba principalmente interesado en las tareas de cambiar el tono de la señal (subir y bajar el espectro) y el "reflejo" del espectro. Este último se requiere en las radios SDR para escuchar una transmisión de radio en la banda lateral inferior LSB.

No descargaré la teoría y explicaré qué es la Transformada de Fourier, hay bastantes materiales sobre este tema, de lo que usé: una wiki y un capítulo de un libro muy bueno e informativo.

Implementación de software

Hay muchas implementaciones de software de la FFT, sin embargo, escribí la mía. El objetivo principal que perseguí fue optimizar el código para una arquitectura específica. En primer lugar, me centré de inmediato en 32 bits y, en segundo lugar, solo se requerían cálculos de números enteros y era deseable evitar la operación de división. Bajo estos requisitos, ya es problemático recoger algo ya hecho.

Todas las constantes que se podían calcular de antemano se calcularon y colocaron en tablas (principalmente los valores de las funciones trigonométricas). Esta es la optimización principal del algoritmo; de lo contrario, repite casi por completo el algoritmo descrito.

El más importante es el requisito para los cálculos de enteros. Durante la implementación, incluso se cometió un error, por lo que se produjo un desbordamiento en una de las variables de bucle de 32 bits. Además, no ocurrió en todos los datos de prueba, por lo que causó un dolor de cabeza decente hasta que se encontró.

Reuní todos los textos originales en un archivo. La implementación no es definitiva, existen cálculos duplicados (no se tiene en cuenta la simetría del espectro y las fases), y se requiere optimizar el uso de buffers, ya que actualmente se utilizan demasiados para los cálculos. memoria de acceso aleatorio(casi 12k para convertir desde 1024 puntos).

Primeras pruebas

Redoble de tambores: probando la velocidad de la conversión para una muestra de 1024 puntos, la frecuencia del núcleo del procesador es de 60 MHz. Las pruebas se llevaron a cabo en el emulador, por lo que no pretende ser 100 % preciso, pero este resultado puede usarse como indicador (en mi experiencia anterior, el emulador mintió, pero no mucho). Prueba de la primera versión del código, compilador RealView MDK, opción de optimización O3, modo de generación de código ARM.

Entonces Qué vemos:

6 ms para cada conversión, para un total de poco más de 12 ms para la conversión de ida y vuelta. Resulta que con una frecuencia de muestreo de 44100 Hz (estándar para audio) y muestras con una resolución de hasta 16 bits, los cálculos puros tardarán ~ 44 * 12 ms = 528 ms. ¡Y esto es en una versión intermedia del firmware, cuando aún no se han completado algunas optimizaciones de código (según las estimaciones, el algoritmo puede acelerarse casi 2 veces más)! Simplemente creo que es una gran partitura.

En total, se espera que la carga del núcleo sea de alrededor del 50 %, queda otro 50 % para conversiones en el espectro y costos generales cuando se trabaja con ADC, DAC y otras transferencias de datos. Si bajamos la frecuencia de muestreo al nivel de "teléfono" (alrededor de 4800-9600 Hz), entonces la carga del núcleo será aún menor (alrededor del 15-30%).

Entonces, la parte matemática está más o menos clara. Puede proceder a una implementación específica.

Hierro

Para la plataforma de prueba se tomó una placa de depuración Keil MCB2140 con altavoz. Se soldó un cable Mini-Jack para conectarlo a la salida lineal del dispositivo y se ensambló una cadena de entrada simple. Como ya se mencionó, la placa ya tiene un parlante conectado a la salida analógica del microcontrolador y hay controles (un botón y un potenciómetro).

Aquí hay un boceto del circuito de entrada:


La depuración del software se llevó a cabo en etapas:

  1. Depuración de todos los periféricos necesarios: ADC, DAC, temporizadores, indicación LED.
  2. Prueba con digitalización de señal: digitalizo los datos a la velocidad requerida y los coloco en el búfer, luego extraigo los datos del búfer y reproduzco la señal. Aquellos. Cambio de señal simple en el tiempo, sin transformaciones. En esta etapa, se prueba el mecanismo para trabajar con 2 tampones, que es necesario para el trabajo posterior.
  3. A versión previa se suman las transformadas directa e inversa de Fourier. Esta prueba finalmente verifica la corrección del código FFT, así como también verifica que el código se ajuste al rendimiento disponible.
  4. Después de eso, la columna vertebral principal de la aplicación está lista, puede pasar a las aplicaciones prácticas.

El problema surgió después de agregar la FFT al código: aparecieron ruidos extraños y silbidos en la señal. En general, este comportamiento me pareció bastante extraño, porque. sin conversión, la señal que pasaba por la ruta digital se mantuvo bastante limpia. La primera razón de esto: después del circuito analógico, la amplitud de la señal al ADC no estaba completa (0-3.3V), pero solo dentro de 0.5-2V al volumen máximo del reproductor, la segunda: un ruido bastante fuerte debido a cálculos enteros (+ -1 unidad, que resultó ser suficiente para la aparición de interferencia audible).

Para combatir el primer problema, se decidió comenzar a afinar la parte analógica. Y para resolver el problema del ruido, intente usar un filtro de paso bajo.

Aplicación 1: Cambiar el tono de la señal

La placa tiene un potenciómetro ( resistencia variable), se puede utilizar para el control. En este caso, establece el cambio de arriba hacia abajo del espectro de la señal, lo suficiente como para "transformar" sus composiciones favoritas.

Esto es lo que sucede en el dominio de la frecuencia:


El resultado de la conversión está contenido en 2 búferes. Un búfer es la parte real y el otro es la parte imaginaria. El significado físico de los números obtenidos en ellos: la parte real contiene los valores de los armónicos, la parte imaginaria contiene el cambio de fase de estos armónicos. Además, como puede ver, la señal original se describe mediante valores N y, después de la transformación, se obtienen valores 2N. La cantidad de información no cambia, y el aumento de la cantidad de información en 2 veces se debe al hecho de que los datos del búfer tienen redundancia en forma de duplicación de valores.




Arriba