2 Se han escogido las frecuencias centrales a partir del tamaño de la ventana L. IMPLEMENTACIÓN PRÁCTICA DE UN BANCO DE FILTROS
UNIFORME
En este tipo de bancos, la forma de la respuesta espectral de cada uno de los filtros es la misma, y su frecuencia central se raparte de manera uniforme en el espectro:
donde N es el número de filtros del banco
La respuesta de uno cualquiera de lis filtros del banco viene dada por la ecuación:
S’Q Salida del filtro Q
h(n) Filtro
s(n) Señal
L Tamaño de la ventana del filtro
0 # n # L-1
El factor NT es a priori desconocido, lo que hace inviable la programación directa
de esta función. Sin embargo, si se restringen las frecuencias centrales de los filtros a un número o conjunto menor, entonces sí es posible este cálculo. Se renuncia así a que kQ pueda tomar cualquier valor dentro del intervalo [0,NT-1],
valores que a priori corresponderían a las frecuencias:
Seleccionando, en cambio, frecuencias centrales del tipo:
(Ver nota 2) entonces
f
i
f
N
i=
m′ =
−
= −∑
S
Qh m s n m
m L( ) (
)
0 1f
i
f
L
k
f
N
k i
N
L
i m m T T=
=
⇒
=
3 El cociente N
T/L debe ser un número entero, condición muy fácil de cumplir, si la
′
=
−
=
⇒ ′
=
−
= − = −∑
∑
S n
e
v m s n m
k
i
N
L
S n
e
v m s n m
Q j mk N m L Q T i j mi L m L Q T( )
( ) (
)
( )
( ) (
)
2 0 1 2 0 1 π πX k
x n e
j nk N n N( )
=
( )
− = −∑
2 0 1 πn m m
S n
e
v m s n m
e
v n m s m
S n
e
e
s m v n m
i j ni L j n m i L m n L n m L i j ni L j m i L m n L n− = ′
′
=
−
=
− ′
′ =
′
=
′
− ′
− ′ ′= − + = − − ′ ′= − +∑
∑
∑
( )
( ) (
)
(
) (
)
( )
(
) (
)
2 2 1 0 1 2 2 1 π π π πEs decir, utilizando frecuencias de repetición múltiplos de NT/L (ver nota3).
Para analizar las consecuencias de esta elección sustituimos la relación anterior en la ecuación del filtro:
Esta ecuación sí puede programarse de forma directa para cada uno de los valores de i 0 [0,L-1]. No debemos olvidar, sin embargo, que se han escogido las frecuencias centrales en función del tamaño de la ventana L, por lo que se está limitando la resolución espectral del análisis.
Para calcular de una manera más eficiente esta expresión, podemos recurrir al algoritmo FFT, aplicable a operaciones de la forma:
f
i
f
L
i=
me
j ni L 2π REALIZACIÓN • Invertir la ventana v(m)• Aplicarla al tramo de análisis [n-L+1, n] • Ejectuar una FFT de L puntos
• Si interesa la fase de la transformada, multiplicar por el factor exponencial
Gráficamente:
CONDICIONES
• Se ha supuesto que las frecuencias centrales que interesan se relacionan con el ancho de la ventana mediante la ecuación:
• La FFT es de L puntos, y dado que habitualmente se calcula para un número de datos potencia de 2 (128, 512, 1024,...), la capacidad de elegir las frecuencias centrales es más limitada.
• Si sólo interesa la magnitud de la transformada, no se hace necesario el factor exponencial, que sólo afecta a la fase.
s(m’)v(n-m’) v(n) Opcionalmente m’=n m’=n-L+1 L
FFT
×
e
j ni L 2π s(n)Respuesta de un banco de filtros de octava.
QMF - Quadrature Mirror Filters
En muchas aplicaciones se hace necesario disponer de bancos de filtros no uniformes, tanto para voz como en audio. Por ejemplo, resulta útil la utilización de bancos de octava y de tercio de octava, en los cuales la frecuencia central y en ancho de los filtros varía logarítmicamente como se muestra en la figura:
Dos son los motivos más importantes por los que este tipo de filtros es útil en análisis de voz:
• El oído humano actúa de manera similar, por lo que la información contenida en el habla debe poder extraerse siguiendo este comportamiento.
• La energía en cada banda es del mismo orden de magnitud, debido a que la distribución media de energía espectral del habla decae logarítmicamente.
A partir de los resultados obtenidos de la FFT no es inmediato la obtención de un banco de filtros de este tipo, ya que la respuesta espectral de las ventanas no es ideal, y se produce un solapamiento entre bandas consecutivas. Esto impide sumar simplemente los resultados de ambas para evaluar el resultado que se habría obtenido con una banda de paso doble.
Un banco de filtros en cuadratura QMF-Filters se compone de un filtro paso-baja y otro paso-alta, diseñados con una respuesta espectral simétrica, tal y como se ilustra en la figura:
El filtro paso alta se obtiene a partir del filtro paso-baja desplazando en fm/2 su respuesta espectral.
• Una de las características más importantes de este tipo de filtros es que la señal original se reconstruye exactamente sumando la respuesta obtenida en ambos filtros. Esta característica permite separar en bandas sobre las que después podremos efectuar sumas, de manera que se obtengan las respuestas a cualquier tipo de filtro paso-banda.
• Un banco QMF separa el espectro de una señal en dos octavas, dos mitades de igual tamaño. Utilizándolos en cascada se puede evaluar un banco de filtros con ancho variable, tal y como se muestra a continuación:
H f0( ) H f1( )
H f H f fm
1 0
2 ( ) = ( ± )
H0( )f H f1( )= H0(f + fm 2) Una familia de filtros QMF típica es debida a Johnston, que define diversos filtros paso-baja con diferente número de coeficientes
h(n)
. Por ejemplo:FILTROS QMF JOHNSTON con 2 coeficientes
}
{
h n
0( )
=
0 5 0 5
. , .
FILTROS QMF JOHNSTON con 16 coeficientes
h
016C(n)
={ 0.006673932175391 -0.020558857650079 0.001719664424553 0.046528382618583 -0.025769744024058 -0.099628361184553 0.117426419429929 0.472569787284528 0.472569787284528 0.117426419429929 -0.099628361184553 -0.025769744024058 0.046528382618583 0.001719664424553 -0.020558857650079 0.006673932175391 }H
0( )
f
H f
1( )
=
H
0(
f
+
f
m2
)
H
0( )
f
H f
1( )
=
H
0(
f
+
f
m2
)
H f
H f
f
m 1 02
( )
=
(
+
)
H k
H k
N
T 1 02
( )
=
(
+
)
H k
h n e
H k
N
h n e
h n e
e
h n e
e
h n
e
j nk N n N T j n k N N n N j nk N j n N N n N j nk N j n n N n j nk N n N T T T T T T T T T T T T T 1 1 2 0 1 0 0 2 2 0 1 0 2 2 2 0 1 0 2 0 1 0 2 0 12
1
( )
( )
(
)
( )
( )
( )
( )(
)
( )=
=
+
=
=
=
=
=
−
− = − − + = − − − = − − − = − − = −∑
∑
∑
∑
∑
π π π π π π πh n
nh n
1( )
= −
(
1
)
0( )
Para calcular a partir del filtro paso de baja su correspondiente paso-alta en cuadratura, conviene recordar que la correspondencia entre ambos es la siguiente:
En términos de frecuencia de repetición k
Y por definición:
Por tanto:
Los coeficientes del filtro paso-alta son iguales a los del filtro paso-baja, cambiando simplemente el signo de los impares
Una aplicación típica de este tipo de filtros es la del analizador espectral por tercios de octava (8 sub-bandas) con bandas de longitud diferente (logarítmica). El oído humano actúa de forma similar a este tipo de banco, ya que posee una sensibilidad espectral de tipo logarítmico. Este hecho es explotado por sistemas de compresión de audio como el MPEG, donde se utilizan este tipo de filtros.
(
)
E = R[0]
FOR i = 1 to P
PARCOR[i] R[i] BETA[j] R[i j] E LPC[i] PARCOR[i]
FOR j = 1 TO i - 1
LPC[j] = BETA[j] - PARCOR[i] BETA[i - k] END FOR E = E 1- PARCOR[i] * PARCOR[i] FOR j = 1 TO P BETA[j] = LPC[j] END FOR END FOR j 1 i 1 = − ∗ − = ∗ ∗ = −
∑
Programación del Análisis LPC para el método de AUTOCORRELACIÓN
Algoritmo de solución de la matriz de coeficientes p - Número de coeficientes
E - Error de estimación de los coeficientes
R[i] - Coeficiente i de autocorrelación [dsplazamiento i] LPC[] - Coeficientes LPC
Variables intermedias
PARCOR[] - Coeficientes de reflexión (variable intermedia en este análisis) BETA[] - Coeficientes LPC de la iteración anterior
void LevisonDurbin(float *R, float*LPC, int P) {
int i, j;
float PARCOR[ ], BETA[ ]; // Como máximo P+1 float aux, E; E = R[0] for(i=1; i <= P; i++) { aux = 0; for(j=1; j < i; j++)
aux = aux + BETA[j]*R[i-j]; PARCOR[i] = (R[i] - aux)/E; LPC[i] = PARCOR[i] for(j=1; j<i; j++) LPC[j] = BETA[j] - PARCOR[i]*BETA[j-j]; E = E *(1-PARCOR[i]*PARCOR[i]) for(j=1; j<P; j++) BETA[j] = LPC[j]; } }
void LPC_Coef( float *data, int L, float *LPC, int P) {
int i, j;
float AutoCor[ ] ; // Tamaño P +1 max (R[0] ... R[P]
for(i= 0; i <= P; i++) // Calcula los P+1 elementos de autocorrelación {
aux = 0;
for(j=0; j < L - i; j++)
aux = aux + Data[j]*Data[j + i]; AutoCor[i] = aux;
}
LevisonDurbin(AutoCor, LPC, P); }
void SpectrumLPC(float *spectralMagnitude, int L, float *LPC, int P, float G) {
float Real[ ], Imag[ ]; // Tamaño de la máxima L int i;
float aux;
Real[0] = 1; Imag[0] = 0; for(i=1; i < =P; i++)
Real[i] = -LPC[i]; Imag[i] = 0; for( ; i < L; i++)
Real[i] = Imag[i] = 0; FFT(Real, Imag, L); for(i=0; i< L; i++) {
aux = sqrt(Real[i]*Real[i] + Imag[i]*Imag[i]); spectralMagnitude[i] = G / aux;
} }