Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
1/151
Transformada de Fouriery la librería de FFTW3
2/151
Transformada de Fourier
● En 1807, Fourier propuso una solución a una ecuación conocida como “La Ecuación de Calor”.
● Esta ecuación trataba de describir la manera en la que el calor se distribuía en una placa de metal, dada la existencia de fuentes de calor conocidas.
● Era una ecuación diferencial parcial parabólica, que en ese entonces no tenía solución.
3/151
Transformada de Fourier
● Antes de Fourier, soluciones particulares para esta ecuación habían sido propuestas.
● Sólo aplicaban si la fuente de calor se comportaba como una onda.– Dícese, si se comportaba como una señal que
oscila a una única frecuencia, como una función de seno o coseno.
4/151
Transformada de Fourier
● Fourier generalizó dichas soluciones de la siguiente manera:
● Varias ondas sumadas entre si pueden ser utilizadas para representar cualquier señal periódica.
● Y así, se inventaron las Series de Fourier.
5/151
6/151
7/151
8/151
9/151
10/151
11/151
12/151
13/151
● F es la señal f transformada al dominio de la frecuencia.● ω
n son las frecuencias de las ondas que, al sumarse, representan a f.
● F(ωn) es la magnitud de la onda que oscila con frecuencia ω
n.
F̂ (ω1)
ω1
F̂ (ω2) F̂ (ω3) F̂ (ω4) F̂ (ω5) F̂ (ω6)ω2 ω3 ω4 ω5 ω6
14/151
¿Para qué?
● Permite representar una señal, cualquier señal, en otro dominio.
● Es la misma señal, sólo que es vista de dos puntos de vista (o “dominio”) diferente.
15/151
16/151
t
ω
17/151
Pero, podemos hacer muchas cosas en el dominio del tiempo... es cómodo y bonito.
¿Para qué necesitamos irnos al dominio de la frecuencia?
18/151
Señal de Ruido
???
19/151
Señal de Ruido Removida
Por medio de hacer 0 a la magnitud de la señal a esa frecuencia.
Filtrado por frecuencia o filtrado espectral.
La señal en el dominio de la frecuencia es también conocido como su espectro.
20/151
Representación de Ondas
21/151
● F es la señal f transformada al dominio de la frecuencia.● ω
n son las frecuencias de las ondas que, al sumarse, representan a f.
● F(ωn) es la magnitud de la onda que oscila con frecuencia ω
n.
F̂ (ω1)
ω1
F̂ (ω2) F̂ (ω3) F̂ (ω4) F̂ (ω5) F̂ (ω6)ω2 ω3 ω4 ω5 ω6
22/151
Representación de Ondas
● Una onda puede ser representada con un coseno, con un seno, o con un exponencial, ya que la fórmula de Euler indica que:
● Donde e es el número Euler, que es la base del logaritmo natural, y se calcula con la siguiente serie:
● Se puede redondear a 2.71828.
e ix=cos (x )+i sin (x )
e=1+11+
11∗2
+1
1∗2∗3+
11∗2∗3∗4
⋯
23/151
Representación de Ondas
● Representar una onda con exponenciales nos brinda la posibilidad de simplificar las ecuaciones bastante.
● Por ejemplo, podemos representar una onda sω1 que oscila a una frecuencia ω1 y con una magnitud cω1 así:
sω1( t )=cω1
e iω1 t
24/151
¿Qué es ω?
● Es la “frecuencia angular”: radianes por segundo.
● Recordemos que el exponencial es realmente una sumatoria de un coseno y un seno que reciben como entrada un ángulo.
25/151
Relación entre ω y ζ
● La frecuencia en Hertz (ζ) representa periodos por segundo.
● Si cada periodo de una onda senoidal es 2π radianes, entonces:
ω = 2πζ
26/151
Cálculo de la Transformada de Fourier
27/151
La Transformada es una Sumatoria
● Una señal discreta se puede considerar como un arreglo de muestras de energía.
● Por lo tanto, según Fourier, deberíamos de poder representar cualquier momento en el tiempo de una señal como una sumatoria de las energías en ese momento de otras señales periódicas.
28/151
Mapeo Formalde Frecuencia a Tiempo
Donde:• t es un momento en el tiempo en segundos• f(t) es la energía de la señal en el momento t• N es el número de señales periódicas con las cuales queremos representar a f(t)
• ωn es la frecuencia de la señal n.
f (t )=1N∑n=1
N
F̂ (ωn)e iωn t
29/151
¿Mapeo?
● El valor f(t) es cálculado con todos los valores del dominio de la frecuencia F(ωn). Esto significa dos cosas:– El tamaño de la señal en el dominio de la
frecuencia es la misma que en el dominio del tiempo.
– Y como todo mapeo, se puede hacer en dirección inversa: calculando un F(ωn) con todos los valores del dominio del tiempo f(t).
30/151
Mapeo Formalde Tiempo a Frecuencia
Donde:• t es un momento en el tiempo en segundos• f(t) es la energía de la señla en el momento t• T es el tiempo final de f(t)• ω
n es la frecuencia de la señal n.
F̂ (ωn)=1T∑t=0
T
f ( t)e−iωn t
31/151
Versión Continua
● Lo que estamos viendo realmente es la Transformada Discreta de Fourier.– Ya que es la que nos es más relevante.
● Recordatorio: una sumatoria de los valores de un señal es equivalente a una integral (área bajo la curva).
● Por lo tanto, la versión Continua de esta transformada (la original) se puede obtener substituyendo las sumatorias por integrales.
32/151
Versión Continua
F̂ (ω)=1T∫
0
T
f (t)e−i ωt dt
f (t )=1N∫0
N
F̂ (ω)ei ωt d ω
33/151
Versión Continua (en Hertz)
F̂ (ζ )=∫ f (t)e−i2 πζ tdt
f (t )=∫ F̂ (ζ)e i2π ζ td ζ
34/151
Componente DC
F̂ (0)=1T∑t=0
T
f ( t)e−i0 t
=1T∑t=0
T
f (t)
Es el promedio de la energía de la señal en el periodo.
35/151
Componente DC
36/151
Componente DC
37/151
Componente DC
Ciclo de Trabajo: 50%
38/151
Componente DC
Ciclo de Trabajo: 25%
39/151
Componente DC
Ciclo de Trabajo: 75%
40/151
Propiedades de la Fórmula de Euler
eix+e−ix=cos(x)+i sin (x)+(cos(−x)+i sin (−x))=cos(x)+i sin(x)+cos(−x)+i sin(−x)=cos(x)+i sin(x)+cos(x)−i sin(x)=2cos(x)
eix=cos(x)+i sin (x)
cos(x)=ℜ(eix)=12(e ix+e−ix)
41/151
Propiedades de la Fórmula de Euler
eix−e−ix=cos(x)+i sin (x)−(cos(−x)+i sin (−x))=cos(x)+i sin (x)−cos(−x)−i sin (−x)=cos(x)+i sin (x)−cos(x)+i sin (x)=i2sin (x)
eix=cos(x)+i sin (x)
sin (x)=ℑ(eix)=1i2
(eix−e−ix)
42/151
Propiedades de la Fórmula de Euler
cos(x)⋅cos( y)=12
(eix+e−ix)⋅12
(eiy+e−iy)
=14
(eix eiy+e ixe−iy+e−ix eiy+e−ixe−iy)
=14
(ei (x+ y )+ei(x− y )+e−i(x+ y )+e−i (x− y ))
=14
(ei (x+ y )+e−i(x+ y )+ei (x− y )+e−i (x− y ))
=12
(12
(ei (x+ y )+e−i(x+ y ))+12
(ei (x− y )+e−i (x− y )))
=12
(cos(x+ y)+cos(x− y))
43/151
Propiedades de la Transformada de Fourier
δ(t) →F→ 1
44/151
Propiedades de la Transformada de Fourier
1 →F→ δ(ζ)
45/151
Propiedades de la Transformada de Fourier
x(t−t0) →F→ X (ζ)e−i2πζ t0
x(t)
x(t-t0)
t0
46/151
Propiedades de la Transformada de Fourier
rec (t ) →F→ sinc (ζ)
47/151
Propiedades de la Transformada de Fourier
sinc (t) →F→ rect (ζ)
48/151
Propiedades de la Transformada de Fourier
tri(t ) →F→ sinc2(ζ)
49/151
Propiedades de la Transformada de Fourier
x(t )∗y (t ) →F→ X (ζ)Y (ζ)Convolución
Corr (x (t) , y (t)) →F→ X (ζ)Y H (ζ)Correlación
x(At ) →F→1AX (ζ / A)Escala de Tiempo
e−At2
→F→ √π2e−(πζ)
2/AGuassiana
50/151
Algunas Consideraciones
● Las series de Fourier pueden representar cualquier señal periódica.
● La transformada de Fourier asume que la señal tiene un periodo infinito.
● Sólo tiene una limitante del tipo de señal que puede transformar:– Que tenga energía finita.– Si fuera infinita, sería imposible calcular el
componente DC.
51/151
Algunas Consideraciones
● La transformada de Fourier puede transformar señales discontinuas:– Pero esto resulta en tratar de aproximar la
discontinuidad insertando armónicos.
52/151
Problemas que Considerar
53/151
Problema #1
● ¿Con cuáles frecuencias representamos a una señal?
● Harry Nyquist y Claude Shannon introdujeron un teorema que dice que: “para determinar completamente una señal con un ancho de banda conocido, se debe muestrear con una onda que tenga una frecuencia mayor al doble de su frecuencia máxima”.
54/151
Problema #1
● Mejor dicho:– “Si una señal es muestreada con una frecuencia
ωs, entonces la frecuencia máxima que puede ser
representada en el dominio de Fourier es ωs/2”.
55/151
● Tenemos una señal f muestreada de 48000 Hz.● Si ω
6 es su máxima frecuencia, entonces ésta debe ser 24000*(2π).
● El resto de las ωn están espaciadas uniformemente de ahí para atrás.
F̂ (ω1)
ω1
F̂ (ω2) F̂ (ω3) F̂ (ω4) F̂ (ω5) F̂ (ω6)ω2 ω3 ω4 ω5 ω6
56/151
Problema #2
● Si la formula de Euler es:
● Y la transformada dice que:
● Entonces F(ωn) es un número complejo.
e ix=cos (x )+i sin (x )
F̂ (ωn)=1T∑t=0
T
f ( t)e−iωn t
57/151
Números Complejos
● Un número complejo es la sumatoria de dos valores: uno real y uno imaginario.
F̂ (ωn)=xn+ iynAl visualizar la señal en el dominio de frecuencia, usualmente lo que vemos es la magnitud de F(ω
n):
∣F̂ (ωn)∣=√ xn2+ yn
2
58/151
Números Complejos: Fase
● La “fase” de la frecuencia es el ángulo del número complejo (fácilmente calculado con atan2 en C).
F̂ (ωn)=xn+ iyn
59/151
Números Complejos
● Es crucial recordar esto al estar manipulando las magnitudes en tiempo real.
● Se pueden hacer restas, multiplicaciones, etc. pero se tienen que hacer considerando que dichas operaciones serán sobre números complejos.
60/151
No me toquen la fase...
● Ejemplo de cancelación de ruido: tienen la firma espectral del ruido (E), y quieren restarla de la entrada (X) para sacarla a la salida (Y).– Todo en el dominio de la frecuencia.
● Es tentador hacer:
Y (ωn)= X (ωn)−E (ωn)
61/151
Pero...
● Esto equivale a:
ℑ(Y (ωn))=ℑ(X (ωn))−ℑ(E (ωn))
ℜ(Y (ωn))=ℜ(X (ωn))−ℜ(E (ωn))
62/151
Lo cual puede modificar la fase
ℑ(X−E )
ℑ
ℜ
ℑ(X )
ℜ(X )ℜ(X −E )
63/151
Realmente queremos esto
(|X|−|E|)sin (θ)
ℑ
ℜ
ℑ(X )
ℜ(X )
θ
(|X|−|E|)cos (θ)
64/151
NO ME TOQUEN LA FASE
Aωn=|X (ωn)|−|E (ωn)|θωn
=θ(X (ωn))
Y (ωn)=Aωncos (θωn
)+ i Aωnsin(θωn
)
65/151
Problema #2.5
● El resultado de la Transformada Inversa también es un número complejo:
f (t )=1N∑n=1
N
F̂ (ωn)e iωn t
66/151
Problema #2.5
● No es un problema realmente, ya que la energía en el tiempo se presenta en la parte real del número calculado:
f (t ) ← ℜ( f ( t))=x t
f (t )= x t+iy t
Por lo que el resultado final, realmente es un número real, común y corriente.
67/151
Problema #3
● MITO: Si el tamaño de la señal en tiempo es la misma que la señal en frecuencia, entonces una señal de 1024 puntos en el tiempo tendrá 1024 puntos de frecuencia.
● Cierto y falso. Sí, serán 1024 puntos de frecuencia, pero no todos representan a una frecuencia única.
68/151
La Transformada Inversa
● Habíamos dicho que la transformada inversa es:
f (t )=1N∑n=1
N
F̂ (ωn)e iωn t
69/151
La Real Transformada Inversa
● La verdadera transformada inversa es la siguiente:
● Sí, hay tal cosa como “frecuencias negativas”, porque Fourier quiso realmente fregar nuestras mentes.
f (t )=1
2N∑n=−N
N
F̂ (ωn)ei ωn t
70/151
El Resultado de la Transformada de Fourier
ω1 ω2 ω3 ω4 ω5 ω6−ω1−ω2−ω3−ω4−ω5−ω6
Este espejeo tiene que ver con el cálculo de las partes imaginarias y las partes reales de la Transformada de Fourier y los famosos “Círculos de Harmónicos”, ilustrados brevemente en el video “FourierCircles.mp4” de la página del curso.
71/151
Lo que normalmente se nos entrega en las implementaciones de Fourier:
No sé por qué, honestamente.
Supongo que es más sencillo manejar los índices de al principio del vector.
También, cabe mencionar que...
ω1 ω2 ω3 ω4 ω5 ω6 −ω1−ω2−ω3−ω4−ω5−ω6
72/151
El Componente DC
DC, al estar programando se le asigna una frecuencia de 0 Hz.
Representa el “centro” de la señal en el eje vertical. Las señales de audio normalmente están centradas en 0, por lo que esta componente no “sale” en al visualizar la señal en el dominio de la frecuencia, pero se tiene que considerar.
Por lo tanto...
ω1 ω2 ω3 ω4 ω5DC ω6 −ω1−ω2−ω3−ω4−ω5
73/151
Esto es con lo que vamos a trabajar:
CONCLUSIÓN: El resultado de transformar una señal de 1024 puntos en el tiempo es una señal con 1024 puntos en frecuencia “espejeados”, realmente calculando 512 puntos útiles.
POR LO TANTO: al manipular el valor en una frecuencia, se tiene que manipular, de la misma manera, su contraparte en el “espejo” de la señal en el dominio de la frecuencia.
ω1 ω2 ω3 ω4 ω5DC ω6 −ω1−ω2−ω3−ω4−ω5
74/151
Problema #4
● Fourier propuso que “varias ondas sumadas entre si pueden ser utilizadas para representar cualquier señal periódica.”
● ¿Qué sucede si nuestra señal no es periódica?
75/151
Problema #4
● Hacemos trampa: suponemos que nuestra señal tiene un periodo del tamaño de la señal.
● Para que esto funcione adecuadamente, tenemos que cerciorarnos que nuestra señal comience y termine con valores no discontínuos.
76/151
Problema #4
SeñalLo que la Transformada ve Resultado
77/151
Problema #4
SeñalLo que la Transformada ve Resultado
78/151
Problema #4
SeñalLo que la Transformada ve Resultado
Sangrado de Frecuencias(Frequency Bleed Over)
79/151
¿Sangrado de Frecuencias?
Es la mejor traducción que se me ocurrió a Frequency Bleed Over.
● Básicamente, se requiere de la presencia de otras señales periódicas para poder representar discontinuidades.
● Esto no es bueno, porque se insertan frecuencias que no están en nuestra señal original.
80/151
Hann
● Hay varias formas de hacer continuos los puntos iniciales y finales de la señal.
● Forma Popular: multiplicando, punto a punto, a la señal por la función Hann.
● En este ejemplo, T es 200.
w (t )=0.5 (1−cos(2 π tT−1
))
81/151
Problema #4
SeñalLo que la Transformada ve Resultado
82/151
Problema #4
SeñalLo que la Transformada ve
El sangrado se minimiza
Resultado
83/151
Problema #5
● Si T en la ecuación de la Transformada es el “tiempo final de la señal en el dominio del tiempo”:
● Se necesita de toda la señal para llevar a cabo su transformación.
● ¿Y en tiempo real cómo le hacemos?
F̂ (ωn)=1T∑t=0
T
f ( t)e−iωn t
84/151
Transformada de Tiempo Corto
● En vez de transformar toda la señal, transformamos “trozos” de la señal.
● Estos trozos son conocidos como ventanas.● Se transforman una tras otra, como vayan
llegando.● Así T se convierte en el “tiempo final de la
ventana”.
85/151
Transformada de Tiempo Corto
● Uno estaría tentado a solamente partir la señal en dichas ventanas, transformar cada ventana, modificar la ventana en el dominio de la frecuencia, y transforma en inversa.
● Pero, recuerden el Problema #4: tenemos que aparentar como si la señal (o, en este caso, la ventana de la señal) fuera periódica:– Hacer que los puntos del tiempo inicial y final no
sean discontinuos
86/151
Problema #5.5
● Entonces, multiplicamos por Hann cada ventana, la transformamos, la modificamos en frecuencia, y la transformamos de inversa.
¿No?
● El resultado de esto es tener varias ventanas multiplicadas por Hann una tras otra.
87/151
FFT
IFFT
Ventaneo
Modificaciónen Frecuencia
88/151
Problema #5.5
● Al hacer esto, tendremos una señal que sube y baja de volumen artificialmente.
● SOLUCIÓN: sobrelape.
89/151
Sobrelape
● Una virtud de una función Hann larga es que, al sumar la segunda mitad de la función con la primera, obtenemos una señal con una magnitud casi constante.
90/151
Sobrelape
● Normalmente ventanearíamos, con ventanas de tamaño T:– [1 T], [T+1 2T], [2T+1 3T], etc.
● Pero si ventaneamos de esta manera:– [1 T], [T/2+1 3T/2], [T+1 2T], [3T/2+1 5T/2] ,etc.– Nuestra ventanas siguen siendo de tamaño T,
pero comenzamos cada T/2, en vez de cada T.
91/151
Esto es lo que veíamos en baudline, en la ventana del tiempo.
92/151
Resultado de Sumatoria
93/151
Sobrelape
● Este proceso se le conoce como “Sobrelapa-y-Suma” (overlap-and-add).
● Se puede con otro tipo de funciones como:– Función Hamming (con 50% sobrelape)– Función Blackman (con 33% sobrelape)
● Todos con sus pros y cons, pero Hann es una de las funciones más populares para llevarlo a cabo.
94/151
Pero...
● No es EXACTAMENTE la misma señal, porque siempre hay una ondulación en el resultado del sobrelape.
Hay ondulación, aunque pequeña.
95/151
Hann Periódica
● La ventana que vimos anteriormente es conocida como la versión simétrica de Hann.
● La versión periódica tiene la virtud de que al hacer sobrelape, es exactamente igual a 1.
w (t )=0.5 (1−cos(2 π tT−1
)) w (t )=0.5 (1−cos(2π tT
))
96/151
Pero...
● Cualquier modificación en el dominio de la frecuencia cambia la energía de la señal.– Esto impacta directamente al componente DC.
Normal DC Offset
97/151
¿Cambiamos el DC?
● Es tentador entonces también cambiar el DC antes de regresar al dominio del tiempo.
● Pero este valor se calcula con la información del tiempo, no con la información frecuencial.
● Entonces, no modifiquen el DC.● Y para evitar el problema del DC offset:
98/151
La solución:Weighted Overlap-and-Add (WOLA)● Aplicamos dos ventanas, una antes de ir al
dominio de la frecuencia (análisis) y otra al regresar al dominio del tiempo (síntesis).– La ventana de análisis quita las discontinuidades
en el dominio del tiempo para evitar el sangrado de frecuencia.
– La ventana de síntesis quita las discontinuidades entre ventanas al regresar al domino del tiempo.
99/151
Requisito
● Ambas ventanas, en conjunto, tienen que satisfacer la siguiente condición para que WOLA sea equivalente al overlap-and-add normal:
y (n)= x (n)∑t
w( t)v (t )
∑t
w (t)v ( t)=1
w: ventana de análisis antes de ir al dominio de la frecuenciav: ventana de síntesis después de regresar al dominio del tiempox: la entrada de sobrelape-y-sumay: la salida de sobrelape-y-sumat: índice de tiempo en las ventanasn: índice de tiempo en las señales de entrada y salida
100/151
Selección de Ventanasde Análisis y de Síntesis
● Popularmente, se utiliza la raíz cuadrada de la ventana de Hann periódica para ambas la ventana de análisis y de síntesis :
● De esta manera, aplicar ambas ventanas en conjunto es equivalente a aplicar una ventana de Hann periódica.
w (t )=v (t)=√0.5(1−cos (2 π tT
))
101/151
Selección de Ventanasde Análisis y de Síntesis
● Se pueden utilizar otras ventanas, con su pros y contras. Y aún si no cumplen con el requisito de singularidad, se puede forzar que se cumpla compensando la salida con:
● Pero esto no es necesario con la raíz cuadrada de Hann periódica.
y (n) ← y (n)T /2
∑t
w( t)v (t )
102/151
Independientemente, el resultado de la Transformada de Tiempo Corto de Fourier es:
Una serie de ventanas de tiempotransformadas al dominio de frecuencia.
103/151
Espectrograma
tiempo
frecuencia
magnitud
v1 v
2 v3 v
4
vw
105/151
Ahora,
¿cómo programamos todo esto?
106/151
Nuevo mejor amigo: FFTW3
● FFT significa “Fast Fourier Transform”.
– La transformada original suma señales para un coeficiente que se restan en el cálculo de otros coeficientes.
– La FFT evita estas sumas redundantes, acelerando el cálculo al grado de poderse hacer en tiempo real.
● Esta “aceleración” fue propuesta por Cooley y Tukey en 1965.
● FFTW3 implementa una versión de esta “aceleración” que es una de las más usadas en aplicaciones de tiempo real.
● Sitio Oficial:
http://www.fftw.org/fftw3_doc/
107/151
Beneficios
● Muy rápida y basada en C.● Se instala facilmente con apt-get:
sudo apt-get install libfftw3-dev● Es código abierto.
– Repositorio Oficial:
https://github.com/FFTW/fftw3
108/151
Beneficios
● Implementación de números complejos compatible con la de C y la de C++.– Para C:
#include <complex.h>
– Para C++:#include <complex>
109/151
FFTW3 en C
● Se debe incluir DESPUÉS de incluir a complex.h
#include <complex.h>
#include <fftw3.h>● Para definir números complejos:
double complex● Para compilar:
gcc jack_fft.c -o jack_fft -ljack -lfftw3
110/151
Ejemplo Básico C#include <complex.h>
#include <fftw3.h>
//inicializar buffers que usa fftw3
double complex *i_fft, *i_time, *o_fft, *o_time;
i_fft = (double complex *) fftw_malloc(sizeof(double complex) * 1024);
i_time = (double complex *) fftw_malloc(sizeof(double complex) * 1024);
o_fft = (double complex *) fftw_malloc(sizeof(double complex) * 1024);
o_time = (double complex *) fftw_malloc(sizeof(double complex) * 1024);
//configurar a fftw3
i_forward = fftw_plan_dft_1d(1024, i_time, i_fft , FFTW_FORWARD, FFTW_MEASURE);
o_inverse = fftw_plan_dft_1d(1024, o_fft , o_time, FFTW_BACKWARD, FFTW_MEASURE);
… Ya adentro de la función de procesamiento de audio
… llenar a i_time con la señal de tiempo
fftw_execute(i_forward);
… modificar a i_fft para filtrar y copiar el resultado a o_fft
fftw_execute(o_inverse);
… obtener de o_time información filtrada en el dominio del tiempo
111/151Ejemplo Completo CFFTW3 ya configurado
// “in” y “out” es nuestra entrada y salida en el tiempo respectivamente// nframes es el tamaño de la ventana
for(i = 0; i < nframes; i++){i_time[i] = in[i];
}fftw_execute(i_forward);
for(i = 0; i < nframes; i++){o_fft[i] = i_fft[i];
}o_fft[3] = 0; //filtrando la tercera frecuenciao_fft[nframes-3] = 0; //espejeando dicha manipulación
fftw_execute(o_inverse);for(i = 0; i < nframes; i++){
out[i] = creal(o_time[i])/nframes; //fftw3 requiere normalizar su salida}
112/151
Espejeo en C
nframes = 12 i = 3
w3 → in[3] = in[i]
-w3 → in[9] = in[nframes – 3] = in[nframes - i]
ω1 ω2 ω3 ω4 ω5DC ω6 −ω1−ω2−ω3−ω4−ω5
0 1 2 3 4 5 6 7 8 9 10 11
113/151
FFTW3 en C++
● Se debe incluir a complex así (sin “.h”):
#include <complex>● Para definir números complejos:
std::complex<double>● Se requiere utilizar la siguiente función para hacer
casting entre los dos tipos de variables complejas:
reinterpret_cast<fftw_complex>● Para compilar:
gcc jack_fft.cpp -o jack_fft -ljack -lfftw3
114/151
Ejemplo Básico C++#include <complex>
#include <fftw3.h>
//inicializar buffers que usa fftw3
std::complex<double> *i_fft, *i_time, *o_fft, *o_time;
i_fft = (std::complex<double>*) fftw_malloc(sizeof(std::complex<double>) * 1024);
i_time = (std::complex<double>*) fftw_malloc(sizeof(std::complex<double>) * 1024);
o_fft = (std::complex<double>*) fftw_malloc(sizeof(std::complex<double>) * 1024);
o_time = (std::complex<double>*) fftw_malloc(sizeof(std::complex<double>) * 1024);
//configurar a fftw3
i_forward = fftw_plan_dft_1d(1024, reinterpret_cast<fftw_complex*>(i_time), reinterpret_cast<fftw_complex*>(i_fft), FFTW_FORWARD, FFTW_MEASURE);
o_inverse = fftw_plan_dft_1d(1024, reinterpret_cast<fftw_complex*>(o_fft), reinterpret_cast<fftw_complex*>(o_time), FFTW_BACKWARD, FFTW_MEASURE);
… Ya adentro de la función de procesamiento de audio
… llenar a i_time con la señal de tiempo
fftw_execute(i_forward);
… modificar a i_fft para filtrar y copiar el resultado a o_fft
fftw_execute(o_inverse);
… obtener de o_time información filtrada en el dominio del tiempo
115/151Ejemplo Completo C++FFTW3 ya configurado
// “in” y “out” es nuestra entrada y salida en el tiempo respectivamente// nframes es el tamaño de la ventana
for(i = 0; i < nframes; i++){i_time[i] = in[i];
}fftw_execute(i_forward);
for(i = 0; i < nframes; i++){o_fft[i] = i_fft[i];
}o_fft[3] = 0; //filtrando la quinta frecuenciao_fft[nframes-3] = 0; //espejeando dicha manipulación
fftw_execute(o_inverse);for(i = 0; i < nframes; i++){
out[i] = real(o_time[i])/nframes; //fftw3 requiere normalizar su salida}
116/151
Tamaño de Ventana
● Para que la aceleración de FFTw3 funcione, es esencial que el tamaño de ventana sea una potencia exacta de 2:– T = 2x, donde x es un número entero.
● 1024 y 2048 satisfacen esta condición.● Además de que es compatible con las necesidades de
sobrelape de la función Hann.
117/151
Tamaño de Ventana
● Si no cumple con esa condición, se requiere que los datos se “expandan” a potencia exacta de 2 más cercana y mayor, llenando con ceros los que sobran.
● Ejemplo:
– Tamaño de ventana, T: 5 → [1 2 3 4 5]– Potencia exacta de 2 más cercana: 8– Nueva ventana con T:8 → [1 2 3 4 5 0 0 0]
● No le quita exactitud al proceso ni al ventaneo.
118/151
Ejemplos Completos
● En la página del curso están ejemplos completos en los que una ventana (o, periodo) de JACK es convertida y regresada al tiempo sin hacerle nada y sin ventaneo.– En C: jack_fft.c– En C++: jack_fft.cpp
● Compilen y verifiquen que funciona.
119/151
ADVERTENCIA
● Este código no está haciendo nada con la información.– Sólo se va al dominio de la frecuencia y regreso al
dominio al tiempo.
120/151
Ejercicio #1
● Filtren todas las frecuencia menores a 500 Hz.● ¿Cómo sabemos en cual índice de o_fft se
ubican dichas frecuencias?● Recuerden verificar su salida con baudline.
● Si hacemos este filtrado, ¿cómo se escucha? ¿Por qué?
121/151
Ejercicio #2
● Hacer un filtro pasa-banda.● Frecuencia mínima y máxima proporcionados
por el usuario.– Usen el sistema de argc y argv para obtenerlos.
122/151
Sobrelapa-y-Suma
● No lo estamos haciendo todavía.– Seguro escucharan “brincos” entre las ventanas.
● FFTW3 nada más proporciona la conversión e inversa de la transformada.
● El ventaneo lo tenemos que hacer nosotros.● Recuerden utilizar una ventana de tamaño
igual a una potencia exacta de 2.
123/151
RecomendaciónSobrelape-y-Suma
● El tamaño de ventana de JACK, no tiene que ser igual a la ventana que alimentamos a Fourier:
● Utilicen una ventana de Fourier que es el doble de largo que la de JACK.
Ventana de Fourier/Hann
Ventana de JACK
Ventana de Fourier/Hann
124/151
out
in
b2
b1
125/151
out
in
b2
b1
126/151
out
in
b2
b1
127/151
+
out
in
b2
b1
128/151
out
in
b2
b1
129/151
out
in
b2
b1
130/151
out
in
b2
b1
131/151
Examen Parcial
● Hacer un agente de JACK que atrasa (o desfasa) la señal de entrada por medio del operador de la exponencial imaginaria, con un argumento en segundos.
● Ejemplo:
./programa 0.005
Atrasa/desfasa la señal por 0.005 segundos.
132/151
Desfase por Medio de Exponencial Imaginaria
● Hasta ahorita, hemos desfasado las señales de una manera bastante artificial:– Quitando muestras de un lado de la señal, y
agregamos ceros.
133/151
Desfase por Medio de Exponencial Imaginaria
● Otra forma de desfasar, es por medio de multiplicar la señal transformada Fourier por una exponencial:
g(t−T )=F−1(G(t )e−i2π ζT )
Donde:g: señal que vamos a desfasarG: transformada de Fourier de la señal gT: tiempo en segundos por la que vamos a desfasar la señalζ: la frecuencia que vamos a desfasar
134/151
Desfase de Señal en Frecuencia
x(t−T ) →F→ X (ζ)e−i2πζ T
x(t)
x(t-T)
T
135/151
¿Frecuencia?
● Estamos desfasando, algo que sucede en el tiempo. ¿Como es que una frecuencia está involucrada?
● Esta transformación realmente sólo desfasa los datos de la señal que pertenecen a dicha frecuencia.
● Por lo que si queremos desfasar a TODA la señal, tenemos que aplicar esta transformación a todas sus frecuencias.– Incluyendo las negativas, con su valor negativo.
136/151
Desfase por Medio de Exponencial Imaginaria
● A todas las frecuencias se le aplica esto:
g(t−T )=F−1(G(t )e−i2π ζT )
Donde:g: señal que vamos a desfasarG: transformada de Fourier de la señal gT: tiempo en segundos por la que vamos a desfasar la señalζ: la frecuencia que vamos a desfasar
137/151
¿Para qué tanto lío?
● Estábamos desfasando las señales de una manera sencilla.
● ¿Para qué complicarnos la vida?
● Varias razones, pero la que nos interesa por ahora es que así podemos desfasar una señal a nivel segundos, no a nivel muestra...
138/151
Desfase por Medio de Exponencial Imaginaria
● Es decir...
g(t−T )=F−1(G(t )e−i2π ζT)
Donde:g: señal que vamos a desfasarG: transformada de Fourier de la señal gT: tiempo en segundos por la que vamos a desfasar la señalζ: la frecuencia que vamos a desfasar
139/151
Tiempo
● Fourier hace un tipo de extrapolación inter-muestra, lo cual hace esta forma mucho más precisa que hacerlo en el dominio del tiempo.
● Esto es importante cuando estemos haciendo localización y beamforming.
140/151
Propiedades de este Desfase
Bidireccionalidad.● El signo del término T indica el tipo de desfase:
– Si T > 0: desfase positivo.– Si T < 0: desfase negativo.
141/151
Espera...
● ¿Desfase negativo? O sea, ¡¿adelantar la señal?!– ¿No viola eso algún tipo de ley del mundo físico?
● Al estar haciendo sobrelape, sacamos a la salida ventanas pasadas.– Todos los desfases que hagamos son en el pasado.– Un desfase negativo sólo desfasa menos que uno
positivo.
142/151
Propiedades de este Desfase
Ciclicidad.● Por estar aplicando una onda senoidal, el
desfase es cíclico.● Dícese: los valores que están al final, que
normalmente tacharíamos como “inválidas”, son puestos al principio.
143/151
Ciclicidad del Desfase por Frecuencia
● Con un desfase positivo, usando dos ventanas para el proceso de overlap-and-add tendríamos:
● Lo contrario sucede con un desfase negativo.● Esto introduce discontinuidades sólo haciendo
sobrelapa-y-suma con Hann.
144/151
Esto lo resolvemos con una técnica que ya conocen...
145/151
Solución: WOLA
● Así es: WOLA reduce considerablemente el efecto de esta ciclicidad en el resultado final.
● Pero tiene sus límites:
146/151
Límite #1
● Re-aparece la ondulación ala Hann simétrica:– Pero ahora a lo largo de varias ventanas.– Y es proporcional a la cantidad de desfase.
Hay ondulación a lo largo de varias ventanas.
147/151
Límite #2
● Sólo maneja desfases menores a media ventana.
● Desfases mayores se “ciclan” a desfases menores.– Si la ventana es de 100 ms, un desfase de 75 ms.
resulta en uno de 25 ms.
148/151
Recomendación
● Sólo lleven a cabo desfases menores a media ventana de JACK.– La ondulación es casi imperceptible.– No se experimenta ciclicidad de desfases.
149/151
Pero...
● Si queremos desfases mayores, necesitamos utilizar ventanas de JACK y Fourier más grandes.– Lo cual requeriría re-configurar a JACK.
● Aún así...
150/151
Media ventana es bastante...
● Si muestrean a 48 kHz, con una ventana de 1024 muestras:– Media ventana es alrededor de 0.01 s.– La velocidad del sonido es 343 m/s.– El sonido recorre 3.43 m. en 0.01 s.
151/151
Esto es más que suficiente...
● Si queremos compensar por el desfase entre dos micrófonos, sólo necesitan estar a una distancia menor de 3.43 m.– Esto es muy viable para nuestros propósitos.
● Por lo tanto, realmente sólo nos interesan desfases pequeños.– Lo cual vamos corroborar en las siguientes
sesiones.
152/151
Comentarios delExamen Parcial
● Ya que los desfases serán pequeños e imperceptibles por nuestro oído:– Deberán revisar con baudline el resultado del desfase.
● Se recomienda tener dos salidas:– Una con la señal de “referencia”, en el que se hace el
sobrelape pero sin aplicar los operadores de desfase.– Otra con la señal desfasada, en el que se hace el
sobrelape y aplicando los operadores de desfase.