Escrito por: Alix Angarita
 

En esta práctica usaremos el procesador Nios II, implementado en la práctica anterior.  En esta ocasión para generar el sonido de una guitarra al ser tocada gracias al algoritmo de Karplus-Strong.

En la imagen a continuación se pueden ver algunos conceptos importantes a saber antes de seguir el manual.  

 

Algoritmo de Karplus-Strong

El algoritmo consiste en un sistema discreto que para una línea de registros que son leídos y escritos llegan a producir sonidos muy similares a los de una cuerda al ser rasgada.  Es un método de modelado físico, que lleva una corta forma de onda a través de estos registros.

Esta técnica aprovecha la transformada Z para tener el retraso de la señal necesario para realizar el ciclo. Fue inventado por Alexander Strong, y luego analizado por Kevin Karplus. Implementaron el algoritmo juntos llamándolo "Síntesis Digitar" como una contracción de "Digital Guitar".

 

 
Funciona inicialmente con una señal de excitación, la cual es realimentada por las muestras anteriores almacenadas en los registros, dentro del proceso ésta pasa por un filtro pasa-bajas.
Al final se tiene la mezcla simultánea de ambas señales.

Algoritmo implementado en Matlab

Tenemos un código en Matlab con el algoritmo de Karplus-Strong funcionando.  Descárguelo aquí.  Pruébelo, así sonará la guitarra que implementaremos.

 
 
En el programa se declara la línea de registros con 156 elementos, los cuales se leen a una frecuencia de muestreo de 16000 Hz.
Para inicializar los registros se usan valores aleatorios, ya que lo que necesitamos es un cambio o impulso que representaría la perturbación que recibe la cuerda de la guitarra al ser tocada.
El ciclo for realiza el proceso que indica el diagrama de bloques, recorre las muestras almacenadas en la fila de registros y luego se multiplican por el factor de 0.5 tanto la muestra actual como la anterior, se suman y se mandan a la salida como realimentación.
 

Base Hardware

El hardware sobre el que trabajaremos será el mismo que describimos para usar el Nios II, con los módulos del Nios diseñado en el Qsys y un dac_nano como el usado en la práctica del NCO para convertir las frecuencias en una salida de audio.  A la salida final se conectan una resistencia, un capacitor y un parlante o audífono para escuchar el sonido de la guitarra.

Para esto se puede trabajar sobre el proyecto de la práctica anterior de Nios II agregando el dac_nano que se encuentra al final del manual con el resto de los archivos de la práctica.

Se crean las instanciaciones y se copian en el chip principal, a la entrada sw exportada de Nios se conectan los interruptores, a la salida div_freq_export se conecta un cable que llevará la señal hasta el módulo dac_nano en el pin DACin, la salida de audio se asigna al GPIO.

 

Programación del NIOS II

Como vamos a implementar el algoritmo en el Nios II, usando a la FPGA como creador del impulso de la guitarra y como la guitarra misma, el código en Matlab se puede reutilizar para programar el procesador, así, el siguiente paso es pasar el código escrito en Matlab a código en C, usando el IDE Eclipse.

Después de abierto, cree un nuevo proyecto desde una plantilla:

 

En la ventana del nuevo proyecto, abra el archivo de hardware*, la ventana tardará un poco en habilitar el resto de las opciones, la CPU se seleccionará de forma automática, ya que sólo contamos con una, luego nombramos el proyecto en el segundo campo, nos aseguramos que la plantilla del proyecto sea la de Hello World, por último, le damos Finish.

 

* El archivo de hardware tiene formato SOPC y debe asegurarse que esté exactamente en la carpeta del proyecto de quartus que programamos en la FPGA.

 

Dentro del proyecto que se acaba de crear abra el archivo llamado hello_world.c, dentro de él se escribirá el código en C del algoritmo Karplus-Strong.

 

Se incluyen las librerías básicas de C, la librería system.h para poder trabajar con el procesador diseñado y la librería io.h para usar los periféricos.

Se declaran algunas variables tal como se hizo en el código de Matlab, y un vector con las frecuencias de las notas para el primer traste.

 
Se declara un ciclo infinito para escribir el proceso de Karplus-Strong.  Dentro del while se lee el valor actual de entrada y si se detecta el impulso se inicializa el vector sr con valores aleatorios y se generan las muestras y se realizan el resto de las operaciones para generar el sonido propuesto multiplexando las frecuencias para cada nota.
 
download source

Construimos el proyecto y hacemos el debug para probar que el procesador esté funcionando según el algoritmo programado.  Si no recuerda cómo hacer esto revise el manual de NIOS II Software.

Resultados

Para probarlo conecte un plug de salida de audio en el pin del GPIO_0 número 4, y un audífono o parlante para escuchar las diferentes notas generadas por la guitarra digital que acabamos de programar.

En el video a continuación puede ver el funcionamiento de la FPGA como guitarra. Descargar Solución

 

Referencias

 
 
  • https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/f2009/kr334_ask43/kr334_ask43/kr334_ask43/index.html
  • https://ccrma.stanford.edu/~jos/pasp/Karplus_Strong_Algorithm.html
  • Julius Smith, "Making Virtual Electric Guitars and Associated Effects Using Faust", Encontrado en: https://ccrma.stanford.edu/realsimple/faust_strings/faust_strings.pdf 
  • K. Karplus y A. Strong, "Digital synthesis of plucked string and drum timbres'',  Encontrado en: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.144.5585&rep=rep1&type=pdf