Tabla de contenido:

Sintonizador: 9 pasos
Sintonizador: 9 pasos

Video: Sintonizador: 9 pasos

Video: Sintonizador: 9 pasos
Video: LA FRECUENCIA DE TUS DESEOS: 9 Pasos para Sintonizar tus Deseos 2024, Mes de julio
Anonim
Image
Image
Lista de equipo (tome una foto del tablero y la composición de Kevin)
Lista de equipo (tome una foto del tablero y la composición de Kevin)

Este proyecto fue diseñado para hacer un afinador de guitarra usando Vivado y una pantalla de 7 segmentos. Una vez que el sintonizador encuentra la frecuencia del sonido introducido, el sintonizador comparará ese valor con una lista de valores codificados para las frecuencias exactas que se conocen como la frecuencia estándar para el tono correcto de una nota. Luego, el afinador mostrará qué tan cerca o lejos está el sonido introducido de la nota deseada. Lo interesante es que una onda de sonido es una combinación de múltiples formas de onda sinusoidales con componentes reales e imaginarios. Si bien esto puede parecer difícil de trabajar para aquellos que no están familiarizados, hay algunas formas en las que aún podemos analizar una ola con valores reales e imaginarios.

Manifestación:

Paso 1: Lista de equipos (tome una foto del tablero y la composición de Kevin)

Primero necesitamos una placa Basys 3 y una computadora que admita los siguientes programas: Garageband / Audacity u otro DAW - para grabar a través de un micrófono y exportar archivos wav

Python: capaz de usar pylab y scipy para muestreo y fft

Vivado - para conectarse a la placa Basys 3 y ver visualmente los resultados

Paso 2: descripción general

Visión general
Visión general

Un sintonizador se compone de algunos componentes importantes: micrófono, muestreador, FFT (Transformada rápida de Fourier), comparador, decodificador y pantalla. El propósito del micrófono es capturar la forma de onda de entrada. El muestreador recibe la señal de salida del micrófono y usa la FFT para convertir la señal en una salida de magnitud en frecuencias. Luego, utilizando la salida de la FFT y encontrando la magnitud máxima y la frecuencia asociada con ella dividida por 2, se puede encontrar la frecuencia asociada con el tono de la forma de onda. Luego, ese valor puede ir al comparador. Luego se compara con una tabla de consulta, que ya ha establecido valores de frecuencia para tonos perfectos de todas las notas. El comparador recibe una entrada para la nota deseada, que luego puede hacer coincidir la nota deseada con su frecuencia correcta de la tabla de búsqueda. Luego, el comparador elegirá la nota con la frecuencia más cercana a la frecuencia máxima. El comparador comparará los dos valores y verá de cerca el valor de la frecuencia con el deseado y luego pondrá esos datos en una señal. El comparador enviará esa señal al decodificador, donde el decodificador elegirá las entradas para los ánodos de la pantalla de 7 segmentos para mostrar la precisión de la nota.

Paso 3: archivo WAV

Archivo WAV
Archivo WAV

En este paso, tomaremos un archivo WAV de un tono e intentaremos generar la frecuencia de ese tono.

Primero necesitas un archivo wav de una nota. En este ejemplo, utilizaremos un archivo WAV estéreo de 16 bits con una frecuencia de muestreo de 44,1 kHz. Esto se puede crear en un DAW como Garageband o descargar. Para este ejemplo, una onda sinusoidal A4 440Hz generada por nosotros en Garageband se puede descargar aquí.

Paso 4: Python: usos de Pylab y Scipy

Python: usos de Pylab y Scipy
Python: usos de Pylab y Scipy

Usamos la biblioteca de Python para hacer la "Transformada rápida de Fourier". El recurso en línea nos permitió imitar y ver qué es útil en pylab y scipy.

1. Si no ha instalado pylab o scipy, debe hacerlo. O, Pycharm tiene una característica muy buena, cuando intentas importar pylab o scipy, hay un subrayado ondulado que te dice que aún no has instalado la biblioteca. Luego, puede instalarlos directamente presionando la bombilla roja (aparecerá cuando coloque el cursor cerca del subrayado ondulado).

2. Usando la función scipy.io.wavfile.read, lea y extraiga datos del archivo wav de muestra. Ejecute los datos por pylab.fft, le devolverá una lista de magnitud para el poder.

3. Luego, encuentre el máximo de la potencia emitida de la lista. Busque el índice de la lista donde se produce la potencia máxima porque es la forma más rápida de encontrar qué frecuencia se asocia con esa potencia. Finalmente devuelve la frecuencia máxima. Dado que más tarde necesitamos ingresar una señal de frecuencia binaria en el código VHDL, podemos convertir la frecuencia en flotación en binario y devolverla.

Paso 5: muestreo de Python y FFT (mostrar el código y sus resultados)

