Pitch Shifter y otros efectos de sonido implementados utilizando C y ASM x86 + SIMD, para Linux.
Desarrollamos implementaciones en lenguaje ensamblador Intel de 64 bits de los efectos de audio Stretch, Reverb, Vocoder y Resample; este último no lo consideramos un efecto por su cuenta, pero en conjunto con Stretch construyen la implementación del Pitch-Shifter.
Stretch permite aumentar o reducir la velocidad del audio manteniendo su tono original.
Resample simula un cambio de samplerate del audio por una constante (que en el caso del Pitch-Shifter estará relacionada con la constante a usar en la parte de Stretch del efecto) agregando y quitando samples según necesite.
Reverb imita la reverberación que se generaría al escuchar al audio en un espacio cerrado amplio (por ejemplo una iglesia) basado en un audio impulse response.
Vocoder simula que el sintetizador (carrier) está hablando como lo hace la persona del audio introducido (modulator).
Pitch-Shifter permite alterar el tono del audio sin alterar su velocidad, utilizando Resample y Stretch en conjunto.
Para cada efecto realizado proveemos una implementaci ́on en C y otra en ASM que hace uso de SIMD, para poder comparar y observar las ventajas que proporcionan las optimizaciones introducidas en la segunda implementación.
Para poder compilar el código provisto incluimos un archivo Makefile. El código que proveemos hace uso de la librería sndfile1, para instalarla se puede usar el comando make install en el directorio raíz. Estando ya instalada la librería se puede compilar el trabajo utilizando el comando make.
Se incluye el archivo ejemplos.sh que descarga la librería, compila el trabajo y crea ejemplos para cada uno de los filtros. Ejecutar con ./ejemplos.sh
Una vez compilado el programa se ejecuta con el comando ./main desde el directorio raíz. Todos los audios que se utilicen como parámetros deben ser de tipo mono y extensión .wav. Los parámetros disponibles para la utilización del programa son los siguientes:
-
stretch: aplica el efectostretcha un audio pasado por parámetro, con un factor de estiramientofloat../main stretch <audio> <float> [window_size][hop]./main stretch mi_audio.wav 0.75
donde window_size y hop son parámetros opcionales, donde el primero debe ser potencia de 2 y menor o igual a 2048, y el segundo debe ser menor al primero. Por default, sus valores son 2048 y 128 respectivamente. Para estiramientos grandes, el sonido dara un mejor resultado usando hop pequeños. float debe ser positivo.
-
Repitch: aplica el efectoPitch-Shifta un audio por elfloatdado../main repitch <audio> <float>./main repitch mi_audio.wav 0.5
donde float=0.5 vuelve al audio una octava más grave y 2 lo vuelve una octava más agudo (2n vuelve al audio n octavas más agudo o grave, según si n es positivo o negativo). Aunque puede tomar como entrada cualquier float distinto de cero, un rango razonable de entrada para que funcione correctamente es una octava y media mas agudo o grave (aprox de 0.35 a 2.82)
-
Reverb: aplica el efectoReverbal audio, donde el eco está basado en un .wavimpulse_response../main reverb <audio> <impulse>./main reverb mi_audio.wav impulse.wav -
Vocoder: aplica el efectoVocoderdados un audiomodulatory otrocarrierque debe ser más largo quemodulator. Toma un parámetro opcionalwindow_sizeque debe ser potencia de 2 y menor a 2048. Por default es 2048../main vocoder <modulator> <carrier> [window_size]./main vocoder modulator.wav carrier.wav 2048