Ejemplos de filtros lineales Ejemplo I: Obtener la salida de un filtro lineal sin ganancia, conociendo sus parámetros Se desea representar el siguiente filtro: y = 0.5*x1-0.3*x2 En este ejemplo los parámetros son: w1= 0.5 y w2= -0.3. Se desea determinar la salida equivalente al vector de entradas: x = [1 3 2 4 3 5 4 6] Solución: % Se define la matriz de entradas x[n,K]=x[2,4] >> x=x' x = 1 2 3 4 3 4 5 6 % Se define el filtro lineal >>interx1=[1 4] % Intervalo [min, max] de x1 >>interx2=[3 6] % Intervalo [min, max] de x2 >>numsal=1 % Número de salidas >>net=newlin([interx1; interx2], numsal); % Se definen los parámetros del filtro >>net.IW{1,1}=[0.5 -0.3] >>net.b{1}=0; % La ganancia es cero % Se verifican los parámetros del filtro >> net.IW{1,1} ans = 0.5000 -0.3000 >> net.b{1} ans = 0 % Se obtiene la salida de la red >>y=sim(net,x) y = -0.4000 -0.2000 0 0.2000 % Se comprueba >> x'*net.IW{1,1}' ans = -0.4000 -0.2000 0 0.2000 |
Ejemplo II: Clasificar una función AND utilizando un filtro lineal sin ganancia La función AND se define por la siguiente estructura de entrada-salida: datos = [0 0 0 0 1 0 1 0 0 1 1 1] Solución: % Se define la matriz de entradas >> x=datos(:,1:2)' x = 0 0 1 1 0 1 0 1 % Se define el vector de salidas >> y=datos(:,3)' y = 0 0 0 1 % Se define el filtro lineal >>interx1=[0 1] % Intervalo [min, max] de x1 >>interx2=[0 1] % Intervalo [min, max] de x2 >>numsal=1 % Número de salidas % Se define la red denominada net >>net=newlin([interx1; interx2], numsal); % Se define ganancia cero >> net.biasConnect(1)=0 % Se realiza procesamiento por lotes (train) >>net.trainParam.epochs = 1000; % Número de épocas >>net.trainParam.goal = 0.01; % Error deseado >> net.trainFcn='traingd'; % Entrenamiento por gradiente descendente >>net = train(net,x,y); % Se verifica el resultado (se aplica al filtro la matriz de entradas) >>y2=sim(net,x) y2 = 0 0.3333 0.3333 0.6667 % Si se toma como referencia 0.5, la salida ha sido clasificada: los tres primeros valores son menores a 0.5 (equivalente a 0) y la última es mayor a 0.5 (equivalente a 1) % Se verifican los parámetros del filtro >> net.b{1} ans = [] % w0=0 (ganancia), se comprueba más adelante >> net.IW{1} ans = 0.3333 0.3333 % valores de w1 y w2 % Se comprueba, verificando la aplicación previa de la red (sim) >> x'*net.IW{1,1}' ans = 0 0.3333 0.3333 0.6667 % Núcleo estimador (filtro lineal) identificado y_est = 0.3333*x1 + 0.3333*x2 |
Ejemplo III: Predecir la serie caótica temporal de Mackey-Glass utilizando un filtro lineal con ganancia % Estructura de entrada-salida: % Se pretende crear un modelo de la forma % y(t) = f[y(t-1), y(t-11), y(t-14), y(t-17)] % Se obtiene los valores de la serie >> y=y' % Convierte vector concurrente a secuencial. Esto se realiza en modelos de series temporales, donde existe una única variable >> y = con2seq(y); % Se define la entrada igual a la salida >> x=y; % Se definen las unidades de retrasos de las entradas % (argumento) [y(t-1), y(t-11), y(t-14), y(t-17)] >> retrasos=[1 11 14 17]; % El factor de aprendizaje >> fa=0.01 % Se define el filtro lineal >> net=newlin(minmax(cat(2,x{:})), 1, retrasos, fa); % Se entrena la red >> [net, a, e]=adapt(net, x, y); % Se visualiza valor real y estimado >> plot(cat(2,y{:})); % Salida deseada >> hold on >> plot(cat(2,a{:}),'g'); %Valores estimados % Parámetros resultantes >> net.IW{1} ans = 0.5483 0.0904 0.0070 -0.0371 >> net.b{1} % Ganancia ans = 0.4025 % Núcleo estimador (filtro lineal) identificado % y(t) = 0.54*y(t-1)+0.09*y(t-11)+0.007*y (t-14) % -0.03*y(t-17)+0.40 Nota: Se puede solucionar el problema como vector concurrente, tal y como se refleja en el próximo ejemplo | |
Ejemplo IV: Obtener el modelo de Box y Jenkins Obtener la matriz de entrada-salida datos=[u(t), y(t)] % Ordenar matriz para la identificación % Utilizar el programa ordena_datos % para crear la estructura de entrada-salida: % y(t) = f[y(t-1), u(t-3), u (t-4)] >> ordena_datos Cantidad de veces a retrasar la columna 1 = 5 Cantidad de veces a retrasar la columna 2 = 2 % Se crea matriz de la forma: % [y(t-1), u(t-3), u (t-4)], y(t)] % a partir de xudx generada por ordena_datos >> matriz=[xudx(:,6), xudx(:,2), xudx(:,1), xudx(:,7)]; % Se define la matriz de entradas >> x=matriz(:,1:3)'; % Se define el vector de salidas >> y=matriz(:,4)'; % Se define el filtro lineal y se adapta por LMS % solucionando la ecuación: [W b]*[x; unos] = y >>net=newlind(x,y); % Se verifican los parámetros del filtro >> net.IW{1} ans = 0.9859 -0.6970 -0.3720 >> net.b{1} ans = 0.0146 % Se comprueba (equivale a aplicar sim) >> y3=x'*net.IW{1,1}'+net.b{1}; % Núcleo estimador (filtro lineal) identificado %y(t) = 0.98*y(t-1)-0.69*u(t-3)-0.37*u (t-4)+0.0146 | |
|