En este paso, los créditos completos van a este enlace a continuación para el muestreo y FFT.

samcarcagno.altervista.org/blog/basic-sound… Nuestro código:

Una vez instalados pylab y scipy, los archivos wav se pueden importar y leer.

desde pylab import * desde scipy.io import wavfile

sampFreq, snd = wavfile.read ('440_sine.wav')

Luego, snd.shape representa los puntos de muestra y el número de canales. En nuestro caso, los puntos de muestra dependen de la longitud del archivo wav y el número de canales es 2 porque es estéreo.

Entonces snd = snd / (2. ** 15) …… xlabel ('Tiempo (ms)')

organiza la señal de tiempo en una matriz.

Luego, la FFT crea una matriz en frecuencia y magnitud (potencia)

Luego, a través de un bucle while, se encuentra la magnitud máxima y la frecuencia asociada. Esa frecuencia / 2 representa el tono del archivo wav.

Luego, utilizando nuestro propio código, el número entero que representa la frecuencia se convirtió en un número binario de 12 bits y se creó un archivo de texto con ese número.

Paso 6: Vivado (Comparador)

Vivado (Comparador)
Vivado (Comparador)

En esta parte del proceso, necesitamos un comparador para comparar dos frecuencias de entrada.

1. Creó un comparador para comparar si la frecuencia de entrada (receptor) es más alta, más baja o dentro de la nota definida del rango de margen de 2 Hz. (El afinador de guitarra típico varía de e2 a g5, 82 Hz a 784 Hz).

2. Al crear un margen de 2 Hz, usamos un RCA para agregar "000000000010" a la frecuencia del receptor y verificamos dónde aún es demasiado bajo para la entrada del usuario. Si ese es el caso, señal de un solo bit "alta" <= "0", "baja" <= "1". Luego agregamos "000000000010" a la entrada del usuario para ver si la entrada del receptor es incluso mayor que eso. Si ese es el caso, "alto" <= "1", "bajo" <= "0". Ninguno de los dos casos devolvería "0".

3. Dado que la siguiente parte del módulo necesita datos específicos de 4 bits para decir cuál es la nota del receptor, no solo devuelve las 2 salidas comparativas (baja y alta), necesitamos devolver el código asociado a la nota, que se asocia con la frecuencia. Consulte la tabla siguiente:

C | 0011

C # | 1011

D | 0100

D # | 1100

E | 0101

F | 0110

F # | 1110

G | 0111

G # | 1111

A | 0001

A # | 1001

B | 0010

Usar varias declaraciones if para categorizarlas en notas y codificarlas en lo que se necesita para el decodificador de siete segmentos.

Paso 7: FOTOS DE BASYS 3 Board

FOTOS DE BASYS 3 Board
FOTOS DE BASYS 3 Board

Paso 8: Vivado (decodificador de 7 segmentos con multiplexación)

Vivado (decodificador de 7 segmentos con multiplexación)
Vivado (decodificador de 7 segmentos con multiplexación)

Todo necesita una pantalla. Es un factor importante que determina el valor de un diseño. Por lo tanto, necesitamos crear una pantalla utilizando un decodificador de siete segmentos, lo que nos permitiría demostrar nuestra capacidad para diseñar un sintonizador en la placa B. Además, nos ayudaría a probar y depurar.

Un decodificador de siete segmentos contiene entradas denominadas Note, low, high y CLK, mientras que genera SSEG, AN y Fiz_Hz. Hay una imagen del diagrama de bloques arriba para ayudarnos a comprender el diseño.

El propósito de tener dos entradas separadas de baja y alta es proporcionar al diseñador del comparador la libertad de manipular si la frecuencia del sonido (onda) es mayor o menor que la frecuencia de entrada (Fix_Hz) que el usuario desea comparar. Además, la salida SSEG representa la pantalla de siete segmentos y el punto siguiente, mientras que AN representa los ánodos para los que se ilumina el conjunto de la pantalla de siete segmentos.

En este decodificador de siete segmentos, el reloj (CLK) juega un papel importante en la visualización de dos valores diferentes en dos o más ánodos diferentes. Como el tablero no nos permite mostrar dos valores diferentes al mismo tiempo, tenemos que usar la multiplexación para mostrar un valor de uno en uno, mientras cambiamos a otro valor lo suficientemente rápido como para que nuestros ojos no puedan capturarlo. Aquí es donde entra en juego la entrada CLK.

Para obtener más información, consulte el código fuente.

Paso 9: Vivado (combinación de componentes)

Con cada módulo (receptor de Python, comparador, decodificador de siete segmentos, etc.) completado, lo juntamos usando un módulo más grande. Al igual que se muestra en la imagen de la sección "Vista general", conectamos cada señal en consecuencia. Como referencia, consulte nuestro código fuente "SW_Hz.vhd".

Gracias. Espero que lo disfrutes.

Recomendado: