Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice
1. Introducción 2
2. Filtrado adaptativo 2
2.1. Estructura general de los filtros adaptativos . . . . . . . . . . . . . . 2
2.2. Identificación de los parámetros . . . . . . . . . . . . . . . . . . . . . 3
2.3. Corrección adaptativa de señales . . . . . . . . . . . . . . . . . . . . . 3
2.4. Técnicas de estimación óptima . . . . . . . . . . . . . . . . . . . . . . 4
2.5. Método de resolución directa . . . . . . . . . . . . . . . . . . . . . . . 6
2.6. Métodos iterativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.6.1. Algoritmo de gradiente mediante el método de Newton . . . . 7
2.6.2. Método de gradiente buscado por descenso escalonado . . . . . 8
2.6.3. Algoritmo LMS de Widrow . . . . . . . . . . . . . . . . . . . 8
1
1. Introducción
En el presente apunte se puede apreciar una breve introducción al procesamiento
adaptativo de señales, y su relación con las redes neuronales (RN), es especial con
las arquitecturas de RN basadas el modelo de neurona denominado perceptrón.
La segunda sección de este documento describe los fundamentos del filtrado
adaptativo, y luego una implementación de los mismos a partir de un combinador
lineal adaptativo. Finalmente se estudiarán dos aplicaciones, uno a la identificación
de un sistema y otro para la cancelación de interferencias.
2. Filtrado adaptativo
Los filtros adaptativos son aquellos filtros autoprogramables cuya respuesta en
frecuencia o función transferencia está alterada o adaptada para dejar pasar sin
degradación las componentes deseadas y atenuar las señales no deseadas, o que
generan interferencias, o reducir cualquier distorsión de seǹal de entrada.
Los primeros filtros adaptativos o de autoaprendizaje fueron descriptos por Lucky
[3], quien los utilizó en el diseño de un ecualizador para compensar la distorsión en
sistemas de transmisión de datos.
Como generalmente no existe información disponible a priori, los filtros adaptati-
vos requieren un período inicial de aprendizaje, también denominado de adaptación.
Los algoritmos utiizados en el procesamiento digital de señales han tenido su
precedente en la teoría de los sistemas adaptativos de control, si bien existen con
respecto de éstos ciertas diferencias.
c) La estructura del filtro, que realiza las operaciones requeridas sobre la señal.
2
es no recursivo, y requiere la colección de todos los datos en una ventana temporal,
para luego resolver un sistema de ecuaciones.
El segundo tipo de algoritmo es el algoritmo del gradiente, el cual requiere la
solución de un conjunto de ecuaciones lineales por inversión de una matriz y de esta
forma los resultados no estarán disponibles en tiempo real.
En rigor los algoritmos más utilizados desde el punto de vista del procesamiento
digital son del tipo recursivo, el cual se actualiza a partir de cada entrada de la señal
de entrada o con un pequeño grupo de muestras.
Los resultados están disponibles inmediatamente y es posible el seguimiento de
señales no estacionarias. Un ejemplo de ello es el algoritmo LMS (least mean squa-
re). Como es obvio la estructura del filtro depende tanto del algoritmo como de la
aplicación.
3
ruido
e(t) s(t)
Sistema +
ruido
+
Criterio
de Error
Modelo
Ajuste del
Modelo
e = y − ymodelo (2)
En el caso de señales discretas este será:
en = yn − wn (3)
si para simplificar la nomenclatura hacemos ymodelo = w:
e n = yn − wn (4)
4
Señal a ser corregida
Ruido Σ
Señal corregida
Filtro
Adaptativo
Algoritmo
Adaptativo
Conocimiento
apriori de
señal y ruido
Criterio
s d
+
y
Procesador
Delay
Adaptativo Σ
-
error
5
si tomamos para identificar un modelo tipo ARMA:
Pm −j
W (z) j=0 βj z
= (5)
1 − pi=0 αi z −j
P
X(z)
de donde:
p m
0 0
X X
wn = αi wn−i + βj xn−j (6)
i=1 j=0
Entonces para el error entre la salida del sistema físico y modelo se utiliza la
ecuación 3, luego:
p m
X X
yn = αi yn−i + βj xn−j (7)
i=1 j=0
p m
0 0
X X
en = (αi − αi )yn−i + (βj − βj )xn−j (8)
i=1 j=0
ξ = E(e2n ) (9)
La expresión anterior representa en el espacio generado por los coeficientes αi y
βj un hiperparaboloide de dimensiones p + m + 1, que posee un mínimo absoluto en
el punto dado por:
0
αj = αj 1≤i≤p
0 (10)
βj = βj 0≤j≤m
δξ
=0 1≤i≤p
δαi
(11)
δξ
=0 0≤j≤m
δβj
6
Si se trata de un proceso cuasiestacionario, debe emplearse la esperanza mate-
mática de ECM como la suma temporal dentro del período de estacionareidad del
proceso, luego el cálculo debe repetirse periódicamente, de manera de cubrir todo el
tiempo en estudio.
0 f (x0 )
f (x0 ) = (12)
x 0 − x1
entonces:
f (x0 )
x1 = x0 − (13)
f 0 (x0 )
luego:
f (xk )
xk+1 = xk − k = 0, 1, ... (14)
f 0 (xk )
0
ξ (x)
αik+1 = αik − µ 00 1≤i≤p
ξ (x)
0 (16)
ξ (x)
βik+1 = βik − µ 00 0≤j≤m
ξ (x)
7
2.6.2. Método de gradiente buscado por descenso escalonado
En este caso los coeficientes o pesos son ajustados según el gradiente en cada
paso, lo cual simplifica notablemente el cálculo.
Este método está gobernado por las ecuaciones en la cual µ es una constante
que regula el tamaño del paso. Al igual que el mt́odo anterior, un valor demasiado
pequeño de µ requerirá un elevado número de iteraciones para alcanzar un mínimo,
y un valor excesivo puede ocasionar inestabilidades en el algoritmo.
Tanto en este caso como en el anterior se parte utilizando todo el conocimiento
previo sobre los valores a estimar y luego es desplazada la estimación inicial descen-
diendo sobre la superficie de ECM en la dirección del gradiente (perpendicular a las
curvas de nivel) hasta alcanzar un mínimo.
La diferencia entre este método y el de Newton-Raphson radica en la practicidad
del algoritmo puesto que en el primero es necesario resolver una matriz inversa.
El cálculo de los coeficientes en este método se realiza con las siguientes ecuacio-
nes:
δξ
αik+1 = αik − µ 1≤i≤p
δαi
(17)
δξ
βik+1 = βik − µ 0≤j≤m
δβj
Donde el supraíndice indica el orden de iteración.
δ(e2k )
αik+1 = αik − µ 1≤i≤p
δαi
(18)
δ(e2 )
βik+1 = βik − µ k 0≤j≤m
δβj
Si tomamos la definición del ECM y elevamos al cuadrado ambos miembros,
calculamos la derivadas parciales y reemplazamos en la ecuación anterior se obtiene:
8
3. Aplicaciones del filtrado adaptativo
3.1. Modelización adaptativa en la síntesis de filtros FIR
La idea básica es asociar a un pseudofiltro las especificaciones ideales de un filtro
que generalmente no será físicamente realizable.
El pseudofiltro es únicamente conceptual; el esquema utilizado puede verse en la
figura 4.
f1
~
f2
~ Pseudofiltro
fn
~ d
x +
y
Filtro
Σ Adaptativo
- Σ
error
9
Entrada
Primaria
s+nO Salida
Fuente +
de señal Σ
nO
-
y
Entrada
Referencia
Fuente Filtro
de ruido Adaptativo
n1
error
separación del ECG materno del fetal como así también la cancelación de ecos en
circuitos telefónicos de larga distancia.
A(z)
H(z) = (21)
1 − B(z)
El diagrama en bloques de tal filtro se puede apreciar en la figura 6.
10
y
x
A(z) + B(z)
W0
X0
W1
X1
Σ Y
W2
X2
W3
X3
11
La expresión del combinador es:
N
X −1
Y = Wk Xk (22)
k=0
W0
X(n)
T
W1
X(n-1)
T Σ Y(n)
W2
X(n-2)
T W3
X(n-3)
12
por lo tanto:
N
X −1
e(n) = d(n) − Wk Xk (n − k) (25)
k=0
N −1 N −1
!2
X X
e2 (n) = d2 (n) − 2 Wk Xk (n − k) + Wk Xk (n − k) (26)
k=0 k=0
quedando:
M
X −1 N
X −1 N
X −1 N
X −1
2
ξ= d (n) − 2 Wk rdx (n) + Wk Wl rxx (n − l) (28)
m=0 n=0 n=0 l=0
donde las ecuaciones rdx y rxx las correlaciones cruzadas entre la salida deseada
y la entrada y la autocorrelación da la entrada respectivamente.
El error cuadrático medio ξ describe una superficie de performance, cuando se
lo grafica con respecto a los pesos W , en la figura siguiente podemos observar una
superficie de performance para el caso de dos pesos, donde también apreciamos
los pesos óptimos W1 y W2 que corresponden al mínimo de ξ de la superficie de
performance.
El proceso de adaptación busca minimizar el error cuadrático medio, para lograr
este objetivo se propone el método de descenso a pasos a través de la superficie de
performance.
Con el método de descenso a pasos es posible recalcular cada peso teniendo
información acerca del peso anterior y del gradiente en el punto de peso anterior
sobre la superficie de performance, multiplicado por un coeficiente de velocidad de
convergencia, como lo indica la ecuación 29.
13
Se utiliza el error instantáneo porque está disponible muestra a muestra du-
rante la optimización de los pesos del filtro. Entonces desarrolando la derivada y
reemplazando por la definición de la ecuación 25, tenemos:
δ e(n)
Wk (n + 1) = Wk (n) − 2µe(n) (32)
δWk (n)
y reemplazando con 25, quedando:
P −1
δ d(n) − N
k=0 W k X k (n − k)
Wk (n + 1) = Wk (n) − 2µe(n) (33)
δWk (n)
Note que d(n) y Xk (n) son independientes de Wk , por lo tanto:
14
W0
X(n)
T
W1
X(n-1)
T Σ Y(n)
W2
X(n-2)
T W3
-
+
X(n-3) Σ d(n)
e(n)
Algoritmo de
cuadrados mínimos
15
3.3.1. Código fuente de FILTADAPT.H
// FILTADAPT.H
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
class FiltroAdaptativo {
double *Xk;
double *Wk;
double Ek;
double Sk;
int Cantidad;
public:
double Alfa; // en Alfa a mu por 2
#include "filtadapt.h"
#include <stdlib.h>
FiltroAdaptativo::FiltroAdaptativo( int n)
{
16
Alfa = 1.0 / (100.0*double(n));
Ek = 1.0;
Sk = 0.0;
Cantidad = n;
Xk = new double[Cantidad];
Wk = new double[Cantidad];
for( int j = 0; j < Cantidad; j++)
{
Xk[j] = 0.0; Wk[j] = 0.0;
}
}
FiltroAdaptativo::~FiltroAdaptativo()
{
delete Xk;
delete Wk;
}
17
double FiltroAdaptativo::Calcula( void)
{
double Suma = 0.0;
for( int j= 0; j < Cantidad; j++)
Suma += Wk[j] * Xk[j];
Sk = Suma;
return Sk;
}
18
A.close();
return 0;
}
class FiltroAdaptativo:
def __init__(self,n):
self.Ek = 1
self.Sk = 0
self.Cantidad = n
self.Alfa = 1.0 / (100.0*float(self.Cantidad)) # en Alfa va mu por 2
self.Xk = zeros(self.Cantidad)
self.Wk = zeros(self.Cantidad)
def Calcula(self):
Suma = 0.0
for j in range(self.Cantidad):
Suma += self.Wk[j] * self.Xk[j]
self.Sk = Suma
def LlenaPesos(self,Array):
19
for j in range(self.Cantidad):
self.Wk[j] = Array[j]
def LlenaEntradas(self,Array):
for j in range(self.Cantidad):
self.Xk[j] = Array[j]
def MuestraSalida(self):
print "Sk = " + self.Sk
def MuestraSet(self):
print self.Wk
def MuestraEntradas(self):
print self.Xk
def CalculaNuevoSet(self,ee):
self.Ek = ee
for j in range(self.Cantidad):
self.Wk[j] = self.Wk[j] + self.Alfa*self.Ek*self.Xk[j]
def put(self,dd):
for j in range(1,self.Cantidad):
self.Xk[self.Cantidad-j] = self.Xk[self.Cantidad-1-j]
self.Xk[0] = dd
self.Calcula()
return self.Sk
20
A continuación se describen los pasos a seguir para lograr dicho proceso:
Figura 10: Respuesta del filtro IIR y del filtro adaptativo a un impulso.
21
Figura 11: Respuesta del filtro IIR y del filtro adaptativo a un escalón.
22
Figura 12: error2 para las 1000 primeras iteraciones de la adaptación.
23
// adaptativo
#include <iostream.h>
#include <fstream.h>
#include <math.h>
#include "filtadapt.h"
FiltroAdaptativo F(CantidadCoeficientes);
ofstream Salida;
Salida.open( c:\neural\\filtro.txt);
int j;
double Px = 0.0;
double Mean = 0.0;
double *noise;
noise = new double[Number];
// Calcula ruido blnco sin valor medio
for( j = 0; j < Number; j++){
noise[j] = double(random(1000))/1000.0;
mean += noise[j];
}
Mean /= double(Number);
for( j = 0; j < Number; j++){
noise[j] -= Mean;
Px += (noise[j]*noise[j]);
}
// Calcula potencia del ruido
Px /= double(Number+1);
double x, y, d, dAnt, e;
// coeficientes del sistema a identificar
double a = 0.3;
double b = 0.7;
cout << "Coeficientes del sistema a identificar: " << endl;
cout << "y[n] = a*x[n] + b*y[n-1]" << endl;
cout << "a = ";
24
cin >> a;
cout << "b = ";
cin >> b;
dAnt = 0.0;
25
x = 1.0;
d = a*x + b*dAnt;
y = F(x);
Salida << x << "\t" << d << "\t" << y << endl;
dAnt = d;
}
delete noise;
cout << endl << "FIN";
}
import math
from random import *
from pylab import *
from FiltroAdaptativo import *
F = FiltroAdaptativo(20)
Number = 5000
Px = 0.0
Mean = 0.0
noise = zeros(Number)
seed()
for j in range(Number):
noise[j] = normalvariate(0.0,1.0)
Px += noise[j] * noise[j]
Px /= float(Number+1)
x = 0.0
y = 0.0
dAnt = 0.0
e = 0.0
a = 0.3
b = 0.7
F.MuestraSet()
26
print F.Alfa
for j in range(Number):
x = noise[j]
d = a*x + b*dAnt
y = F.put(x)
e = d - y
F.CalculaNuevoSet(e)
dAnt = d
F.MuestraSet()
N = 100
xx = arange(N)
yy = zeros(N)
zz = zeros(N)
yy[N/2] = 1.0
F.LlenaEntradas(zeros(20))
for j in range(1,N):
zz[j] = F.put(yy[j])
yy[j] = a*yy[j] + b*yy[j-1]
subplot(211)
plot(xx,yy,’b’)
ylim(-0.1,1.1)
title(’Filtrado con $y(n)=ax(n)+by(n-1)$’)
subplot(212)
plot(xx,zz,’g’)
ylim(-0.1,1.1)
title(’Filtrado con $FiltroAdaptativo$’)
savefig("EjercicioIdentificacionSistemaRespImpulso.eps")
close()
yy = zeros(N)
zz = zeros(N)
for j in range(N/2,N):
yy[j] = 1.0
27
F.LlenaEntradas(zeros(20))
for j in range(1,N):
zz[j] = F.put(yy[j])
yy[j] = a*yy[j] + b*yy[j-1]
subplot(211)
plot(xx,yy,’b’)
ylim(-0.1,1.1)
title(’Filtrado con $y(n)=ax(n)+by(n-1)$’)
subplot(212)
plot(xx,zz,’g’)
ylim(-0.1,1.1)
title(’Filtrado con $FiltroAdaptativo$’)
savefig("EjercicioIdentificacionSistemaRespEscalon.eps")
close()
28
x(n) + salida
Σ
-
s’(n)
retardo Filtro
T Adaptativo
#include <iostream.h>
29
Figura 14: error2 para las primeras 500 iteraciones durante la adaptación del filtro.
30
Figura 15: La señal superior el ECG original sin ruido ni interferencias, en la señal
central el mismo ECG pero con la interferencia sumada, y finalmente en la señal
inferior la salida del filtro adaptativo, note en esta última el comportamiento para
las primeras 20 muestras, en las cuales el filtro adaptativo todavia no se enganchó.
31
#include <fstream.h>
#include <math.h>
#include "filtadapt.h"
ofstream Salida;
Salida.open("filtro2.txt");
int j;
double Px = 0.0;
double Mean = 0.0;
noise = new double[Number];
double *ecg;
ecg = new double[Number];
double *ecgl;
ecg1 = new double[Number];
double Pi = 3.14;
// Calcula ruido blanco sin valor medio mas ruido
// de senoidal
for( j = 0; j < Number; j++){
noise[j] = double(random(1000))/10000.0;
noise[j] += sin( 1000.0*2.0*Pi*double(j)/double(number));
Mean += noise[j];
}
Mean /= double(Number);
for( j = 0; j < Number; j++){
noise[j] -= Mean;
Px += noise[j]*noise[j]);
}
// Calcula potencia del ruido
Px /= double(Number+1);
32
ifstream In;
In.open( NameInput);
if( !In){
cout << "I can’t open the file !!!!!";
return
}
double data;
for( j = 0; j < Number; j++){
In >> data;
data /= 10.0;
ecg[j] = data;
ecg[j] += sin(
1000.0*2.0*Pi*double(j)/double(Number));
ecg1[j] = data;
In >> data;
}
33
dAnt2 = 0.0;
for( j = 0; j < Number; j++){
x = ecg[j];
y = F(dAnt2);
dAnt = x;
dAnt2 = dAnt;
d = x - y;
Salida << ecgl[j] << "\t" << x << "\t" << d << endl;
dAnt = d;
}
delete noise;
delete ecg;
delete ecgl;
cout << endl << "FIN";
}
import math
from random import *
from pylab import *
from FiltroAdaptativo import *
F = FiltroAdaptativo(20)
Number = 4000
ecg = zeros(Number)
ecgOrig = zeros(Number)
ecg1 = zeros(Number)
noise = zeros(Number)
Px = 0.0
Mean = 0.0
Mean /= float(Number)
34
for j in range(Number):
noise -= Mean
Px += noise[j]*noise[j]
Px /= float(Number+1)
fh = open(’apb.txt’)
for j in range(Number):
linea = fh.readline()
w = linea.split()
ecgOrig[j] = (float(w[0])-128.0)/10.0
ecg[j] = (float(w[0])-128.0)/10.0 +
math.sin(1000.0*2.0*math.pi*float(j)/float(Number))
ecg1[j] = (float(w[1])-128.0)/10.0
x = zeros(Number)
y = zeros(Number)
d = zeros(Number)
dAnt = 0.0
dAnt2 = 0.0
e = zeros(Number)
plot(ecgOrig[:250]+20,’g’)
35
plot(x[:250]+10,’b’)
plot(d[:250],’r’)
savefig("EjercicioCancelacionRuidoECG.eps")
close()
e2 = e*e
plot(e2[:500])
xlabel(’iteraciones’)
ylabel(’$error^2$’)
savefig("ErrorCancelacionRuidoECG.eps")
close()
Referencias
[1] Ricardo Armentano, Javier Fochesatto, and Marcelo Risk. Análisis de Señales
y Sistemas. Editorial Rocamora, 1996.
[2] Perry Greenfield and Robert Jedrzejewski. Using Python for interactive data
analysis. Association of Universities for Research in Astronomy, 2007.
[4] Al Stevens and Clayton Walnut. Standard C++ Bible. IDG Books, 2000.
[5] Guido van Rossum and Fred L. Drake. Python tutorial, Release 2.5. Python
Software Foundation, docs@python.org, 2006.
[6] Bernard Widrow, John Glover, John MacCool, John Kaunitz, Charles Williams,
Robert Hearn, James Zeidler, Eugene Dong, and Robert Goodlin. Adaptive noise
cancelling: principles and applications. Proceedings of the IEEE, 63(12):1692–
1716, 1975.
[7] Bernard Widrow and Michael Lehr. 30 years of adaptive neural networks: percep-
tron, madaline, and backpropagation. Proceedings of the IEEE, 78(9):1415–1442,
1990.
36