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

 

Powered by OrdaSoft!
  Written By Peter Gomez Este contenido esta orientado a los programadores que tienen problema con la conectividad("SGC PmmC") de su pantalla uOled-128-g1/g2…
Written by Sherneyko Plata Rangel   Pynq-z2: Hello world   In this tutorial we will implement a simple test of the inputs/outputs available on…
Objetivos Requerimientos Procedimiento Descripción de Hardware. Qsys. Nios II. UCOS II. Secuencia de Sprite. Sintesis de Audio. Descargas Glosario Otros Resultados. Ejemplo de Sprites.     Objetivos: Diseñar una plantilla general para el diseño de…
Written by Holguer A. Becerra           Requerimientos: DE0-NANO USB-UART(solo para parte 3) Python 2.7 ó superior.   Objetivos: Dar una introducción a los conceptos de Multitasking, Scheduling y…
Written by Holguer A. Becerra             Based on Gregory Estrade's Work.   I have ported the PC Engine System on the DE0-NANO back in 2014, why…
      Arduino tools are generally nice tools for quick prototyping and improvized projects, and the Seeeduino Xiao…
Written by: Holguer A Becerra         En esta practica vamos a construir nuestro primer juego retro  usando un sincronizador de Video VGA…
Written by: Andrea Paola Pabón Ortega & Daniel Enrique Mejia Rueda Revision by: Ing Holguer A. Becerra   DESCRIPCIÓN DEL PROYECTO: El  RTAWD DE0NANO…
  Written by Holguer Andres   Requires: DE0-NANO. 4.3 Inch 480x272 Screen.( WQVGA ) ?️       Parte HW: Descargue la siguiente plantilla( DE0_NANO_TFT_PSP.zip) y descomprimala en una ruta sin espacios y…
Escrito por Guillermo Acevedo   Diseño   En esta practica desarrollaremos un filtro FIR en hardware, para este caso en especifico, realizaremos un filtro…
 Written By Juan David Delgado   FILTRO FIR (FILTRO DE RESPUESTA FINITA AL IMPULSO)     Son conocidos como filtros digitales no recursivos debido a…
XISCKER: Reduced and Complex Instruction Set Computing Key Educational Resources A Configurable Platform for the Emulation of Different Computer Architectures An introduction to Computer Architectures through digital design description for FPGA devices   Computer Architecture embraces all three…
Escrito por: Alix Angarita   En el manual a continuación se explica un método de debug adicional que es muy interesante debido a…
By: Fabio Hernández   INTRODUCCIÓN:   El presente documento pretende mostrar la manera de generar software para una imagen de Linux implementada en la…
Summary Written by Fabio Hernandez   HARD PROCESSOR SYSTEM (HPS)     ------------------------------------------------------------------------------------------------------------------------------------------------   Introducción   Tenemos  2 nuclos de procesamiento ARM cortex-A9, cada uno son su propio cache  se…
Escrito por Jesus Lopez         INTRODUCCIÓN   El acceso directo a memoria (DMA, del inglés direct memory access) permite a cierto tipo de componentes de una computadora acceder a…
    Written by  Sebastian Baquero       Objetivos  Introducción a los conceptos de Multitasking, Scheduling y Context Switching.  Ampliación de los conceptos a cerca de el…