Grupo #5 | Integrantes:
- Casas, Agustín
- Dalzotto, Rafael
- Fisher, Agustín
- Oms, Mariano Alejandro
- FFT
- Sintesis por Modelado Fisico con Karplus-Strong
- Modulación FM
- Síntetis por Muestras
- Efectos de Audio
- Control de Amplitud
- Bibliografía
Para la implementacion en C del algoritmo de la FFT se eligio usar el algoritmo de Cooley-Tukey con Decimation-in-Time (DIT). La implementacion en sencilla.
void fft(complex float* in, complex float* out, size_t n){
if(n == 1){
out[0] = in[0];
return;
}
// Split into the DIT FFTs
complex float* even = malloc(n/2 * sizeof(complex float));
complex float* odd = malloc(n/2 * sizeof(complex float));
for(size_t i = 0; i < n/2; i++){
even[i] = in[2*i];
odd[i] = in[2*i+1];
}
complex float* even_out = malloc(n/2 * sizeof(complex float));
complex float* odd_out = malloc(n/2 * sizeof(complex float));
fft(even, even_out, n/2);
fft(odd, odd_out, n/2);
// Join the results and apply twiddle factors
for(size_t i = 0; i < n/2; i++){
// Compute twiddle
complex float twiddle = cexp(-2 * M_PI * I * i / n) * odd_out[i];
// Butterfly operation: X[k] = E[k] + W_N^k * O[k]
out[i] = even_out[i] + twiddle;
out[i + n/2] = even_out[i] - twiddle;
}
free(even);
free(odd);
free(even_out);
free(odd_out);
}
A traves de un breve script en Python se compila y ejecuta el codigo de C, editando el numero de muestras y tomando todos los puntos de la entrada y salida del codigo de C. Usando numpy.fft.fft()
.
import numpy as np
import matplotlib.pyplot as plt
import os
# Set number of samples
N = 512
# Compile and run the C program
os.system(f'cd FFT && make clean && make N={N} && ./main')
# Read in FFT values from the C program
fft_c = np.loadtxt('FFT/fft_output.txt', dtype=complex)
# Fetch the input sine wave from the C program
sine = np.loadtxt('FFT/fft_input.txt')
fft_py = np.fft.fft(sine)
# Plot both FFTs
plt.plot(np.abs(fft_py), label='Python')
plt.plot(np.abs(fft_c), label='C')
plt.legend()
plt.show()
Para una entrada con la forma N = 128
el programa arroja el siguiente grafico.
Es interesante ver lo que pasa si N
toma un valor que no es potencia de 2.
Se ve que el resultado no esta alejado del correcto. Sin embargo se pierde mucha resolucion. Hay picos donde deberian estar pero el espectro esta contaminado y los picos no llegan a tener la amplitud que deberian tener.
En este trabajo se utilizo modelado fisico para sintesis de cuerdas de Karplus-Strong para sintetizar el sonido de una guitarra acustica.
Este es el diagrama de bloques basico propuesto por Karplus y Strong.
El algoritmo funciona tomando, primero, una muestra de ruido. Este ruido puede tener diferentes distrubuciones, esto se analizara mas adelante. Luego esa secuencia inicial de ruido pasa por una linea de retardo de longitud
Esto suaviza la senal y permite que los armonicos mas altos decaigan rapidamente, como en una cuerda real.
La frecuencia de la nota generada tiene la siguiete expresion
El sistema tiene transferencia
La modulación en frecuencia es una técnica conocida y aplicada en comunicación por radio por ejemplo. La fórmula general de la FM viene dada por:
donde
En cuanto al espectro, si
Las amplitudes de las componentes se pueden obtener de expresar a la onda mediante el uso de una expansión trigonométrica:
$$
\begin{align*}
f(t) = & ; A\cdot { ; \cdot J_0(I) \cdot \sin(\omega_c t) \\
& ; + J_1(I) \cdot [\sin((\omega_c + \omega_m) t) - \sin((\omega_c - \omega_m) t)] \\
& ; + J_2(I) \cdot [\sin((\omega_c + 2\omega_m) t) + \sin((\omega_c - 2\omega_m) t)] \\
& ; + J_3(I) \cdot [\sin((\omega_c + 3\omega_m) t) - \sin((\omega_c - 3\omega_m) t)]\\
& ; + J_4(I) \cdot [\sin((\omega_c + 4\omega_m) t) + \sin((\omega_c - 4\omega_m) t)]\\
&; + .... }
\end{align*}
$$
Donde
Se realizó mediante Python una FM con
y con
Cuando se trabaja con una frecuencia portadora cercana a la modulante, o con un índice de modulación muy alto, se tienen componentes de las bandas laterales del espectro que caen en las frecuencias negativas, y esto hace que se "reflejen" respecto de
Se dan propiedades interesantes cuando la relación de frecuencia portadora a modulante es un cociente de números enteros, es decir
siendo una fracción irreducible. En ese caso, la frecuencia fundamental será
Es importante que el cociente sea el indicado, ya que de ser irracional, el sonido generado es totalmente diferente y no agradable para el oído.
Si además se considera que
Se encontró que las funciones
la forma normalizada de la función
Si se necesita que el índice de modulación comience en un valor mayor al que termina, la última función será restada al índice de modulación inicial.
Ahora que se tienen las formas de las funciones, es hora de darle vida a los instrumentos. Según el paper 1 de la bibliografía, para generar el sonido de un clarinete, los parámetros son:
es decir que la frecuencia de la portadora es
donde se tiene que la relación está intacta.
Para por ejemplo producir un sonido parecido al de un fagot (basoon), los parámetros son:
Por otro lado, se investigó otra forma de modular en frecuencia, que usa en vez de una frecuencia de portadora fija y un seno modificando la frecuencia instantánea, se tienen dos senoidales con un índice de modulación fijo, es decir
Esta forma de modular se llama Double Frequency Modulation, (DFM), y es una alternativa mucho más ligera en cálculo que la Asymmetrical Frequency Modulation, que agrega un parámetro extra a la FM normal y permite que el espectro no sea simétrico. La DFM se puede expresar como:
Lo cual por supuesto vuelve mucho más complejo el cálculo a mano del espectro. Por suerte, en el paper 2 se utiliza un algoritmo annealing para estimar los parámetros que se utilizan para sintetizar los instrumentos. Además, si se suman varias DFM, es decir
donde se muestra cada amplitud (peso relativo), índice de modulación 1 y 2, y la frecuencia de cada senoidal que acompaña al índice.
Para extrapolar a otras notas (ya que esto es para una frecuencia de
Otros ejemplos de parámetros son:
En Python, se realizaron dichos algoritmos mediante el uso de funciones de numpy como el sin() y las envolventes se fabricaron mediante combinaciones de funciones del estilo.
Por otro lado, todos los parámetros de los instrumentos son modificables durante la ejecución del programa, sin la necesidad de volver a compilar, aunque tienen un valor por defecto al iniciar el programa, que se considera el valor óptimo, para que luego el usuario modifique a gusto dichas variables. Se pueden modificar cosas como el tiempo de ataque de la envolvente o de la I(t), los parámetros
Los instrumentos sintetizados (con su respectivo método) fueron:
- Clarinete (FM)
- Fagot/Basoon (FM)
- Saxofón (DFM)
- Oboe (DFM)
- Trompa Francesa (DFM)
- Clavicordio/Harpsichord (DFM)
- Órgano (DFM)
- Trompeta (DFM)
El clavicordio, al ser un instrumento de cuerda, debe cambiarse la envolvente para que tenga un attack rápido, sin sustain y solo se tenga decay, de la siguiente forma:
El órgano sin embargo no suena de forma adecuada, por lo que se piensa que agregando efectos como flanger puede llegarse a una sintetización más coincidente con la realidad.
Para realizar la síntesis por muestras, primero se obtuvieron algunas muestras de los instrumentos Saxo Tenor, Saxo Soprano y Piano espaciadas en un rango de entre 20 y 100 (nota midi) aproximadamente para piano, con un espaciado intermedio aproximado de 7 notas midi. Para los Saxo se consiguieron muestras de entre 58 y 102 aproxiadamente.
La idea es que el programa precompute las notas intermedias restantes utilizando las muestras más cercanas para no distorsionar tanto el sonido.
Las dos funciones principales son pitch_shift
y time_stretch
de la librería librosa
, utilizada para música y análisis de audio. Veremos la lógica interna de estas funciones a continuación:
La función time_stretch
en librosa
cambia la velocidad de una señal de audio sin afectar su tono. Hace esto usando una técnica llamada vocoder de fase. Aquí está una explicación paso a paso de cómo funciona:
-
Short Time Fourier Transform (STFT): La función primero calcula la transformada de Fourier a corto plazo (STFT) del audio de entrada. La STFT es una forma de analizar el contenido de frecuencia de una señal a lo largo del tiempo. Hace esto dividiendo la señal en segmentos temporales y calculando la transformada de Fourier de cada segmento. El resultado es una matriz 2D donde una dimensión representa el tiempo (cada segmento) y la otra dimensión representa la frecuencia para cada segmento temporal. De hecho un espectrograma consiste en hacer una STFT.
-
Phase Vocoder: Luego, la función aplica un vocoder de fase al output de la STFT. El vocoder de fase es una técnica para cambiar la velocidad de una señal sin afectar su tono. Hace esto modificando las fases del STFT interpolando información presente en los dominios de frecuencia y tiempo de las señales de audio mediante el uso de la información de la STFT, de manera que preserva las relaciones de fase relativas entre diferentes frecuencias.
-
STFT inversa: Luego, la función calcula la STFT inversa del STFT vocoder de fase. La STFT inversa es una forma de convertir de nuevo del dominio de la frecuencia al dominio del tiempo. El resultado es el audio estirado en el tiempo.
-
La función
pitch_shift
enlibrosa
realiza un cambio de tono cambiando la velocidad del audio y luego remuestreándolo a la tasa de muestreo original: -
Estiramiento de tiempo: La función primero realiza un estiramiento de tiempo en el audio de entrada usando la función
time_stretch
explicada anteriormente. -
Remuestreo: El audio estirado en el tiempo se remuestrea con la tasa de muestreo original y se hace una interpolación. El remuestreo es el proceso de cambiar la tasa de muestreo de una señal de audio. En este caso, la tasa de muestreo se incrementa si el audio se aceleró y se disminuye si el audio se ralentizó. Esto devuelve la velocidad del audio a su valor original, pero el tono permanece cambiado.
Entonces, en resumen, la función pitch_shift
cambia el tono del audio acelerándolo o ralentizándolo y luego remuestreándolo a la velocidad original.
En esta sección se va a explicar cada efecto implementado
La implentación del eco fue la siguiente
En donde la función transferencia es
donde la respuesta al escalon esta dada de la siguiente forma
donde esta repetción se da las veces preestablecidas por el usuario.
La implemtentacón de este es similar a la del eco simple, siendo el diagramas de bolques y la función transferencia iguales al caso anterior, la unica diferencia es que el usuario puede selecciónar el tiempo de delay en el cual arranquen las reverberaciones.
Este efecto se basa en convolucionar el sonido de entrada con la respuesta al escalón de una habitación, también llamados RIR. Al hacer esto se puede simular el sonido en esa habitación.
donde
La implentación esta basada en el siguiente esquema
Esta es su ecuación en diferencias
donde
La implementación es similar a la del Flanger, teniendo un diagrama en bloques parecido.
Es la implementación en paralelo de 4 chorus, donde el delay de cada uno va entre 10
Donde
Al sumar notas, se puede dar el caso de que la amplitud del sea mayor al valor máximo,
Se encontró en una patente un algoritmo en el cual se tiene un arreglo de valores, los cuales deben estar limitados entre
El método consiste en analizar por separado el arreglo, en fragmentos de tamaño N. Se usa además otro arreglo auxiliar que son los M valores que le siguen al fragmento. Se encuentran los valores de los picos de amplitud (
Para cada una de las secciones se calcula un factor de escala que será función de la posición en el arreglo, y será una recta. Ésta recta dependerá de: qué tanto se pase el valor máximo de
Por otra parte, si no se pasa nunca el valor de
- The Synthesis of Complex Audio Spectra by Means of Frequency Modulation
- Automated ParameterOptimization for Double FrequencyModulation Synthesis Using the Genetic Annealing Algorithm
- Frecuencia de las notas
- DIGITAL SYNTHESIS MODELS OF CLARINET-LIKE INSTRUMENTS INCLUDING NONLINEAR LOSSES IN THE RESONATOR
- Frequency Modulation Basics
- Digital Synthesis of Musical Sounds
- Real-Time Audio Processing by Means of FM Synthesis Parameters
- WELSH’S SYNTHESIZER COOKBOOK
- Saxophone acoustics: an introduction
- Basoon First Notes
- Synthesis of Wind-Instrument Tones
- Musical aero-acoustics of the clarinet
- Method and apparatus for scaling signals to prevent amplitude clipping