Informe - Escuela de Ingeniería Eléctrica

Anuncio
Universidad de Costa Rica
Facultad de Ingeniería
Escuela de Ingeniería Eléctrica
IE – 0502 Proyecto Eléctrico
Diseño de prácticas de procesamiento digital de
señales usando SCILAB y SCICOS.
Por:
Arthur Chavarría Pérez
Ciudad Universitaria Rodrigo Facio
Julio del 2009
Diseño de prácticas de procesamiento digital de señales usando SCILAB y
SCICOS.
Por:
Arthur Chavarría Pérez
Sometido a la Escuela de Ingeniería Eléctrica
de la Facultad de Ingeniería
de la Universidad de Costa Rica
como requisito parcial para optar por el grado de:
BACHILLER EN INGENIERÍA ELÉCTRICA
Aprobado por el Tribunal:
_________________________________
Ph.D. Jorge Romero Chacón
Profesor Guía
_________________________________
Ing. Rodrigo Chacón Quesada
Profesor lector
_________________________________
Ing. Claudio Umaña Valverde
Profesor lector
ii
DEDICATORIA
Dedico este proyecto a mis padres, hermanos, otros familiares y
amigos quienes siempre han estado cerca de mí y me han
apoyado en todo momento.
iii
ÍNDICE GENERAL
ÍNDICE DE FIGURAS..................................................................................vii
ÍNDICE DE TABLAS......................................................................................x
NOMENCLATURA........................................................................................xi
RESUMEN......................................................................................................xii
CAPÍTULO 1: Introducción...........................................................................1
1.1 Objetivos..........................................................................................................................................................3
1.1.1 Objetivo general.................................................................................................................................3
1.1.2 Objetivos específicos.........................................................................................................................3
1.2 Metodología....................................................................................................................................................4
CAPÍTULO 2: Desarrollo teórico...................................................................5
2.1 Introducción a SCILAB..................................................................................................................................5
2.2 SCILAB y el procesamiento de señales..........................................................................................................6
2.2.1 Tratamiento de señales.......................................................................................................................7
a) Representación de un sistema lineal por su función de transferencia.....................................................7
b) Representación en el espacio de estados (EE) de un sistema lineal.......................................................8
c) Cambio de representación: paso de función de transferencia (FT) al Espacio de Estados (EE) y
viceversa......................................................................................................................................................9
d) Discretización de sistemas continuos.....................................................................................................9
e) Filtrado y su representación gráfica......................................................................................................11
f) La FFT (Transformada rápida de Fourier) y la DFT (Transformada de Fourier discreta)....................13
g) Convolución..........................................................................................................................................15
h) Chirp Z-transform (CZT). ....................................................................................................................16
2.2.2 Diseño de filtros con SCILAB........................................................................................................18
a) Diseño de filtros FIR (Finite Impulse Response).................................................................................18
b) Técnicas de muestreo de frecuencia.....................................................................................................21
2.2.3 Manipulación de sonido en SCILAB...............................................................................................25
2.2.4 Gráficas............................................................................................................................................26
2.3 SCICOS.........................................................................................................................................................28
2.3.1 El editor de SCICOS.......................................................................................................................31
2.3.2 Construcción de un modelo en SCICOS.........................................................................................31
2.3.3 Tipos de bloques en SCICOS..........................................................................................................36
a) Bloque normal simple continuo. ..........................................................................................................37
b) Bloque normal simple discreto. ...........................................................................................................39
c) Bloque simple de cruce por cero...........................................................................................................40
d) Bloque simple sincronizado..................................................................................................................41
e) Herencia y dependencia temporal ........................................................................................................42
2.3.4 Construcción de nuevos bloques.....................................................................................................42
iv
2.3.5 Definición de la estructura de datos del bloque. ............................................................................45
2.3.6 Función computacional...................................................................................................................48
a) Tipos de funciones computacionales....................................................................................................51
CAPÍTULO 3: Elaboración de prácticas de procesamiento digital de
señales en SCILAB.........................................................................................53
3.1 Primera práctica.............................................................................................................................................53
3.1.1 Resultados para la primera práctica:. ..............................................................................................59
a) Resultados del programa 1.1.................................................................................................................59
b) Resultados del programa 1.2.................................................................................................................61
c) Resultados del programa 1.3.................................................................................................................62
d) Resultados del programa 1.4.................................................................................................................64
3.2 Segunda práctica...........................................................................................................................................66
3.2.1 Resultados de la segunda práctica. ….............................................................................................72
a) Resultados del programas 2.1...............................................................................................................72
b) Resultados del programa 2.2.................................................................................................................73
c) Resultados del programa 2.3.................................................................................................................74
d) Resultados del programa 2.4 ................................................................................................................76
3.3 Tercera práctica............................................................................................................................................78
3.3.1 Resultados de la tercera práctica......................................................................................................88
a) Resultados del programa 3.1.................................................................................................................88
b) Resultados del programa 3.2.................................................................................................................89
c) Resultados del programa 3.3.................................................................................................................91
d) Resultados del programa 3.4.................................................................................................................93
e) Resultados del programa 3.5.................................................................................................................94
3.4 Cuarta práctica..............................................................................................................................................95
3.4,1 Resultados de la cuarta práctica....................................................................................................105
a) Resultados del programa 4.1...............................................................................................................105
b) Resultados del programa 4.2...............................................................................................................107
c) Resultados del programa 4.3...............................................................................................................107
d) Resultados del programa 4.4...............................................................................................................108
e) Resultados del programa 4.5 ..............................................................................................................108
f) Resultados del programa 4.6 ..............................................................................................................108
3.5 Quinta práctica ….......................................................................................................................................109
3.5.1 Resultados de la quinta práctica.....................................................................................................119
a) Resultados de la parte A.....................................................................................................................119
b) Resultados de la parte B....................................................................................................................123
c) Resultados de la parte C......................................................................................................................124
3.6 Sexta práctica..............................................................................................................................................126
3.6.1 Resultados de la sexta práctica.......................................................................................................138
a) Resultados de la parte A.....................................................................................................................138
3.7 Séptima práctica............................................................................................................................................143
3.7.1 Código MATLAB de la práctica 7.................................................................................................155
3.7.2 Resultados de la séptima práctica..................................................................................................161
CAPÍTULO 4: Elaboración de prácticas de procesamiento digital de
señales en SCICOS.......................................................................................163
4.1 Primera práctica..........................................................................................................................................163
4.1.1 Solución a la primera práctica en SCICOS. ….............................................................................174
4.2 Segunda práctica.........................................................................................................................................177
v
4.2.1 Resultados de la segunda práctica.................................................................................................185
4.3 Tercera práctica en SCICOS.....................................................................................................................190
BIBLIOGRAFÍA..........................................................................................200
vi
ÍNDICE DE FIGURAS
Índice del usuario
Figura 2.1 Señal de salida del filtro yhz.............................................................................................................12
Figura 2.2 Señal de entrada X del filtro..............................................................................................................13
Figura 2.3 Función coseno sin filtrar..................................................................................................................14
Figura 2.4 Transformada discreta de Fourier de la señal coseno.......................................................................15
Figura 2.4 Transformada discreta de Fourier de la señal coseno.......................................................................15
Figura 2.5 Localización de las muestras de la transformada Z para Wo < 1 y Wo > 1. ....................................17
Figura 2.5 Localización de las muestras de la transformada Z para Wo < 1 y Wo > 1. ....................................17
Figura 2.6 Filtro pasa banda tipo 1 sin muestra y con muestra en cada banda de transmisión. .......................23
Figura 2.7 Filtro paso bajo tipo 1 y tipo 2. ........................................................................................................24
Figura 2.8 Filtro paso bajo tipo 1 y tipo 2. ........................................................................................................29
Figura 2.8 Filtro paso bajo tipo 1 y tipo 2. ........................................................................................................29
Figura 2.9 Estructura de los bloques en SCICOS. .............................................................................................30
Figura 2.10 Ventana principal de SCICOS. ......................................................................................................31
Figura 2.11 Ventana de elección de paletas. .....................................................................................................32
Figura 2.12 Ventana de ayuda a través de SCILAB. .........................................................................................35
Figura 2.13 Cuadro de diálogo de selección de demos. ....................................................................................35
Figura 2.14 Apariencia de un super bloque. ......................................................................................................36
Figura 2.15 Bloque normal simple continuo. ....................................................................................................38
Figura 2.16 Bloque normal simple discreto. ......................................................................................................40
Figura 2.17 Bloque simple de cruce por cero. . .................................................................................................41
Figura 2.18 Bloque simple sincronizado. ..........................................................................................................42
Figura 3.1 Parte real de la secuencia exponencial compleja realizada en MATLAB........................................59
Figura 3.2 Parte imaginaria de la secuencia exponencial compleja realizada en MATLAB.............................60
Figura 3.3: Parte real de la secuencia exponencial compleja realizada en SCILAB..........................................60
Figura 3.4 Parte imaginaria de la secuencia exponencial compleja realizada en SCILAB................................61
Figura 3.5 Generación de secuencia exponencial real con a = 1.2, K = 0.2 y N = 30 en SCILAB....................61
Figura 3.6 Generación de secuencia exponencial real con a = 0.9, K = 20 y N = 30 en SCILAB....................61
Figura 3.7 Generación de secuencia exponencial real con a = 1.2, K = 0.2 y N = 30 en MATLAB.................62
Figura 3.8 Generación de secuencia exponencial real con a = 0.9, K = 20 y N = 30 en MATLAB.................62
Figura 3.9 Señal original no corrompida y señal de ruido generadas con MATLAB........................................63
Figura 3.10 Señal original no corrompida y señal de ruido generadas con SCILAB.........................................63
Figura 3.11 Señales de entrada y señal sin suavizar en SCILAB.......................................................................64
Figura 3.12 Señal original y señal suavizada obtenida con SCILAB.................................................................64
Figura 3.13 Señales de entrada y señal sin suavizar en MATLAB....................................................................65
Figura 3.14 Señal original y señal suavizada obtenida con MATLAB..............................................................65
Figura 3.15 Ilustración de convolución en SCILAB..........................................................................................73
Figura 3.16 Ilustración de convolución en MATLAB.......................................................................................73
Figura 3.17 Ilustración del cálculo de la respuesta al impulso en SCILAB.......................................................74
Figura 3.18 Ilustración del cálculo de la respuesta al impulso en MATLAB....................................................74
Figura 3.19 Cálculo de la secuencia de correlación cruzada en SCILAB..........................................................75
Figura 3.20 Cálculo de la secuencia de correlación cruzada en MATLAB.......................................................75
Figura 3.21 Cálculo de la autocorrelación de una secuencia sinusoidal corrompida por ruido usando SCILAB.
............................................................................................................................................................................76
Figura 3.22 Cálculo de la autocorrelación de rdd usando SCILAB...................................................................76
vii
Figura 3.23 Cálculo de la autocorrelación de una secuencia sinusoidal corrompida por ruido usando
MATLAB...........................................................................................................................................................77
Figura 3.24 Cálculo de la autocorrelación de rdd usando MATLAB................................................................77
Figura 3.25 Calculo de la DFT en MATLAB....................................................................................................88
Figura 3.27 Secuencia temporal original en SCILAB........................................................................................89
Figura 3.28 Magnitud de las muestras de la DFT y fase de las muestras de la DFT en SCILAB....................89
Figura 3.29 Secuencia temporal original en MATLAB.....................................................................................90
Figura 3.30 Magnitud de las muestras de la DFT y fase de las muestras de la DFT en MATLAB..................90
Figura 3.31 Muestras originales DFT en SCILAB.............................................................................................91
Figura 3.32 Parte real de las muestras temporales y parte real de las muestras temporales en SCILAB..........91
Figura 3.33 Muestras originales DFT en MATLAB..........................................................................................92
Figura 3.34 Parte real de las muestras temporales y parte real de las muestras temporales en MATLAB.......92
Figura 3.35 Gráfica de la respuesta en frecuencia en SCILAB..........................................................................93
Figura 3.36 Gráfica de la respuesta en frecuencia en MATLAB.......................................................................93
Figura 3.37 Convolución lineal por medio de la DFT en SCILAB....................................................................94
Figura 3.38 Polos y ceros en el plano Z obtenidos en MATLAB....................................................................106
Figura 3.39 Polos y ceros en el plano Z obtenidos en SCILAB.......................................................................107
Figura 3.40 Tren de pulsos en MATLAB y SCILAB......................................................................................119
Figura 3.41 Espectro correspondiente sobre el intervalo de Nyquist normalizado (-1,1) en MATLAB y
SCILAB............................................................................................................................................................120
Figura 3.42 Señal coseno con ocho muestras por ciclo multiplicándola (elemento por elemento) por el tren de
impulsos............................................................................................................................................................120
Figura 3.43 Respuesta al impulso efectiva y su respuesta de magnitud en MATLAB y SCILAB.................121
Figura 3.44 Señal en el dominio del tiempo obtenida con MATLAB y SCILAB...........................................121
Figura 3.45 Señal en el dominio de la frecuencia obtenida con MATLAB y SCILAB...................................122
Figura 3.46 Señales para aplicar un postfiltro en MATLAB y SCILAB.........................................................122
Figura 3.47 Respuesta en el tiempo al aplicar FFT en MATLAB y SCILAB.................................................123
Figura 3.48 Primer ejemplo de aliasing en MATLAB y SCILAB. .................................................................123
Figura 3.49 Respuesta de FFT MATLAB y SCILAB. ....................................................................................124
Figura 3.50 Secuencia exponencial causal en MATLAB y SCILAB..............................................................124
Figura 3.51 Espectro de frecuencia y señal original en MATLAB y SCILAB................................................124
Figura 3.52 Interpolación de un senoide por L = 4.........................................................................................125
Figura 3.53 Despliegue en el dominio de la frecuencia del error en MATLAB y SCILAB..........................125
Figura 3.54 Chequeo de decimación en MATLAB y SCILAB.......................................................................125
Figura 3.55 Efectos de la convolución circular................................................................................................138
Figura 3.56 Convolución circular y rellenos con ceros....................................................................................139
Figura 4.1 a) Diagrama de polos y ceros y b) respuesta en frecuencia de un resonador. …............................165
Figura 4.2 Diagrama de sistema para realizar filtrado con un filtro resonante digital….......................……...167
Figura 4.3 (a) Comportamiento del filtro Notch ideal y (b) comportamiento real del filtro Notch.................169
Figura 4.4 Respuesta en frecuencia del filtro.........................……………………….......................………....170
Figura 4.5 Sistema de prueba de filtro Notch………………………………………………............................171
Figura 4.6 Filtro digital de orden 3………………………………………………………….......................….172
Figura 4.7 Respuesta en frecuencia de un filtro paso bajo…………………………………............................173
Figura 4.8 Aplicación para filtro paso bajo…………………………………………….......................……....174
Figura 4.9 Señal de salida “Gráfico 1” y señal de entrada “Gráfico 2”……………………............................175
Figura 4.10 Señal de entrada “Grafico 1” y señal muestreada “Gráfico 2”. Filtro paso
banda resonante digital………………………………………………………………….......................……...175
Figura 4.11 Señal de entrada muestreada y sin muestrear……………………………………........................176
Figura 4.12 Señal filtrada por ambos filtros (Gráfico 1) y señal filtrada por el filtro Notch (Gráfico 2).........176
Figura 4.13 Señal de entrada y salida filtro paso bajo en diagrama de bloques…….......................………….177
viii
Figura 4.14 Señal de entrada y salida de filtro paso bajo con el bloque de función de
transferencia......................................................................................................................................................177
Figura 4.15 Ejemplo de un banco de filtros sencillo. …..................................................................................178
Figura 4.16 Diagrama de un banco de filtro simple………………………………………….........................179
Figura 4.17 Banco de filtros análisis-síntesis. ….............................................................................................182
Figura 4.18 Aplicación de un filtro de reconstrucción perfecta.......................................................................183
Figura 4.19 Diagrama de banco QMF. ….....................……………………………………......................….184
Figura 4.20 Diagrama en SCICOS de simulación de un banco de filtros QMF...............................................185
Figura 4.21 Entrada y salida de diagrama de bloques de un banco de filtros simple………….......................186
Figura 4.22 Diagrama en Simulink del primer ejemplo para la práctica 1 de SCICOS...................................187
Figura 4.23 Resultados de primer diagrama hechos con MATLAB................................................................187
Figura 4.24 Salida y entrada del banco de filtros análisis-síntesis en MATLAB…………......................…..188
Figura 4.25 Diagrama para filtro análisis-síntesis en MATLAB…………………………......................…...188
Figura 4.26 Entrada y salida de banco de filtro análisis-síntesis en SCILAB…………….......................…...189
Figura 4.27 El gráfico superior muestra la salida del filtro F0, la figura inferior muestra la salida del filtro
F1......................................................................................................................................................................189
Figura 4.28 El gráfico superior muestra la salida del sistema, el gráfico inferior es la entrada.......................190
Figura 4.29 Respuesta en frecuencia de filtro FIR de orden 30 y de un IIR de orden 6..................................192
Figura 4.30 Implementación de un filtro IIR paso banda…………………………………….........................193
Figura 4.31 Filtro FIR.......................................................................................................................................193
Figura 4.32 Sistema de filtrado analógico y digital..........................................................................................196
Figura 4.33 Salida de señal filtrada con filtro IIR............................................................................................197
Figura 4.34 Señal de entrada y de salida para filtro FIR…………………………………......................…....199
Figura 4.35 Filtro analógico y filtro digital IIR................................................................................................199
ix
ÍNDICE DE TABLAS
Tabla 2.1 Status de la función computacional................................................................................... 44
Tabla 2.2 Tipos de función................................................................................................................. 46
Tabla 2.3 Parametros de entrada/salida que utilizan funciones tipo 1.................................................47
x
NOMENCLATURA
SCICOS: SCILAB Connected Object Simulator.
INRIA: Institut National de Recherche en Informatique et Automatique
ENPC: Ecole Nationale de Ponts et Chaussées
MATLAB: Matrix Laboratory
FFT: Fast Fourier Transform
DFT: Discrete Fourier Transform
EE: Espacio de Estados
FT: Función de Transferencia
xi
RESUMEN
Este documento se enfoca en el desarrollo de prácticas para el curso de
procedimiento digital de señales de la Escuela de Ingeniería Eléctrica de la Universidad de
Costa Rica, utilizando el software libre SCILAB y su herramienta SCICOS. En total se
desarrollaron diez prácticas, de las cuales siete corresponden a prácticas elaboradas en
SCILAB y tres en SCICOS. Entre los temas desarrollados podemos encontrar prácticas
sobre la convolución de señales, transformada rápida de Fourier, transformada discreta de
Fourier, filtros digitales, bancos de filtros, muestreo, etc.
Como parte de la teoría, el segundo capítulo contempla generalidades sobre el uso de
comandos y funciones en SCILAB y SCICOS, podemos encontrar además algunos
conceptos básicos, y ejemplos del uso del software en estudio.
El tercer capítulo se refiere a las prácticas generadas o modificadas para ser
realizadas en SCILAB, además de las prácticas en este capítulo se encuentran las
soluciones de los ejercicios elaborados en SCILAB y MATLAB.
En el cuarto capítulo se encuentran las prácticas realizables en SCICOS, así como la
soluciones de los ejercicios. Las conclusiones y recomendaciones se encuentran en el
quinto capítulo.
Tanto SCILAB como SCICOS son herramientas de gran importancia para el estudio de muchos
estudiantes. A pesar de no ser tan atractivos como MATLAB y Simulink, SCILAB y SCICOS permiten
desarrollar prácticas de un elevado nivel académico y complejidad, semejantes a las elaboradas en MATLAB
y Simulink.
xii
CAPÍTULO 1: Introducción
El Internet ha cambiado en mucho la educación, permitiendo el rápido acceso a la
información y lo que es más importante el acceso libre a esta. El Internet es por lo tanto un
vasto y rico depósito de recursos computacionales. El software libre o abierto es en si, una
de las más importantes herramientas que los estudiantes pueden adquirir en Internet, siendo
una buena alternativa para elaborar aplicaciones y prácticas de ingeniería y otras
disciplinas.
Hoy en día los paquetes de software didácticos y de simulación tales como
MATLAB y su herramienta Simulink de The Mathworks, Inc., permiten gran variedad de
aplicaciones en el aprendizaje del procesamiento digital de señales, control automático, etc.
Sin embargo, dichos programas poseen licencias que son de difícil acceso y costosas para
los estudiantes, centros de aprendizaje y profesores. Ante esta situación en 1990, INRIA y
ENPC desarrollaron SCILAB y su herramienta para la simulación de sistemas dinámicos
SCICOS, programas de distribución gratuita, los cuales son las contrapartes de MATLAB y
Simulink; tales programas pueden ser muy similares en cuanto a funciones se refiere,
permitiendo el análisis de señales y otras aplicaciones. Al ser programas de distribución
gratuita, cualquier persona con conocimientos básicos de informática, podría descargar
SCILAB en Internet, lo cual, no se puede hacer con programas como MATLAB u otros
con licencias poco accesibles y costosas.
SCILAB y SCICOS dan al estudiante y profesor un complejo mundo de opciones en
cuanto a diseño y estudio de prácticas de diversas áreas, en nuestro caso SCILAB y
1
2
SCICOS permiten desarrollar prácticas de procesamiento digital de señales de igual
complejidad que las realizadas en MATLAB y Simulink.
Ante la notable necesidad de un cambio, para el acceso educativo y lograr que el
estudiante pueda obtener con facilidad las herramientas computacionales necesarias, surge
la tendencia a la utilización de programas de distribución gratuita.
SCILAB al igual que MATLAB poseen diversos comandos y funciones para el
tratamiento de señales, lo cual garantiza la posibilidad de generar y probar prácticas para el
procesamiento digital de señales. El simulador de objetos conectados de SCILAB
(SCICOS), garantiza el modelado de sistemas dinámicos que incluyen subsistemas tanto
continuos como discretos, de esta forma es posible tomar prácticas realizadas en Simulink y
llevarlas a cabo con SCICOS. Estas prácticas se deben modificar para poder amoldarlas a
SCICOS debido a ciertas variaciones existentes en la herramienta. En forma similar las
prácticas de MATLAB se deben modificar, si se desean emplear con SCILAB.
Como estudiantes o profesionales es importante el conocer la existencia de ambos
paquetes de software. Tanto MATLAB como SCILAB pueden ser muy funcionales y sus
herramientas de gran ayuda en el aprendizaje y resolución de problemas. A pesar de la
similitud existen muchas diferencias entre estos programas y en esto radica la importancia
de conocer dichas similitudes y diferencias entre ambos, con la finalidad de ser capaces de
utilizar ambos paquetes o de sustituir el programa de uso actual si es deseado.
3
1.1
1.1.1
Objetivos
Objetivo general
Diseñar, documentar y probar prácticas para la introducción del procesamiento digital
de señales utilizando el lenguaje SCILAB y su contraparte la herramienta de simulación de
procesos SCICOS.
1.1.2
Objetivos específicos
1.Diseñar y documentar prácticas de procesamiento digital de señales, a partir de los
conocimientos básicos de la disciplina.
2.Diseñar y documentar prácticas de simulación de procesos representativos del
procesamiento digital de señales con la herramienta SCICOS.
3.Realizar una comparación tanto cualitativa como cuantitativa, con MATLAB y
Simulink.
4
1.2
Metodología
1º Recopilación de información bibliográfica referente a SCILAB, SCICOS, MATLAB y
Simulink. Además de información sobre comandos y funciones de estos programas en
cuanto a procesamiento digital de señales se refiere.
2º Recopilación de prácticas de procesamiento digital de señales llevadas a cabo tanto en
MATLAB y Simulink, como en SCILAB y SCICOS.
3º Análisis, interpretación y sistematización de la información recopilada.
4º Elaboración de prácticas de procesamiento digital de señales en SCILAB y SCICOS,
basadas en las prácticas obtenidas con MATLAB y Simulink.
5º Hacer una comparación cualitativa y cuantitativa entre MATLAB y Simulink con
SCILAB y SCICOS.
6º Presentación oral del proyecto ante el tribunal calificador del mismo.
5
CAPÍTULO 2: Desarrollo teórico
Tanto SCILAB como SCICOS al ser paquetes de software matemático poseen un
amplio número de comandos y funciones que les permite generar gráficos, señales de
sonido, diagramas, entre otros. Esto implica que es importante conocer los comandos con
los cuales no estamos familiarizados así como las funciones a utilizar en las prácticas. Sin
embargo debido al gran número de funciones de SCILAB y SCICOS nos centraremos
solamente en aquellas que permiten el procesamiento de señales y generación de bloques
en SCICOS.
2.1 Introducción a SCILAB
SCILAB es un software gratuito de lenguaje de programación de alto nivel
desarrollado por INRIA y ENPC. Ha sido generado para realizar aplicaciones de sistemas
de control y aplicaciones de procesamiento de señales. En si SCILAB posee tres grandes
partes: un intérprete, una librería de funciones y librerías de rutinas Fortran y C. Entre
algunas de la aplicaciones de SCILAB tenemos fundamentos de manejo de matrices,
herramientas de álgebra lineal, herramientas de control clásico, herramientas de control
robusto, herramientas de modelos ARMA, manejo de polinomios, gráficos 2D y 3D,
herramientas de procesamiento de señales, etc.
SCILAB provee un entorno de programación robusto, en el cual podemos escribir
programas llamados scripts u objetos que podemos ejecutar.
6
Al ser un programa gratuito, SCILAB se ha desarrollado en diversos sistemas
operativos como por ejemplo LINUX y WINDOWS, logrando alcanzar a todo aquel que
desee utilizar este software.
2.2 SCILAB y el procesamiento de señales.
Entre las funciones para el tratamiento de señales, SCILAB posee una gran variedad
de funciones, como por ejemplo la convolución, la inversión de matrices, transformada
rápida de Fourier (FFT), transformada discreta de Fourier (DFT), etc.
Las herramientas encontradas en SCILAB permiten el análisis e implementación de
filtros digitales, incluyendo respuesta en frecuencia, retardo de grupo y retardo de fase.
Además la implementación de filtros puede ser directa como utilizando técnicas en el
dominio de la frecuencia basadas en la FFT. También se establece el diseño de filtros IIR,
incluyendo Butterworth, Chebyshev I, Chebyshev II, Elíptico, optimizado en su diseño con
el criterio mínimo Lp. Otras propiedades de SCILAB son el diseño de filtros FIR y su
optimizado, el procesamiento de la FFT incluyendo la transformada base-2 y su inversa, y
las transformadas para potencias que no sean de dos, estimación espectral (espectro de
potencia), filtro óptimo y suavizado (filtro de Kalman, filtro de raíz cuadrada de Kalman,
transformación de Householder, filtro de Wiener, etc).
7
2.2.1 Tratamiento de señales.
En SCILAB es posible llevar a cabo distintas funciones que permiten desde la
convolución hasta la representación de sistemas lineales a través de su función de
transferencia o su espacio de estados.
Entre algunas de las funciones generadoras de señales SCILAB posee las siguientes:
•
sin: genera la función seno de un vector o matriz.
•
cos: genera la función seno de un vector o matriz.
•
asin y acos: genera la función seno inversa y coseno inversa de un vector o
matriz.
•
exp: obtiene los exponenciales de un vector o matriz.
•
sqrt: da la raíz cuadrada de un vector o matriz.
Existen otras funciones que desarrollan otras tareas como:
•
disp: despliega variables en la pantalla.
•
Title: despliega un título en una ventana de gráfico.
Debido al gran número de funciones que posee SCILAB solo veremos las más
importantes funciones y aplicaciones en el procesamiento de señales, las cuales se muestran
a continuación.
a) Representación de un sistema lineal por su función de transferencia.
El poder representar un sistema lineal por su función de transferencia nos permite
tomar distintas decisiones sobre el comportamiento de dicho sistema así como la
posibilidad de modificar este agregando filtros u otros modificadores al sistema. En
8
SCILAB se utilizan las expresiones racionales polinómicas para describir funciones de
transferencia. Estas funciones de transferencia pueden representar señales en el dominio
temporal continuo o discreto. Pero como ya sabemos las señales son sistemas continuos que
pueden ser transformados en discretos mediante el muestreo.
Para describir la función de transferencia en SCILAB se utiliza el comando syslin
el cual presenta la siguiente sintaxis.
-->sl=syslin(dominio, numerador,denominador);
En la sintaxis anterior se define el dominio de la función de transferencia, el
numerador de la función de transferencia y el denominador de la misma.
b) Representación en el espacio de estados (EE) de un sistema lineal.
Existen dos tipos de representaciones clásicas en el Espacio de Estados, la continua
y la discreta.
La continua es como se muestra a continuación:
˙ Ax tBu t 
ẋ=
(2.2-1)
yt =Cx t Du t
(2.2-2)
x 0=x o
(2.2-3)
En la forma discreta tenemos:
x n1=Ax  n Bu n
(2.2-4)
yn=Cx nDu n
(2.2-5)
x 0=x o
(2.2-6)
9
Siendo A, B, C y D matrices y Xo un vector.
Para representar en el Espacio de Estados, SCILAB vuelve a utilizar la función
syslin, pero de la siguiente forma:
--> sl=syslin(dominio,a,b,c,[,d[,x0]])
Siendo el valor de retorno de sl una lista con los siguientes elementos:
-->S=list(‘lss’,a,b,c,d,x0,dominio)
c) Cambio de representación: paso de función de transferencia (FT) al Espacio de
Estados (EE) y viceversa.
En los problemas normales de tratamiento de señales nos puede interesar una u otra
representación, que son totalmente equivalentes.
Para pasar de la función de transferencia a espacio de estados se usa el comando tf2ss
cuya sintaxis es:
-->sl=tf2ss(h)
Donde sl es el espacio de estados esperado y h es la función de transferencia a
transformar.
Para pasar de espacio de estados a función de transferencia se usa el comando ss2ft
que muestra la sintaxis:
-->h=ss2ft (sl)
10
d) Discretización de sistemas continuos.
En SCILAB un sistema lineal continuo en el tiempo representado por su EE o su
FT, puede ser convertido en discreto dentro del mismo dominio temporal, esto por medio
de la función dscr:
Considérese un sistema de espacios de estados de la forma
{
C ẋ  t = Ax tBu t 
y t =Cx t Du t 
}
(2.2-7)
De la fórmula de variación de constantes es posible estimar el valor del estado x(t)
en cualquier instante de tiempo t:

x t=e x  0 ∫ e
At
At− 
Bu   d 
(2.2-8)
0
Sea “i” los pasos de tiempo del muestreo de la señal continúa. La entrada u se
mantiene constante en los intervalos de longitud “i”, luego el modelo discreto (D) obtenido
del anterior (C) será:
{
 D x  n1= Ai x nBi u n
y n=C i x nDi u n 
Ai =exp Ai 
}
(2.2-9)
(2.2-10)
i
Bi =∫ e A i− B d 
(2.2-11)
0
La sintaxis de la función dscr es:
C i=C
(2.2-12)
D i =D
(2.2-13)
11
-->[f,g[,r]]=dscr(a,b,dt[,m])
En donde a y b son matrices asociadas al espacio de estados continuo, mientras que
f y g las matrices resultantes para el espacio de estados discreto.
x  n1=Fx nCu n
(2.2-14)
Si el argumento de entrada en la función dscr fuera el espacio de estados continuo
como una lista sl, sería:
-->[sld[,r]]=dscr(sl,dt[,m])
Siendo sld la lista que se representa en el espacio de estado discreto.
En el caso en que el espacio de estados continúo esté representado por su función de
transferencia h, esta será el argumento de entrada de la función hd (FT del discreto):
-->[hd]=dscr(h,dt)
e) Filtrado y su representación grafica.
El filtrado de señales mediante filtros representados por su espacio de estados o por
su función de transferencia se realiza con la función flts la cual tiene dos formatos:
En el caso de un sistema lineal dado por la ecuación de estados la sintaxis es:
-->[y[,x]]=flts(u,sl[,0])
Cuando el sistema lineal está dado por su función de transferencia:
-->y=flts(u,h[,past])
SCILAB utiliza el comando plot para representar gráficamente cualquier señal.
12
Ahora veremos un ejemplo del uso de los comandos plot y flts. Para ello
generamos dos señales sinusoidales X1 y X2, luego definimos un filtro de respuesta
impulsional finita wfir (el cual aun no ha sido visto), sumamos las dos señales de entrada
cuyo resultado es la señal x, obtenemos la función de transferencia del filtro la cual
llamaremos hz, aplicamos el filtro a la señal x y obtenemos la salida yhz:
-->[h,hm,fr]=wfir('lp',33,[.2 0],'hm',[0 0]);
-->t=1:200;
-->x1=sin(2*%pi*t/20);
-->x2=sin(2*%pi*t/3);
-->x=x1+x2;
-->z=poly(0,'z');
-->hz=syslin('d',poly(h,'z','c')./z**33);
-->yhz=flts(x,hz);
-->plot(yhz)
La señal de salida del filtro yhz es la mostrada en la siguiente figura:
Figura 2.1 Señal de salida del filtro yhz.
13
La señal de entrada X del filtro se muestra en la siguiente figura:
Figura 2.2 Señal de entrada X del filtro.
f) La FFT (Transformada rápida de Fourier) y la DFT (Transformada de Fourier
discreta).
Scilab para el cálculo de la FFT utiliza la función fft, cuya sintaxis es:
[x]=fft(a,-1)
[x]=fft(a,1)
x=fft(a,-1,dim,incr)
x=fft(a,1,dim,incr)
Para este caso:
x = vector real o complejo. Matriz real o compleja (2-dim fft)
a = vector real o complejo.
Dim = entero
14
Incr = entero
A continuación se muestra un ejemplo de una función coseno que es transformada
mediante la fft:
x=0:63;y=cos(2*%pi*x/16);
yf=fft(y,-1);
plot(y); //Función coseno sin filtrar;
plot(x,real(yf)’); // DFT de la función coseno.
La siguiente figura muestra la señal de la función coseno sin haber aplicado la fft.
Figura 2.3 Función coseno sin filtrar.
15
Al tomar la DFT de la función mostrada en la figura 2.3 obtenemos el gráfico
siguiente.
Figura 2.4 Transformada discreta de Fourier de la señal coseno.
Si lo que deseamos es hallar la transformada discreta de Fourier la sintaxis es:
[xf]=dft(x,flag);
En donde:
x: es el vector de entrada.
flag: indica dft (flag=-1) o idft(flag=1).
xf : es el vector de salida.
g) Convolución.
La convolución es definida como:
y k =∑ h j∗x k1− j
j
(2.2-15)
16
Scilab estima la convolución usando el método de la suma coincidente. Este es un
algoritmo basado en la definición de convolución y es implementado por un producto de
polinomios, el cual es mucho más eficiente si x es un arreglo extenso.
Para poder realizar la convolución SCILAB tiene la función convol la cual, presenta
tres tipos de sintaxis distintas.
-->y=convol(h,x)
-->[y]=convol(h,x)
-->[y,e1]=convol(h,x,e0)
En donde:
h: vector de la primera secuencia de entrada.
x: vector de la segunda secuencia de entrada.
e0: un vector, última cola de la suma en solaparse (no se usa en el primer llamado).
e1: nuevo vector de la suma en solaparse (no usado en el último llamado)
h) Chirp Z-transform (CZT).
Hay aplicaciones donde se requiere calcular muestras de la transformada Z dentro o
fuera del círculo unitario, o con diferente espaciamiento angular en el círculo unitario. Un
eficiente algoritmo que puede ser usado para calcular muestras de la transformadas Z en
estas aplicaciones, es conocido como chirp Z-transform (CZT) . En particular la CZT puede
ser usada como un eficiente algoritmo para el cálculo de valores de la transformada Z de un
17
ancho finito, para una secuencia de tiempo discreto, donde los puntos de la transformada Z
tienen la forma:
Z k = AW −k
(2.2-16)
A= Ao e j 
(2.2-17)
Donde
− j
W =W o e
(2.2-18)
Y donde A0 y W0 son valores reales constantes y θ y Φ son ángulos.
Figura 2.5 Localización de las muestras de la transformada Z para Wo < 1 y Wo > 1. Referencia (1).
El grupo de puntos {zk} se encuentra sobre la espiral donde z0 está a una distancia
A0 del origen y en un ángulo θ del eje x. Los puntos restantes son localizados a iguales
ángulos Φ entre ellos y aproximándose al origen por Wo > 1, moviéndose desde el origen
por W0 < 1, y permaneciendo en un círculo de radio A0 para W0 =1, la figura 2.5 indica la
localización de las muestras de la transformada z para Wo < 1 en el lado izquierdo de la
figura y Wo > 1 en el lado derecho de la figura.
La sintaxis de la CZT es la siguiente:
18
-->[czx]=czt(x,m,w,phi,a,theta);
En donde los parámetros son:
x: secuencia de entrada.
m: es el valor CZT en m puntos del plano z.
W: multiplicador de magnitud.
Phi: incremento de fase.
a: magnitud inicial.
theta: fase inicial.
czx: salida de “chirp z transform”.
2.2.2
Diseño de filtros con Scilab.
La teoría general del diseño de Filtros Digitales nos conduce al agrupamiento de las
funciones para el diseño en cuatro métodos:
Diseño de filtros IIR usando prototipos analógicos.
Diseño de filtros IIR directo.
Diseño de filtros FIR directo.
Diseño de filtro inverso.
a) Diseño de filtros FIR (Finite Impulse Response).
Como usar el comando wfir
Esta función puede tener dos tipos de sintaxis, la primera de ellas:
19
--> [wft,wfm,fr]=wfir()
Donde el paréntesis es una parte requerida del nombre. Este tipo de función es
interactiva y propone el uso de parámetros de entrada requeridos, semejantes al tipo de
filtro (lp = paso bajo, hp = paso alto bp = paso banda, sp = rechaza banda), el ancho del
filtro (un integer n > 2), tipo de ventana (re = rectangular, tr = triangular, hm = hamming, kr
= kaiser, ch = chebyshev) y otro parámetro especial  para hacer generalizaciones de la
ventana Hamming (0 <  < 1) y  para la ventana Kaiser (  > 0). Los tres retornan
argumentos como:
wft:: un vector contiene los coeficientes de ventana del filtro para un ancho de filtro
“n”.
wfm: un vector de 256 de ancho contiene la respuesta en frecuencia del filtro al cual
se le aplicó la ventana.
fr: un vector de 256 de ancho contiene los valores de frecuencia de los ejes (0 < fr <
0,5) asociado al valor contenido en wfm.
La segunda sintaxis de la función es la siguiente.
--> [wft,wfm,fr] =wfir(ftype,forder,cfreq,wtype,fpar)
Esta forma de la función no es interactiva y todos los parámetros de entrada deben
ser dados como argumentos de la función.
Ftype: indica el tipo de filtro a construir y puede tomar valores de lp, hp, bp y sb
representando paso bajo, paso alto, paso banda y rechaza banda respectivamente.
Forder: es un integer positivo que da el orden del filtro elegido.
20
Cfreq: es un vector-dos para el cual solo el primer elemento es usado para el caso de
filtros paso bajo y paso alto. Bajo estas circunstancias cfreq(1) es la frecuencia de corte
(“cut-off frequency”) en Hertz del filtro escogido. Para el pasa banda y el rechaza banda
ambos elementos de cfreq son usados, el primero de ellos es la frecuencia baja de corte y el
segundo la frecuencia alta de corte del filtro. Ambos valores de cfreq deben estar entre 0 y
0.5 correspondiendo a los posibles valores de una respuesta de frecuencia discreta.
Ftype indica el tipo de ventana escogida y puede tomar valores de re, tr, hm, hn, kr,
o ch
representando respectivamente las ventanas rectangular, triangular, Hamming,
Hanning, Kaiser y Chebyshev.
Fpar es un vector de dos valores para el cual solo el primer valor es usado para el
caso del uso de la ventana Kaiser y solo en la ventana Chebyshev se usan ambos elementos.
En el caso de la ventana Kaiser el primer elemento indica el cambio relativo entre el lóbulo
principal de la respuesta en frecuencia de la ventana y el ancho del lado del lóbulo (debe ser
un entero positivo). Para la ventana Chebyshev se puede especificar el ancho del lóbulo
principal de la ventana o el tamaño de los lados del lóbulo. El primer elemento de fpar
indica el tamaño del lado del lóbulo y toma valores con rangos entre 0 y 1 y el segundo
elemento da el ancho del lóbulo principal el cual puede tener valores entre 0 y 0.5. el
elemento especificado del vector fpar es indicado asignando un valor negativo. De esta
manera fpar = [0.01, -1] significa que la ventana Chebyshev tiene los lados del lóbulo de
un tamaño 0.01 y el ancho del lóbulo principal izquierdo no especificado.
Debido a las propiedades lineales de los filtros de fase lineal FIR no es posible
diseñar un filtro paso alto de un ancho regular o un filtro rechaza banda.
21
b) Técnicas de muestreo de frecuencia.
Esta técnica es basada en un grupo especificado de muestras que se eligen de la
respuesta en frecuencia tomada con N puntos espaciados uniformemente alrededor de un
círculo unitario, donde N es la longitud del filtro. Según la referencia (1) la transformada z
de un filtro FIR es mostrada de la siguiente forma:
N −1
 H k 
z−N
H  z =1−
∑ 

N k =0 1−z −1 e j  2 / N  k  
(2.2-19)
Esto significa que una aproximación de respuesta en frecuencia continua se obtiene
tomando un muestreo en frecuencia con N puntos equidistantes alrededor del círculo
unitario (la frecuencia de muestreo), e interpolando entre estos obteniendo la respuesta en
frecuencia continua. De esta forma el error de aproximación podría ser exactamente cero
en las frecuencias de muestreo y finito entre estos. Este factor tiene que ser relacionado a la
construcción de una función continua para estas muestras.
La fórmula de interpolación para un filtro FIR, que ésta en esta respuesta de
frecuencia, es obtenido al evaluar la ecuación anterior en el circulo unitario.
N −1
H e jw =
{
[H  k  e− jk  / N  sin Nw /2]
e− jw N −1 /2 
∑
N
[sin w /2−k / N ]
k =0
H e jw =
}
(2.2-20)
N −1
e− jw N −1 /2 
∑ H  k  S w , k 
N
k =0
(2.2-21)
Donde
S  w , k =e− jk  / N 
sin  Nw / 2
sin N w /2−k / N 
=±e− jk  / N 
(2.2-22)
sin w /2−k / N 
sin w / 2−k / N 
22
La ecuación 2.2-22 muestra las funciones interpoladas. De esta forma, cada
frecuencia muestreada de la respuesta en frecuencia continua es proporcional a la
interpolación sin(Nw/2)/sin(w/2) sustituyendo por k / N
en frecuencia. La principal
deficiencia de esta técnica es la carencia de flexibilidad al especificar la transición del
ancho de banda, el cual es igual al número de muestras elegidas en el tiempo π/N y de esta
manera esta fuertemente relacionado a N. Esto genera un pequeño rizado cerca del flanco
de la banda.
La figura 2.6 muestra la respuesta obtenida por un filtro paso banda tipo 1 con una
longitud de 65. La primera respuesta es obtenida sin muestras en la banda de transición y la
segundo con un muestreo de magnitud 0.5 en cada una de las bandas. Dependiendo de
donde ocurra la frecuencia de muestreo, se dan dos distintos grupos de frecuencias de
muestreo correspondientes a los llamados filtros FIR tipo 1 y tipo 2.
f k=
f k=
k
k =0,... , N −1 para filtro tipo 1
N
k 1 /2
k =0,... , N −1 para filtro tipo 2
N
(2.2-23)
(2.2-24)
23
Figura 2.6 Filtro pasa banda tipo 1 sin muestra y con muestra en cada banda de transmición.
Referencia (1).
Para obtener esta figura se tiene el siguiente código:
hd=[0*ones(1,15) ones(1,10) 0*ones(1,39) ];//muestras tomadas
hst1=fsfirlin(hd,1);//filtro sin muestras en la transición.
hd(15)=0.5;hd(26)=0.5;//muestras en la banda de transición
hst2=fsfirlin(hd,1);//filtro correspondiente
pas=1/prod(size(hst1))*.5;
fg=0: pas:0.5;// grid de frecuencia normalizada
n=prod(size(hstl))
n= 257.
24
plot (fg(1:n),hst1);
plot2d(fg(1:n)', hst2');
El tipo de diseño deseado depende de la aplicación. Por ejemplo, un corte de banda
puede ser más cerrado en los puntos de frecuencia muestreada en un filtro tipo 1 que en un
filtro tipo 2. La siguiente figura muestra estos puntos para un filtro paso bajo con una
longitud 64 y sin muestrear en la banda de transición.
Figura 2.7 Filtro paso bajo tipo 1 y tipo 2. Referencia (1).
El código para generar esta figura es:
-->hd =ones (1,32); hd(65)=0;//definición de muestras
-->hst1=fsfirlin(hd,1);//filtro tipo 1
-->hst2=fsfirlin(hd,2);//filtro tipo 2
-->pas=1/prod(size(hst1))*0.5;
-->fg=pas:pas:0.5;//grid de frecuencia normalizada.
-->plot2d([fg;fg]',[hst1;hst2]');
25
La línea rellena da la respuesta aproximada para el filtro líneal FIR tipo 1.
2.2.3 Manipulación de sonido en SCILAB.
SCILAB permite agregar archivos de audio tipo wav, permitiendo modificar estos a
gusto utilizando filtros y otras formas de alteración. Además permite graficar la
frecuencia de una señal de sonido y generar sus propios sonidos si es requerido y así
poder salvar estos como archivos tipo wav. Esto es de gran utilidad, ya que, permite
mostrar la eficiencia y funcionamiento de otras funciones y propiedades de este
software.
Para graficar la frecuencia de una señal de audio se utiliza la función analyze la cual
tiene la siguiente sintaxis.
-->analyze(w[,fmin,fmax,rate,points])
En donde:
fmin: es un escalar cuyo valor por defecto es de 100 e indica la frecuencia mínima de la
gráfica.
Fmax: es un escalar y determina la frecuencia máxima de la gráfica cuyo valor por
defecto es de 1500.
w: es la señal a graficar.
Rate: es la velocidad de muestreo y tiene un valor por defecto de 22050.
points: marca el número máximo del largo de los datos y posee un valor por defecto
de 8192.
26
Es posible cargar un archivo de sonido en SCILAB; para ello, se utiliza la función
loadwave. Esta función carga un archivo se sonido tipo wav en un vector de salida X
mediante la sintaxis:
-->X=loadwave('nombre del archivo');
SCILAB puede además generar la gráfica de un mapa de sonido mediante la
secuencia llamada mapsound cuya sintaxis es:
-->mapsound (w,dt,fmin,fmax,simpl,rate).
Esta función lleva a cabo la FFT en incrementos de tiempo “dt” (con un valor por
defecto de 0.1), donde “rate” es la velocidad de muestreo, simpl son los puntos
muestreados. fmin y fmax marcan los límites de frecuencia del mapa de sonido de la señal
de entrada w.
Finalmente es posible guardar un archivo de sonido empleando la función savewave la cual
salva un determinado sonido en un vector “x” a una razón de velocidad “rate”. Para esta
función la sintaxis es:
-->savewave('nombre del archivo',x[,rate]);
2.2.4
Gráficas
Como se menciono anteriormente para poder graficar una función, SCILAB utiliza la
función plot y plot2d.
La función plot realiza la gráfica de un grupo de curvas 2D utilizando una de las
siguientes sintaxis:
-->plot (y, <linea_especial>, <propiedad_global>)
27
-->plot(x,y, <linea_especial>, <propiedad_global>)
-->
plot(x1,y1,<linea__especial1>,<propiedad_global_1>,x2,y2,<linea_especial_2>,
<propiedad_global_2>, ..., xN,yN,<linea_especial_N>,<propiedad_global_N>)
En donde:
x: es una matriz o vector real.
y: es una matriz o vector real.
<linea_especial>: es un argumento opcional que debe ser un arreglo y ha de ser
utilizado como una conexión a especificar una ruta de dibujo de la línea. Esta determina el
estilo de la línea y el color.
<propiedad_global>: Este argumento representa una secuencia de acoples de estados
{nombre_de_la_propiedad,valor_de_la_propiedad} que define las propiedades globales del
objeto aplicadas a todas las curvas creadas en estas gráficas.
Para graficar un vector o matriz versus otro vector o matriz se utiliza la función
plot2d, cuya sintaxis es:
plot2d([x],y)
plot2d([x],y,<opta_args>)
En donde:
x: es un vector o matriz real, la cual si se omite, es asumida como un vector 1:n donde
“n” es el número de puntos dados por el parámetro “y”.
y: es una matriz o vector real.
<opt_args>: este representa una secuencia de estados key1=valor1, key2=valor, ...,
donde key1, key2, ... pueden ser uno de los siguientes argumentos.
28
•
Style: grupos de estilos de cada curva. Es asociado a valores que podrían ser
un vector real con valores enteros (positivos o negativos).
•
Rect: número de saltos mínimos requeridos por la gráfica. El valor asociado
podría ser un vector real con 4 enteros [xmin,ymin,xmax,ymax].
•
Logflag: altera la escala de los ejes (lineal o logarítmica). Puede se un arreglo
con posibles valores: “nn”, “nl” y “ll”.
•
Frameflag: controla la computación de los rangos coordinados actuales para
los mínimos valores requeridos. Puede ser un valor entero con rango de 0 a 8.
•
axesflag: especifica como los ejes deben ser dibujados. Es un entero cuyo
valor va en un rango de 0 a 5.
•
nax: grupos de etiquetas de ejes y definición de tics. Es un vector real con 4
enteros [nx,Nx,ny,Ny].
•
leg: grupo de leyendas de curvas. Se asocia a un arreglo de caracteres.
2.3 SCICOS
SCICOS es la herramienta informática para modelado y simulación del software
científico SCILAB. SCICOS modela los sistemas físicos mediante bloques interconectados.
El usuario puede crear sus propios bloques que son programables a través de SCILAB, C o
FORTRAN, siendo útil también para los usuarios de MATLAB, ya que pueden desarrollar
el código en MATLAB y traducirlo a SCILAB, mediante una herramienta de traducción
que incluye SCILAB.
29
SCICOS tiene la capacidad de modelar sistemas dinámicos, ya sean sistemas discretos
o continuos. Incluye además un editor gráfico para la construcción de modelos mediante
inter conexión de bloques. Estos bloques representan funciones fundamentales predefinidas
en SCILAB o definidas por el usuario.
Para
cada señal en SCICOS se asocia un conjunto de índices de tiempos de
activación, llamados tiempos de activación sobre los que la señal puede evolucionar. Fuera
de estos tiempos de activación las señales de SCICOS permanecen contantes según se
muestra en la siguiente figura.
Figura 2.8 Filtro paso bajo tipo 1 y tipo 2. Referencia (2).
El conjunto de tiempo de activación es una unión de intervalos de tiempo y puntos
aislados llamados eventos (events). Las señales en SCICOS son generadas por bloques
(blocks) controlados por señales de activación, que hacen que los bloques produzcan una
30
salida a partir de su entrada y de su estado interno. La señal de salida hereda del bloque que
le ha generado, el conjunto de tiempos de activación (activation time set), pudiéndose usar
esta para controlar otros bloques.
Para mostrar la estructura de los bloques se muestra la siguiente imagen de dos
bloques de SCICOS.
Figura 2.9 Estructura de los bloques en SCICOS. Referencia (2).
En la parte superior de los bloques se muestra las entradas para las señales de
activación (activation input ports) de los bloques. Cuando un bloque no posee entradas de
activación se encuentra permanentemente activo, sin embargo recibe sus tiempos de
activación a partir de sus señales de entrada (input signals).
En la parte inferior del bloque se presentan las salidas de activación (activation output
ports), estas son consideradas como señales de activación generadas por los bloques.
31
2.3.1
El editor de SCICOS
En SCICOS se llama super bloques a los subsistemas que forman un único bloque
partiendo de un grupo de bloques simples.
Para abrir la ventana principal de SCICOS se debe teclear scicos() en SCILAB. Luego
de ello aparecerá la ventana principal de SCICOS, esta ventana es como se muestra en la
siguiente imagen.
Figura 2.10 Ventana principal de SCICOS. Referencia (2).
2.3.2 Construcción de un modelo en SCICOS.
Para construir los modelos de sistemas en SCICOS se realizan los siguientes pasos:
32
Abrir las paletas de bloques: en el menú Edit se encuentra el botón Palettes, que
permite abrir una o más paletas de bloques. Luego de dar clic aparece una ventana de
diálogo, donde se elije la paleta deseada.
La siguiente figura muestra la ventana de diálogo.
Figura 2.11 Ventana de elección de paletas.
Entre las paletas se tienen las de:
•
Paletas de Entradas/Salidas.
•
Paleta Lineal
•
Paleta No Lineal.
•
Paleta de Eventos.
•
Paleta de Umbral (Threshold).
33
•
Paleta Otros.
•
Paleta de Bifurcación.
Al realizar un clic en el botón copy del menú Edit, es posible copiar bloques en la
ventana principal de SCICOS desde las paletas. Se puede además hacer clic con el botón
izquierdo y arrastrar el bloque a la ventana principal. También es posible cancelar la
selección con el botón derecho del ratón. Para borrar un bloque se hace clic en Delete del
menú Edit y hago clic sobre el bloque a borrar.
Para conectar las entradas y salidas de los bloques, se selecciona primero el botón
Link del botón Edit. Luego se hace clic en la salida de un bloque y nuevamente en la
entrada a la que dejamos enviar la señal, quedando ambos conectados. También se puede
partir o terminar en puntos intermedios en los enlaces. Para acabar el proceso de enlazado
solamente se debe de hacer clic con el botón derecho del ratón.
Cabe recalcar que se debe incluir un bloque scope o
write to file, para poder
visualizar los datos de una simulación.
Con nuestro modelo ya completo se puede realizar una simulación usando el botón
Run del menú Simulate. Esto provoca la compilación del modelo y después la simulación.
La simulación se puede detener haciendo clic sobre el botón Stop
en la ventana de
SCICOS.
Finalmente un modelo compilado puede ser salvado como un fichero *.cos.
34
Podemos modificar los parámetros de los bloques abriendo los menús de diálogos, al
seleccionar el botón Open/set del menú Object.
Los parámetros pueden ser definidos utilizando expresiones de SCILAB e incluso se
puede utilizar variables de SCILAB si ya han sido definidas. Estas expresiones son
memorizadas simbólicamente y evaluadas posteriormente.
El editor SCICOS proporciona muchas otras funcionalidades como por ejemplo:
•
Salvar y cargar diagramas de modelos en varios formatos.
•
Ampliación de zonas de modelos.
•
Cambio de aspecto de los bloques y colores.
•
Cambio de color de fondo de los diagramas de los modelos y de los bloques.
•
Adherir textos al diagrama.
•
La posibilidad de imprimir y exportar diagramas.
•
Y muchas otras funciones GUI estándar.
La ayuda de la ventana principal de SCICOS puede usarse seleccionando el botón de
ayuda y haciendo clic sobre el bloque o botón del cual deseo información.
Al implementar la programación de nuevos bloques puedo obtener información de las
funciones a utilizar desde la ventana principal de SCILAB haciendo clic en el botón Help
Dialog del menú Help. Aparece entonces una ventana en la que elijo SCICOS en la parte
inferior Chapters y selecciono en la zona superior la función de la que quiero ayuda y
pulso el botón Show.
35
Figura 2.12 Ventana de ayuda a través de SCILAB. Referencia(2).
Si deseo ejecutar los demos de SCICOS hago clic en el botón Demos del menú File
en la ventana principal de SCILAB, en el que aparece el cuadro de diálogo siguiente:
Figura 2.13 Cuadro de diálogo de selección de demos.
36
Luego selecciono SCICOS y hago clic en el botón OK, apareciendo otra ventana con
todos los demos disponibles para SCICOS, seleccionando el que se desea ejecutar y
haciendo clic en el botón OK.
Una importante característica de SCICOS es la posibilidad de generar subsistemas en
donde se generan agrupaciones de bloques. Para esto se da la posibilidad de agrupaciones
de bloques definiendo subdiagramas llamados Super Bloques
(Super Blocks), que se
comportan como cualquier otro bloque pero pueden contener un número ilimitado de
bloques, e incluso otros super bloques. Los super bloques tienen la siguiente apariencia:
Figura 2.14 Apariencia de un super bloque.
Al hacer doble clic sobre un super bloque podemos observar todos los bloques que
contiene.
2.3.3
Tipos de bloques en SCICOS
Existen tres tipos de bloques fundamentales en SCICOS: el bloque normal, el bloque
de cruce y el bloque sincronizado. Estos pueden tener dos tipos de entradas y dos tipos de
salidas, entradas normales, entradas de activación, salidas normales y salidas de activación.
Las entradas y salidas normales se conectan mediante enlaces normales, mientras que las
entradas y salidas de activación se conectan mediante enlaces de activación.
37
a) Bloque normal simple continuo.
Los bloques normales simples continuos pueden tener un estado continuo x y un
estado discreto z. Al considerar que tiene un estado continuo x y si su entrada normal es u,
entonces cuando el bloque esté activado durante un intervalo de tiempo, su estado x
evoluciona de acuerdo con:
ẋ= f t , x , z , u , p , ne 
(2.3-1)
p es un vector de parámetros constantes, ne es la clave de activación representada por
un entero designando el puerto a través del cual es activado. En el caso en que las entradas
de activación sean i1, i2, ..., in entonces.
n
n e =∑  2i −1 
j=1
(2.3-2)
j
Por otro lado si el bloque estuviera activado por un evento, los estados x y z cambian
instantáneamente de acuerdo con las siguientes ecuaciones.
x t e = g c t e , x t e  , z t e  , u t e  , p , n e 
(2.3-3)
z t e =g d t e , x t e  , z t e  , u t e  , p , ne 
(2.3-4)
−1
−1
−1
−1
Donde te representa el tiempo en el que se produce el evento y el estado discreto z
permanece constante entre dos eventos sucesivos, luego z(te-) puede ser interpretado como
el valor previo de z. Durante el tiempo de activación, la salida normal del bloque viene
definida por:
38
−1
−1
y t=ht , x t  , z t  , u t  , p , ne 
(2.3-5)
Que será constante cuando el bloque no esté activo.
Este tipo de bloques puede generar señales de activación de tipo evento. Si esta señal
es activada por un evento en el instante te, entonces el tiempo de cada salida tipo de evento
viene dado por:
t evo =k t e , z t e  ,u t e  , p , ne 
(2.3-6)
Donde tevo es un vector de tiempo. La generación de eventos puede ser preprogramada
asociando las variables de disparo de los bloques con la salida de eventos.
Figura 2.15 Bloque normal simple continuo. Refrencia (2).
39
b) Bloque normal simple discreto.
Un bloque normal continuo está constantemente actualizando sus salidas y su estado
continuo. Los bloques normales simples discretos actúan solo cuando reciben un evento de
entrada y sus acciones son instantáneas por lo que deben tener una entrada evento como
mínimo. Si se tiene una señal de entrada u y una señal de salida y, con la llegada de un
evento o eventos en un tiempo (te), entonces su estado y sus salidas cambiarán de la
siguiente forma.
z := f d t e : z t e : u t e : p : n evprt 
(2.3-7)
y :=h d t e : z : u t e : p
(2.3-8)
−1
−1
Donde fd y hd son funciones específicas del bloque, p es un vector de parámetros
constante y nevprt designa el puerto (s) a través del cual el evento ha llegado. Los bloques
discretos no pueden tener un estado continuo y sus salidas permanecen constantes entre dos
eventos; no igual sucede en los bloques continuos.
40
Figura 2.16 Bloque normal simple discreto. Referencia (2).
c) Bloque simple de cruce por cero.
Tienen entradas de señales normales, entradas y salidas de eventos pero no pueden
tener señales de salidas normales. Tiene la capacidad de generar un evento de salida
solamente si al menos una de sus entradas normales cruza el cero (cambia de signo). Si esto
ocurre se genera un evento y su tiempo de activación dependerá del cruce por cero de las
señales de entrada y del signo de ellas justo luego del cruce.
41
Figura 2.17 Bloque simple de cruce por cero. Refrencia (2).
d) Bloque simple sincronizado
Generan señales de salida de activación que están sincronizadas con sus señales de
entradas de activación. Solo poseen una entrada de activación, que es dirigida a una de sus
salidas de activación. La elección de una de estas salidas depende del valor de la señal de
entrada normal. Algunos ejemplos de estos tipos de bloques son los bloques if, else, then,
event y select.
42
Figura 2.18 Bloque simple sincronizado. Refrencia (2).
e) Herencia y dependencia temporal
Para evitar que se tengan que dibujar todas las señales de activación de un diagrama
en SCICOS, se utiliza la característica llamada herencia. Si un bloque no tiene una entrada
de activación que regule la señal de entrada normal y está activo permanentemente, se le
puede declarar como dependiente del tiempo y no es necesaria la entrada de activación. Es
importante decir que los bloques dependientes del tiempo no heredan.
2.3.4
Construcción de nuevos bloques.
Al construir un nuevo bloque este puede ser generado como un superbloque
(mediante la interconexión de otros bloques simples) compilándose luego. También se
puede crear un nuevo bloque simple mediante las dos funciones siguientes:
43
Función interfaz (Interfacing funtion) que determina la interfaz con el usuario. Esta
función esta siempre escrita en código SCILAB, pudiéndose utilizar funciones SCILAB o
que sean desarrolladas por el usuario.
Función computacional (Computational function) esta función permite especificar el
comportamiento dinámico del bloque. Posee una amplia flexibilidad al poder ser
programada en C, Fortran y en lenguaje SCILAB; interactúa permanentemente dando
mejores resultados en lo que concierne al rendimiento de la simulación.
La función interfaz determina tamaño, color, geometría, número de puertos, etc. en
adición con los estados inicial y los parámetros. Esta función también proporciona el
diálogo del usuario con el bloque. La funcionalidad y respuesta de esta función depende de
la variable de entrada de estatus (input flag) job.
Sintaxis
-->[x,y,typ]=block(job,arg1,arg2)
Parámetros:
job =='plot' : la función dibuja el bloque.
arg1 es la estructura de datos del bloque
arg2 no se usa.
x,y,typ no se usa.
Podemos usar la función standard_draw la cual dibuja un bloque rectangular, y los
puertos de entrada y de salida. También determina el tamaño, icono y color que dan el
aspecto al bloque.
44
Job=='getinputs':la función retorna la posición y el tipo de puertos de entrada (normal
o activación).
Arg1 es la estructura de datos del bloque
arg2 no se usa
x es el vector de las coordenadas x de los puertos de entrada.
Y es el vector de las coordenadas y de los puertos de entrada.
Typ es el vector del tipo de puertos de entrada (1 para regular y 2 para activación)
En general podemos usar la función standard_input.
Job =='getoutput' : la función retorna la posición y el tipo de puertos de salida (nomal
o activación)
x es el vector de las coordenadas de x de los puertos de salida
y es el vector de las coordenadas de y de los puertos de salida
typ es el vector del tipo de puertos de salida (1 para regular y 2 para activación)
En general podemos utilizar la función standard_output.
Job=='getorigin' : la función retorna las coordenadas del punto interior izquierdo del
rectángulo que contiene la silueta del bloque.
x es el vector de las coordenadas de x del punto inferior izquierdo del bloque
y es el vector de la coordenada y del punto inferior izquierdo del bloque.
En general podemos utilizar standard_origin.
Job=='set' : la función abre un diálogo para adquirir los parametros del bloque.
x es la nueva estructura de datos del bloque
y no se usa
45
typ no se usa
En general podemos usar la función standard_origin.
Job == 'define' : inicialización de la estructura de datos del bloque (nombre de la
función computacional, tipo, número y tamaño de las entradas y salidas, etc.)
arg1 no se usa
arg 2 no se usa
x es la estructura de datos del bloque
y no se usa
typ no se usa.
Definición de la estructura de datos del bloque.
2.3.5
Los bloques en SCICOS están definidos por una estructura de datos SCILAB como
sigue:
list ('block',graphics,model,ununsed,GUI_function)
GUI_function es una cadena de caracteres (string) que contiene el nombre de la
correspondiente función interfaz y graphics es la estructura de datos que contiene los datos
gráficos:
graphics=list ([xo,yo],[l,h],orient,dlg,pin,pout,pcin,pcout,gr_i)
Xo coordenada x del origen del bloque
Yo coordenada y del origen del bloque
l ancho del bloque
46
h altura del bloque
orient es un booleano
dlg es un vector de cadenas de caracteres que contienen los parámetros simbólicos
del bloque.
Pin vector, pin(i) es el número de enlace conectado al puerto de entrada normal iésima y es 0 cuando no están conectados.
Pout vector, pout(i) es el número de enlace conectado al puerto de salida normal iésima y es 0 cuando no están conectados.
Pcin vector, pcin(i) es el número de enlace conectado al puerto i de entrada de
activación i-ésima y es 0 cuando no están conectados.
Pcout vector, pcout(i) es el número de enlace al puerto de salida de activación i-ésima
y es 0 cuando no están conectados.
gr_i vector de cadena de caracteres que contiene las instrucciones usadas para dibujar
el icono.
La estructura de datos que contiene la información de la simulación es model.
Model=list(eqns,numinput,numoutput,numclk_input,numclk_output,state,dstate,rpar,i
par,typ,firing,deps,label,unused)
eqns lista que contiene dos elementos. El primero es una cadena que contiene el
nombre de la función computacional (FORTRAN, C o función SCILAB). El segundo
elemento es un entero que especifica el tipo de función computacional. El tipo de función
computacional especifica básicamente la secuencia de llamada.
47
Numinput vector de tamaño igual al número de puertos de entrada normales del
bloque. Cada entrada muestra el tamaño del correspondiente puerto de entrada. Un entero
negativo indica que debe ser determinado por el compilador. Si damos el mismo entero
positivo en más de un puerto de entrada o salida indica al compilador que esos puertos
tienen igual tamaño.
Numoutput vector de igual tamaño al número de puertos de salidas normales del
bloque. Si se tiene un entero negativo indica que debe ser determinado por el compilador.
Si muestra el mismo entero negativo en más de un puerto de entrada o salida indica al
compilador que esos puertos tienen igual tamaño.
numclk_input vector de tamaño igual al número de puertos de entrada de activación.
Todas las entradas deben ser iguales a 1. SCICOS no soporta enlaces de activación
vectorizados.
numclk_output vector de tamaño igual al número de puertos de entrada de activación.
Todas las entradas deben ser iguales a 1. SCICOS no soporta enlaces de activación
vectorizados.
State vector columna que contiene el estado continuo inicial
dstate vector columna de parámetros reales pasados a la correspondiente función
computacional.
Rpar vector columna de parámetros reales pasados a la correspondiente función
computacional.
Ipar vector columna de parámetros enteros pasados a la correspondiente función
computacional.
48
Typ cadena que indica el tipo de bloque simple : 'z' = bloque de cruce por cero, 'i' =
bloque sincronizado y 's' = bloque normal.
Firing vector columna de los tiempos de disparo inicial de tamaño igual al número de
puertos de salida de activación del bloque. Este vector incluye tiempos de disparo de
eventos pre programados (<0 si no hay disparo).
Deps [udep timedep]
udep booleano. True si el sistema tiene alimentación directa, o sea que al menos una
de las salidas depende explicitamente de una de las entradas.
Timedep booleano. Verdad si el bloque es dependiente temporalmente.
Label cadena de caracteres, usada como identificador del bloque. Este campo puede
ser seleccionados en el botón label del menú block.
2.3.6
Función computacional
Esta función evaluá la salida dependiendo del tipo de bloque y la forma que sea
llamada por el simulador.
El simulador SCICOS llama a la función computacional para realizar diferentes tareas
(task), utilizando una variable status (flag) para especificar la tarea que se debe ejecutar,
como se muestra en la tabla.
49
Tabla 2.1 Status de la función computacional.
Status (flag)
Tarea (task)
0
Estado derivativo computacional
0
estado derivativo computacional
1
outputs update
2
state update
3
output event timing
4
initialization
5
ending
6
re-initialization
Inicialización: el simulador llama a la función computacional para conocer el estado
del arranque y la salida de inicialización (las entradas no se encuentran disponibles en el
momento de arranque). Otras tareas como abrir un fichero, inicialización de la ventana
gráfica, etc..., pueden también ser ejecutadas en este punto.
Reinicialización: el simulador puede llamar al bloque un determinado número de
veces para la inicialización. Esta representa otra oportunidad para iniciar los estados y las
salidas. Pero esta vez, las salidas se encuentran disponibles.
50
Actualización de las salidas: El simulador llama para obtener los valores de las
salidas. De esta manera la función computacional debería evaluar el status (4) mostrado en
la tabla 2.1..
Actualización de los estados: Uno o más eventos han llegado y el simulador llama a la
función computacional para actualizar los estados x y z de acuerdo con los status (2) y (3)
de la tabla 2.1.
Cálculo del estado derivado: El simulador se encuentra en una fase continua; y se
necesita la derivada de x. Esto significa que la función computacional debe evaluar el
estado derivativo computacional..
Tiempo de salida de eventos: El simulador llama a la función computacional en el
tiempo de sus eventos de salida. Para realizar esto la función computacional deberá evaluar
el status (5) de la tabla 2.1.
Terminación: El simulador llama a la función computacional una vez más al final (es
útil para cerrar ficheros, liberar la memoria, etc..).
51
a) Tipos de funciones computacionales.
En SCICOS las funciones computacionales pueden ser de diferentes tipos y coexistir
en un mismo diagrama de un modelo. Los tipos de funciones existentes vienen
especificados en la siguiente tabla.
Tabla 2.2 Tipos de función.
Tipo de función
SCILAB
Fortran
C
Comments
0
si
si
si
Fixed calling
sequence
1
no
si
si
Varying calling
sequence
2
no
no
si
Fixed calling
sequence
3
si
no
no
Input/outputs are
SCILAB list
El tipo de función computacional utilizada es almacenada en el segundo campo de
eqns.
Función computacional tipo 0: el simulador construye un único vector también. Este
tipo es soportado por versiones de SCILAB anteriores a la 2,4. La secuencia de llamada es
igual que la de la función computacional tipo 1 con una entrada normal y salida normal.
52
Función computacional tipo 1: la forma más sencilla de explicar este tipo es mediante
un ejemplo. Los parámetros (I de entrada y O de salida) que utilizan las funciones tipo 1
son los que muestra la siguiente tabla.
Tabla 2.3 Parámetros de entrada/salida que utilizan funciones tipo 1.
I/O
Args
Descripción
I
flag
0,1,2,3,4,5 o 6
I
Nevprt
Código de activación
I
t
tiempo
o
xdot
Derivada de estados continuos
I/O
x
Estado continuo
I
nx
Tamaño de x
I/O
z
Estado discreto
I
nz
Tamaño de z
O
tvec
Tiempos de salida de eventos (para
flag 3)
I
ntvec
Número de puertos de activación
I
rpar
parámetros
I
nrpar
Tamaño de rpar
I
ipar
parámetros
I
nipar
Tamaño de ipar
I
ui
Ith input (regular), i=1,2,...
I
nui
Tamaño de entrada ith
O
yj
Salida jth (regular) j=1,2,.....
I
nyj
Tamaño de salida jth
53
CAPÍTULO 3: Elaboración de prácticas de procesamiento
digital de señales en SCILAB.
Las prácticas elaboradas fueron tomadas de las prácticas recopiladas del curso
Procesamiento Digital de Señales IE-0102 de la Universidad de Costa Rica. Estas prácticas
que fueron inicialmente elaboradas para ser ejecutadas con MATLAB fueron modificadas
en este capitulo para poder ejecutarlas con SCILAB.
3.1
Primera práctica.
En esta primera práctica se muestra como generar algunas señales y sus gráficas en
forma discreta, en si se generan secuencias exponenciales complejas, real, imaginaria y
como generar señales de ruido. Además se da el suavizamiento de una señal por un filtro
de promedio móvil.
A continuación se muestra la práctica número 1:
Procesamiento Digital de Señales IE-0102
Práctica #1 con SCILAB.
SCILAB incluye un sinnúmero de funciones que pueden usarse para la generación
de señales. Algunas de estas funciones son:
exp, sin.cos, square, sawtooth
El programa que se puede utilizar para generar una secuencia exponencial compleja
es:
54
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 1.1
// Generación de una secuencia exponencial compleja
// a = -1/12; b = %pi/6; K = 1;N = 41;
a = input('Introduzca exponente real = ');
b = input('Introduzca exponente imaginario = ');
c = a + b*%i;
K = input('Introduzca la constante de ganancia = ');
N = input('Introduzca longitud de secuencia = ');
n = 1:N;
x = K*exp(c*n);
f0=scf(0); //crea la figura 0
plot2d3('gnn',n,real(x));xgrid;
xlabel('Indice temporal n');ylabel('Amplitud');
title('Parte real');
disp('Teclee ENTER para la parte imaginaria');
pause
f1=scf(1);
scf(f1);
plot2d3('gnn',n,imag(x));xgrid;
xlabel('Indice temporal n');ylabel('Amplitud');
title('Parte imaginaria');
55
//////////////////////////////////////////////////////////////////////////////////////////////////////
Se procede ahora a generar una secuencia exponencial real en SCILAB:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 1.2
// Generación de secuencia exponencial real
// a = 1.2; K = 0.2; N = 30;
// Pruebe también con
// a = 0.9; K = 20; N = 30
a = input('Introduzca exponente = ');
K = input('Introduzca la constante de ganancia = ');
N = input('Introduzca la longitud de la secuencia = ');
n = 0:N;
x = K*a.^n;
f0=scf(0);club;
plot2d3('gnn',n,x); xgrid;
xlabel('Indice temporal n');ylabel('Amplitud');
title('a=1.2');
disp('Teclee ENTER para continuar');
pause
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Un ejemplo simple de un sistema de tiempo discreto es el filtro de promedio móvil de
M puntos, definido por:
56
M −1
1
∑ x[ n−k ]
M k=0
Este sistema se usa a menudo para “suavizar” variaciones aleatorias en los datos.
y[n ]=
Considérese por ejemplo una señal s[n] corrompida por ruido d[n] para n = 0 , resultando
en datos medidos dados por
x[n ]=s [n ]d[n ]
Sería conveniente reducir el efecto del ruido d[n] para obtener un mejor estimado de
s[n] de x[n]. Para este fin, el filtro de promedio móvil da resultados razonablemente
buenos. Para ilustrar este enfoque, se usará SCILAB. Por simplicidad, suponga que la señal
original sin corromper está dada por
s[n ]=2 [n0.9 n ]
El programa para generar s[n] y d[n] es dado a continuación, donde el ruido d[n] se
calcula usando la función rand.
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 1.3
// Otro ejemplo de generación de señales
// Generación de ruido aleatorio
R = 50;
d = rand(R,1) - 0.5;
// Para generar la señal corrompida
m = [0:1:R-1]';
s = 2*m.*(0.9.^m);
f0=scf;clf;
57
subplot(2,1,1);
plot2d3('gnn',m,s);xgrid;
xlabel('Indice temporal n');ylabel('Amplitud');
title('Secuencia original no corrompida');
subplot(2,1,2);
plot2d3('gnn',m,d);xgrid;
xlabel('Indice temporal n');ylabel('Amplitud');
title('Ruido');
disp('Teclee ENTER para continuar');
pause
///////////////////////////////////////////////////////////////////////////////////////////////////////////
El siguiente programa se usa para generar la salida ‘suavizada’ y[n] de la señal
original corrompida con ruido usando el sistema de promedio móvil. Durante su ejecución,
el programa solicita los datos de entrada, que es el número deseado M de muestras de
entrada a ser promediadas. Para enfatizar el efecto del ensuavizamiento del ruido más
claramente, las señales de tiempo discreto se trafican como curvas continuas usando la
función plot.
En SCILAB se generó el programa:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 1.4
// Suavizamiento de una señal por un filtro de promedio móvil
// M = 3;
58
R = 50;
d = rand(R,1) - 0.5;
m = [0:1:R-1]';
s = 2*m.*(0.9.^m);
x = s + d;
f0=scf(0);clf;
plot(m,d,'r-',m,s,'b--',m,x,'g:');xgrid;
xlabel('Indice temporal n');ylabel('Amplitud');
legend('r-','d[n]','b--','s[n]','g:','x[n]');
disp('Teclee ENTER para realizar el suaviza miento');
pause
M = input('Numero de muestras de entrada = ');
b = ones(M,1)/M;
// y = filter(b,1,x); Esta función sirve en la versión 5.1 de SCILAB.
//En el caso de poseer una versión anterior:
//Tome la carpeta cuyo nombre es DSP y cópiela en el siguiente directorio “macros”
//de SCILAB.
//luego ejecute el comando
//getf('SCI/macros/DSP/filter/filter.sci');
//Después de esto puede usar la función “filter”
//Para más información dimite “ help getf ”.
y = filter(b,1,x);
59
f1=scf(1);clf;
scf(1);
plot(m,s,'r-',m,y,'b--');grid;
legend('r-','s[n]','b--','y[n]');
xlabel('Indice temporal n');ylabel('Amplitud');
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3.1.1
Resultados para la primera práctica:
Con la finalidad de obtener una comparación entre SCILAB y MATLAB se tienen los
siguientes resultados:
a) Resultados del programa 1.1.
Al ejecutar el programa original en MATLAB se obtuvieron las figuras 3.1 y 3.2.
Figura 3.1 Parte real de la secuencia exponencial compleja realizada en MATLAB.
60
Figura 3.2 Parte imaginaria de la secuencia exponencial compleja realizada en MATLAB.
Se generaron los siguientes resultados con SCILAB.
Figura 3.3: Parte real de la secuencia exponencial compleja realizada en SCILAB.
61
Figura 3.4 Parte imaginaria de la secuencia exponencial compleja realizada en SCILAB.
b) Resultados del programa 1.2
Luego de ejecutar el código anterior se obtiene el siguiente resultado.
Figura 3.5 Generación de secuencia exponencial real con a = 1.2, K = 0.2 y N = 30 en SCILAB.
Figura 3.6 Generación de secuencia exponencial real con a = 0.9, K = 20 y N = 30 en SCILAB.
62
El resultado de generar esta secuencia en MATLAB para a = 1.2, K = 0.2 y N = 30 es
mostrado en la figura 3.7:
Figura 3.7 Generación de secuencia exponencial real con a = 1.2, K = 0.2 y N = 30 en MATLAB.
Figura 3.8 Generación de secuencia exponencial real con a = 0.9, K = 20 y N = 30 en MATLAB.
c) Resultados del programa 1.3
Tras digitar el código en MATLAB se obtiene la próxima figura.
63
Figura 3.9 Señal original no corrompida y señal de ruido generadas con MATLAB.
Se muestra a continuación el resultado al graficar en SCILAB:
Figura 3.10 Señal original no corrompida y señal de ruido generadas con SCILAB.
64
d) Resultados del programa 1.4
Para este caso se obtienen los resultados mostrados.
Figura 3.11 Señales de entrada y señal sin suavizar en SCILAB
Figura 3.12 Señal original y señal suavizada obtenida con SCILAB.
65
Luego de ejecutar el programa en MATLAB se deben visualizar las siguientes
figuras:
Figura 3.13 Señales de entrada y señal sin suavizar en MATLAB
Figura 3.14 Señal original y señal suavizada obtenida con MATLAB.
66
3.2
Segunda práctica.
En esta segunda practica se muestra la propiedad de convolución entre dos
secuencias, así como el cálculo de la respuesta al impulso, la autocorrelación y una
aplicación de esta.
A continuación se muestra la segunda práctica:
Procesamiento Digital de Señales IE-0102
Práctica #2 con SCILAB.
Convolución
Ejecute el siguiente programa para realizar la convolución de dos secuencias que
usted mismo va a introducir a la computadora. No olvide que, ante cualquier duda acerca de
un mandato de SCILAB, puede escribir help mandato para hacer la debida consulta.
El programa en SCILAB para ilustrar la convolución es el siguiente:
////////////////////////////////////////////////////////////////////////////////////
// Programa 2.1
// Ilustración de la convolución
a = input('Introduzca la primera secuencia = ');
b = input('Introduzca la segunda secuencia = ');
c = convol(a,b);
M = length(c) -1;
n = 0:1:M;
67
disp('Secuencia de salida = ');disp(c)
plot2d3('gnn',n,c);
xlabel('Indice temporal n');ylabel('Amplitud');
////////////////////////////////////////////////////////////////////////////////////
Durante la ejecución, los datos de entrada solicitados son las dos secuencias a
convolucionar que son introducidas en forma vectorial dentro de paréntesis cuadrados
como se muestra:
a = [-2 0
1
-1
3];
b = [1
2
0
-1];
El programa 2.1 calcula la convolución y muestra la secuencia resultante:
Secuencia de salida =
-2
-4
1
3
1
5
1
-3
y la gráfica. Para una comprobación simple, realice la convolución a mano.
Cálculo de la respuesta al impulso
El programa que sigue calcula la respuesta al impulso de un sistema de tiempo
discreto LIT de dimensión finita. Los datos de entrada del programa son la longitud
deseada de la respuesta al impulso y los vectores de los coeficientes del filtro p y d que
deben ser introducidos dentro de paréntesis cuadrados. El programa luego grafica la
secuencia de la respuesta al impulso. Para ilustrar esto, se determina las primeras 41
muestras de la respuesta al impulso del sistema causal LIT definido por la ecuación en
diferencias:
68
y [n]0.7y [n−1]−0.45y [n−2 ]−0.6y [n−3]=0.8x [n]−0.44x [n−1]
0.36x[ n−2]0.02x [n−3]
En SCILAB se presenta el siguiente programa.
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 2.2
// Ilustración del cálculo de la respuesta al impulso
N = input('Longitud deseada de la respuesta al impulso = ');
p = input('Introduzca el vector p = ');
d = input('Introduzca el vector d = ');
x = [1 zeros(1,N-1)];
y = filter(p,d,x);
//En el caso de poseer una versión anterior o no encontrar la función filter
//Tome la carpeta cuyo nombre es DSP y cópiela en el siguiente directorio
“Scilab-5.1/modules/” de SCILAB.
//luego ejecute el comando
//getf('SCI/modules/DSP/filter/filter.sci');
//Despues de esto puede usar la función “filter”
//De no estar la carpeta modules creela y copie la carpeta
//Para más información digite “ help getf ”.
k = 0:1:N-1;
plot2d3('gnn',k,y);
xlabel('Indice temporal n');ylabel('Amplitud');
69
/////////////////////////////////////////////////////////////////////////////////////////////////////////
Los datos de entrada son:
N = 41;
p = [0.8
-0.44
d = [1
0.7
0.36
0.02];
-0.45 -0.6];
La respuesta al impulso generada por el programa es gráficada. La respuesta al
impulso de un sistema de tiempo discreto de dimensión finita también puede graficarse
usando el mandato impz generado para SCILAB. Para determinar la respuesta al escalón se
reemplaza en el programa anterior el enunciado x = [1 zeros(1,N-1)] con el enunciado x =
[ones(1,N)]. Grafique entonces las primeras 41 muestras de la respuesta al escalón.
Correlación
Considérese las dos secuencias de longitud finita
x[n] = [13
-2
1
2
-1
y[n] = [2-1
4
1
-2
3]
4
4
2];
Para el caso de SCILAB tenemos:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 2.3
// Cálculo de la secuencia de correlación cruzada
//x = [1 3
-2
1
2
-1
//y = [2 -1
4
1
-2
3];
4
x = input('Introduzca la secuencia de referencia = ');
4
2];
70
y = input('Introduzca la segunda secuencia =');
// Calcule la secuencia de correlación cruzada
n1 = length(y) -1;n2 = length(x)-1;
r = convol(x,mtlb_fliplr(y));
k = [(-n1):n2]';
plot2d3('gnn',k,r);
xlabel('Indice de atraso');ylabel('Amplitud');
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Cuando se corre el programa, éste solicita los datos de entrada consistentes de los
vectores x e y, que se introducen dentro de paréntesis cuadrados. Se calcula la secuencia de
correlación cruzada usando el mandato convol (SCILAB) con el vector y invertido en el
tiempo para luego gratificarla.
Use el programa anterior para calcular la secuencia de autocorrelación de una
secuencia de longitud finita. Para ello, el vector x se introduce dos veces conforme el
programa solicita los datos de entrada. Para atraso cero (l = 0), rxx[0] es el valor máximo
como debe esperarse.
Como otra experiencia, calcule la correlación cruzada de x[n] y y[n] = x[n-N] para N
= 4, esto con el fin de apreciar cómo se puede usar para encontrar el valor exacto del
retardo N observando el pico de la correlación cruzada.
71
Adicionalmente, modifique el programa para generar una secuencia formada con la
adición de ruido aleatorio a x[n] usando el mandato rand. Encuentre y gráfique la
autocorrelación de la secuencia corrompida con ruido. Debe encontrar que la
autocorrelación exhibe un pico pronunciado en el valor de l = 0 (atraso cero).
Como observación al margen, nótese que la autocorrelación y la correlación cruzada
pueden computarse usando el mandato xcorr. Sin embargo, los resultados obtenidos de esta
forma son la versión invertida en el tiempo de los resultados hallados usando el programa
2.3. Verifique esta aserción.
Aplicación de la autocorrelación
Se va a determinar el periodo de la secuencia sinusoidal x[n] = cos(0.25ðn), 0≤π≤95
corrompida por ruido aleatorio aditivo de amplitud distribuido uniformemente en el ámbito
[-0.5, 0.5].
Debiera verse del gráfico correspondiente no sólo el pico en el atraso cero, sino
también los picos claramente distintos en atrasos que son múltiplos de 8 indicando el
periodo de la secuencia sinusoidal.
Grafique la autocorrelación rdd[n] del componente de ruido. Véase que rdd[n] muestra
un pico fuerte en el atraso cero pero el resto de las amplitudes son considerablemente
72
pequeñas en los otros valores del atraso debido a que las muestras del ruido no están
correlacionadas entre sí.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 2.4
//
//
Cálculo de la autocorrelación de una secuencia sinusoidal corrompida
por ruido
N = 96;
n = 1:N;
x = cos(%pi*0.25*n); // Se genera la secuencia sinusoidal
d = rand(1,N) - 0.5; // Se genera la secuencia de ruido
y = x + d;
// Se genera la secuencia sinusoidal corrompida por ruido
r = convol(y,mtlb_fliplr(y));
// Calcula la autocorrelación
k = -28:28;
plot2d3('gnn',k,r(68:124));
xlabel('Indice de atraso');ylabel('Amplitud');
3.2.1 Resultados de la segunda práctica.
a) Resultados del programas 2.1
Los resultados obtenidos son:
Para las secuencias
a = [-2 0
1
-1
3]
b = [1
2
0
-1]
Secuencia de salida =
73
–2.
- 4.
1.
3.
1.
5.
1. - 3.
Figura 3.15 Ilustración de convolución en SCILAB.
Luego de realizar esta parte de la práctica en MATLAB se obtine:
Figura 3.16 Ilustración de convolución en MATLAB.
b) Resultados del programa 2.2
Al ejecutar el programa se obtiene.
74
Figura 3.17 Ilustración del cálculo de la respuesta al impulso en SCILAB.
Realizando el análisis en MATLAB se obtiene:
Figura 3.18 Ilustración del cálculo de la respuesta al impulso en MATLAB.
c) Resultados del programa 2.3.
Obtenemos con este programa la siguiente figura:
75
Figura 3.19 Cálculo de la secuencia de correlación cruzada en SCILAB.
Los resultados obtenidos con MATLAB:
Figura 3.20 Cálculo de la secuencia de correlación cruzada en MATLAB.
76
d) Resultados del programa 2.4
Se obtiene con SCILAB las siguientes figuras:
Figura 3.21 Cálculo de la autocorrelación de una secuencia senoidal corrompida por ruido usando
SCILAB.
Para determinar la autocorrelación de rdd[n] se ejecuta el siguiente comando en
SCILAB.
rdd= convol(d,mtlb_fliplr(d)); plot2d3('gnn',k,rdd(68:124));
Figura 3.22 Cálculo de la autocorrelación de rdd usando SCILAB.
77
Las gráficas obtenidas de ejecutar en MATLAB:
Figura 3.23 Cálculo de la autocorrelación de una secuencia senoidal corrompida por ruido usando
MATLAB.
Para determinar la autocorrelación de rdd[n] se utiliza el siguiente comando en
MATLAB.
rdd= conv(d,fliplr(d));
Figura 3.24 Cálculo de la autocorrelación de rdd usando MATLAB.
78
3.3
Tercera práctica.
En esta práctica se tratan temas como la transformada discreta de Fourier, la
transformada rápida de Fourier de tiempo discreto y la DFT inversa.
A continuación se muestra la tercera práctica.
Procesamiento Digital de Señales IE-0102
Práctica #3 con SCILAB.
Transformada de Fourier de Tiempo Discreto
El siguiente programa puede emplearse para determinar los valores de la DTFT de
una secuencia real descrita como una función racional de e− j  .
k = 256;
num = [0.008 -0.033 0.05 -0.033 0.008];
den = [1 2.37 2.7 1.6 0.41];
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 3_1
//Cálculo de la transformada de Fourier de tiempo discreto
// Lea la longitud deseada de la DFT
k = input('Numero de puntos de frecuencia = ');
// Lea los coeficientes del numerador y del denominador
num = input('Coeficientes del numerador = ');
den = input('Coeficientes del denominador = ');
79
// Calcule la respuesta en frecuencia
numh=poly(num,"z","coeff");
denh=poly(den,"z","coeff");
h=syslin('d',numh/denh);
[frq,bnds,split]=calfrq(h,0.001,%pi);
rf=repfreq(h,frq);
// Grafique la respuesta en frecuencia
subplot(2,2,1)
plot(frq/180,real(rf));xgrid;
title('Parte real');
xlabel('f/180');ylabel('Amplitud');
subplot(2,2,2)
plot(frq/180,-imag(rf));xgrid;
title('Parte imaginaria');
xlabel('f/180');ylabel('Amplitud');
subplot(2,2,3);
plot(frq/180,abs(rf));xgrid;
title('Espectro de magnitud');
xlabel('f/180');ylabel('Magnitud');
subplot(2,2,4);
plot(frq/180,-atand(imag(rf),real(rf))/(2*%pi));xgrid;
title('Espectro de fase');
80
xlabel('f/180');ylabel('Fase en grados');
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Los datos de entrada solicitados por el programa son el número de puntos de
frecuencia k donde la DTFT va a ser calculada y los vectores num y den que contienen los
coeficientes del numerador y del denominador de la DTFT, respectivamente,
proporcionados en orden ascendente de potencias de
e− j  . Estos vectores deben ser
introducidos dentro de paréntesis cuadrados. El programa calcula los valores de la DTFT en
los puntos de frecuencia prescritos y grafica las partes real e imaginaria, junto con los
espectros de fase y magnitud. Debe notarse que debido a las relaciones de simetría de la
DTFT de una secuencia real, esta es calculada únicamente en k igualmente espaciados
valores de  entre 0 y  .
Como ejemplo, grafique la siguiente DTFT:
−j 
− j2 
− j3
− j4
0.008−0.033 e 0.05e
−0.033e
0.008 e
X e =
−j
− j2 
− j3 
− j4 
12.37 e 2.7 e 1.6e
0.41e
j
Los datos de entrada usados para la DTFT deberían introducirse como se indica a
continuación:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
k = 256;
num = [0.008 -0.033 0.05 -0.033 0.008];
den = [1 2.37 2.7 1.6 0.41];
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
81
Cuando se grafica el espectro de fase, este muestra una discontinuidad de tamaño
2  alrededor del punto =0.72 . Esta discontinuidad puede removerse usando el
mandato unwrap. Presente tanto la fase con la discontinuidad como la fase sin ella en sus
gráficos.
Transformada Discreta de Fourier
Se va a determinar la DFT U[k] de M puntos de la siguiente secuencia de N puntos:
u [ n]=
{
1,
0,
0nN −1
para otros valores de n
}
El programa siguiente solicita los datos de entrada N y M. Para asegurar que la DFT
dé valores correctos, M debe ser mayor que o igual a N. Después que son introducidos tales
valores, calcula la DFT de M puntos y grafica la secuencia original de N puntos, junto con
la magnitud y fase de la secuencia de la DFT. Como ejemplo, use N = 8 y M = 16.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 3.2
// Ilustración del cálculo de la DFT
// N=8; M=16;
// Lea la longitud N de la secuencia y la longitud deseada M de la DFT
N = input('Introduzca la longitud de la secuencia = ');
M = input('Introduzca la longitud de la DFT = ');
// Genere la secuencia temporal de longitud N
u = [ones(1,N)];
// Calcule su DFT de M puntos
82
U = mtlb_fft(u,M);
// Grafique la secuencia temporal y su DFT
t = 0:1:N-1;
plot2d3('gnn',t,u);
title('Secuencia temporal original');
xlabel('Indice temporal n');ylabel('Amplitud');
pause
subplot(2,1,1);
k = 0:1:M-1;
plot2d3('gnn',k,abs(U));
title('Magnitud de las muestras de la DFT');
xlabel('Indice de frecuencia k');ylabel('Magnitud');
subplot(2,1,2);
plot2d3('gnn',k,atan(imag(U),real(U)) );
title('Fase de las muestras de la DFT');
xlabel('Indice de frecuencia k');ylabel('Fase');
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Se ilustra ahora el cálculo de la DFT inversa. La secuencia DFT de K puntos está
dada por:
V [ k ]=
{
k/K ,
0,
}
0k K −1
otros valores de n
83
Póngase K = 8 y N = 13 en el siguiente programa, que determina la secuencia
resultante del cálculo de la DFT inversa v[n].
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 3.3
// Ilustración del cálculo de la DFT inversa
// K=8; N=13;
// Lea la longitud K de la DFT y la longitud deseada N de la DFT inversa
K = input('Introduzca la longitud de la DFT = ');
N = input('Introduzca la longitud de la DFT inversa = ');
// Genere la secuencia DFT de longitud K
// Se trata de una rampa discreta
k = 1:K;
U = (k-1)/K;
// Calcule su DFT inversa de N puntos
u = mtlb_ifft(U,N);
// Grafique la DFT y la DFT inversa
k = 1:K;
plot2d3('gnn',k-1,U);
xlabel('Indice k de frecuencia');ylabel('Amplitud');
title('Muestras originales DFT')
pause
84
subplot(2,1,1)
n = 0:1:N-1;
plot2d3('gnn',n,real(u));
title('Parte real de las muestras temporales');
xlabel('Indice temporal n');ylabel('Amplitud');
subplot(2,1,2)
plot2d3('gnn',n,imag(u));
title('Parte imaginaria de las muestras temporales');
xlabel('Indice temporal n');ylabel('Amplitud');
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
En este último programa debe notarse que, si bien la secuencia de la DFT es real, su
DFT inversa es una secuencia temporal compleja.
Examínese ahora la siguiente secuencia:
x [n ]=cos


2r n
,
N
0nN −1,
0rN −1
Sea r = 3 y N = 16 para la secuencia de longitud finita anterior. Su DFT de 16 puntos
está entonces dada por:
{
8,
para k =3,
X [k ]= 8,
para k =13,
0, otros valores de k
}
85
Se determinará la DTFT de la secuencia x[n] de longitud 16 calculando una DFT de
512 puntos usando el siguiente programa.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 3.4
// Cálculo numérico de la DTFT usando la DFT
// Genere la secuencia sinusoidal de longitud 16
k = 0:15;
x = cos(2*%pi*k*3/16);
// Calcule su DFT de 512 puntos
X = mtlb_fft(x);
XE = mtlb_fft(x,512);
// Grafique la respuesta en frecuencia
L = 0:511;
plot(L/512,abs(XE));
mtlb_hold
plot(k/16,abs(X),'o');
xlabel('Frecuencia angular normalizada');
ylabel('Magnitud');
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
En la última figura resultante, los valores DFT X[k], mostrados por los círculos, son
precisamente las muestras de frecuencia de la DTFT en = k /8, 0k 15 .
86
Convolución lineal de dos secuencias de longitud finita
El programa siguiente determina la convolución lineal de dos secuencias de longitud
finita usando la DFT y compara el resultado obtenido usando una convolución lineal
directa. Las dos secuencias que se usarán como ejemplo son:
x [n ]={ 1 2 0 1 }
h [n]={ 2 2 1 1 }
Las dos secuencias deben introducirse en forma de vector dentro de paréntesis
cuadrados. El programa grafica el resultado de la convolución lineal obtenida usando la
DFT y la diferencia entre este resultado y la secuencia obtenida usando la convolución
directa lineal usando el mandato convol..
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 3.5
// Convolución lineal por medio de la DFT
//x=[1 2 0 1]; h=[2 2 1 1];
// Lea las dos secuencias
x = input('Introduzca la primera secuencia = ');
h = input('Introduzca la segunda secuencia = ');
// Determine la longitud del resultado de la convolución
L = length(x) + length(h) -1;
// Calcule las DFT's usando relleno de ceros
XE = mtlb_fft(x,L);
HE = mtlb_fft(h,L);
// Determine la DFT inversa del producto
87
y1 = mtlb_ifft(XE.*HE);
// Grafique la secuencia generada por la convolución basada en la DFT y el error
// obtenido al comparar este resultado y el resultado de la convolución lineal directa
k = 0:1:L-1;
subplot(2,1,1)
plot2d3('gnn',k,y1,5);
xlabel('Indice temporal n');ylabel('Amplitud');
title('Resultado de la convolución lineal basada en la DFT');
y2 = convol(x,h);
error = y1 - y2;
subplot(2,1,2);
plot2d3('gnn',k,abs(error),3)
xlabel('Indice temporal n');ylabel('Amplitud');
title('Magnitud de la secuencia de error');
//////////////////////////////////////////////////////////////////////////////////////////////////////////
88
3.3.1 Resultados de la tercera práctica.
a) Resultados del programa 3.1
Al ejecutar esta secuencia en MATLAB se obtiene:
Figura 3.25 Calculo de la DFT en MATLAB.
Figura 3.26 Calculo de la DFT en SCILAB.
89
b)
Resultados del programa 3.2
Para el programa 3.2 se obtiene en SCILAB:
Figura 3.27Secuencia temporal original en SCILAB.
Figura 3.28 Magnitud de las muestras de la DFT y fase de las muestras de la DFT en SCILAB.
90
Al ejecutar el programa en MATLAB se logro obtener las siguientes respuestas.
Figura 3.29 Secuencia temporal original en MATLAB.
Figura 3.30 Magnitud de las muestras de la DFT y fase de las muestras de la DFT en MATLAB.
91
c)
Resultados del programa 3.3
Los resultados obtenidos al ejecutar el programa en SCILAB son:
Figura 3.31 Muestras originales DFT en SCILAB.
Figura 3.32 Parte real de las muestras temporales y parte real de las muestras temporales en SCILAB.
92
Para el caso de MATLAB se obtuvo.
Figura 3.33 Muestras originales DFT en MATLAB.
Figura 3.34 Parte real de las muestras temporales y parte real de las muestras temporales en
MATLAB.
93
d)
Resultados del programa 3.4
Para SCILAB se obtiene el siguiente resultado.
Figura 3.35 Grafica de la respuesta en frecuencia en SCILAB.
Figura 3.36 Grafica de la respuesta en frecuencia en MATLAB
94
e)
Resultados del programa 3.5
Para este programa se obtiene los siguientes resultados simulados:
Figura 3.37 Convolución lineal por medio de la DFT en SCILAB.
Figura 3.38 Convolución lineal por medio de la DFT en MATLAB.
95
Al comparar la magnitud de la secuencia de error, se nota una diferencia, esta se debe
a que los valores corresponden a datos en el orden de 10 -15 por lo que son valores
sumamente pequeños y tanto MATLAB como SCILAB aproximan estos usando algoritmos
distintos. Lo anterior origina la diferencia entre ambas secuencias.
3.4
Cuarta práctica.
Para esta práctica se trata el tema de la transformada z, el calculo de la expansión de
fracciones parciales y transformada z inversa.
A continuación se muestra la cuarta práctica.
Procesamiento Digital de Señales IE-0102
Práctica #4 con SCILAB.
Transformada Z
Se solicita expresar la siguiente transformada Z en forma factorizada, graficar sus
polos y ceros y determinar sus regiones de convergencia:
4
G z =
3
2
2z 16z 44z 56z32
4
3
2
3z 3z −15z 18z−12
Para llevar a cabo la factorización, se puede usar el siguiente programa en SCILAB:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Programa 4.1;
Determinación de la forma factorizada de una transformada Z racional
num=[32 56 44 16 2]; den=[-12 18 -15 3 3];
//Para SCILAB 5.1 digite:
getf('SCI/modules/DSP/tfchk.sci');
getf('SCI/modules/DSP/tf2zp.sci');
96
[z,p,k] = mtlb_tf2zp(num,den);
m = abs(p);
disp('Los ceros están en');disp(z)
disp('Los polos están en');disp(p);
disp('Constante de ganancia');disp(k);
disp('Radios de los polos');disp(m);
//Para SCILAB 5.1 digite:
getf('SCI/modules/DSP/zp2tf.sci');
getf('SCI/modules/DSP/cplxpair.sci');
getf('SCI/modules/DSP/zp2sos.sci');
sos = mtlb_zp2sos(z,p,k);
disp('Secciones de segundo order');disp(real(sos));
h=poly(num,'z','c')/poly(den,'z','c');
plzr(h);
/////////////////////////////////////////////////////////////////////////////////////////////////////
Este último resultado se interpreta como que la forma factorizada de la transformada
Z está dada por:
−1
G z =
−2
−1
−2
0.06670.4z 0.5333z 10.020.0z 20.0z 
−1
−2
−1
−2
1.02.0z −4.0z 1.0−1.0z 1.0z 
16z −18z−2 12z−12z −2 
=0.667
−1
−2
−1
−2
12z −4z 1−z  z 
Las cuatro regiones de convergencia son dadas por:
97
ℜ1 ∞≥∣z∣3.2361
ℜ2 3.2361∣z∣1.2361
ℜ3 1.2361∣z∣1
ℜ4 1∣z∣≥0
Ahora, se va a considerar la determinación de la transformada Z racional desde las
posiciones de sus ceros y polos. Los ceros son: 0.21, 3.14, -0.3 + 0.5j, -0.3 – 0.5j; los polos
están en: -0.45, 0.67, 0.81 + 0.72j, 0.81 – 0.72j; la constante de ganancia k es 2.2. El
programa SCILAB que se emplea para calcular la transformada Z racional es como sigue:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Programa 4.2
//Determinación de la transformada Z racional desde sus polos y ceros
//format long
zr = input('Introduzca los ceros como vector fila = ');
pr = input('Introduzca los polos como vector fila = ');
// Se transpone los vectores fila de ceros y polos
//
pr=[-0.45 0.67 0.81+0.72*%i 0.81-0.72*%i];
// zr=[0.21 3.14 -0.3+0.5*%i -0.3-0.5*%i];
z = zr'; p = pr';
k = input('Introduzca la constancia de ganancia = ');
//Para SCILAB 5.1 digite:
getf('SCI/modules/DSP/zp2tf.sci');
[num,den] = mtlb_zp2tf(z,p,k);
disp('Coeficientes del polinomio del numerador');disp(num);
98
disp('Coeficientes del polinomio del denominador');disp(den);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Los resultados deben coincidir con
4
G z =
3
2
2.2z −6.05z −2.22332z −1.63592z−0.4932312
4
3
2
z −1.84z 1.2294z 0.23004z−0.35411175
Expansión en fracciones parciales usando SCILAB
Usando SCILAB se puede determinar la expansión en fracciones parciales de una
transformada Z dada. Así por ejemplo, considérese la transformada
3
G z =
18z
3
2
18z 3z −4z−1
El siguiente programa consigue lo esperado:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Programa 4.3
// De una transformada Z racional a la expansión en fracciones parciales
//
num = input('Introduzca los coeficientes del numerador = ');
den = input('Introduzca los coeficientes del denominador = ');
// num = [18 0 0 0]; den = [18 3 -4 -1];
getf('SCI/modules/DSP/residuez/polyval/polyval.sci');
getf('SCI/modules/DSP/residuez/deconv/deconv.sci');
99
getf('SCI/modules/DSP/residuez/polysci/polysci.sci');
getf('SCI/modules/DSP/residuez/mpoles/mpoles2.ssci');
getf('SCI/modules/DSP/residuez/meansci/meansci.sci');
getf('SCI/modules/DSP/residuez/residuez.sci');
[r,p,k] = residuez(num,den);
disp('Residuos'); disp(r')
disp('Polos');disp(p')
disp('Constantes');disp(k)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Hay que recordar que los coeficientes deben introducirse usando paréntesis
cuadrados, como se indica a continuación:
num = [18 0 0 0];
den = [18 3 -4 -1];
Los datos de salida son los residuos, las constantes (si las hay) y los polos de la
expansión de G(z). Para nuestro ejemplo,
Residuos: 0.36, 0.24, 0.4
Polos: 0.5, -0.3333, -0.3333
Constantes: ninguna en este caso
Nótese que la transformada Z de nuestro ejemplo tiene un polo doble en z = -1/3 =
-0.3333. Los resultados son interpretados de la siguiente manera:
G z =
0.36
0.24
0.4


−1
−1
1−0.5z
10.3333z
10.3333z−1 2
100
Si se desea hacer el procedimiento inverso, en donde se comenzara con una
descripción de G(z) como la dada arriba, entonces se podría usar el siguiente programa en
SCILAB:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Programa 4.4
//De la expansión en fracciones parciales a la transformada Z racional
r = input('Introduzca los residuos = ');
p = input('Introduzca los polos = ');
k = input('Introduzca las constantes = ');
// r= [0.4 0.24 0.36];p = [-0.3333 -0.3333 0.5];k = [0];
getf('SCI/modules/DSP/residuez/mpoles/mpoles.sci');
getf('SCI/modules/DSP/residuez/polysci/polysci.sci');
getf('SCI/modules/DSP/residuezinv/residuezinv2.sci');
[num,den] = residuezinv2(r,p,k)
disp('Coeficientes del polinomio del numerador');disp(num)
disp('Coeficientes del polinomio del denominador');disp(den)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Los datos que se solicitan en el programa anterior deben introducirse usando
paréntesis cuadrados:
r = [0.4 0.24 0.36]
101
p = [-0.3333 -0.3333 0.5]
k = [0]
Véase que es importante el orden en que se introducen los valores, pues deben
corresponder a la representación que se se hace de los polos dobles y simples. El programa
da como salida los coeficientes del numerador y del denominador, en potencias
descendientes de z. Los coeficientes son exactamente los mismos si se multiplica cada
coeficiente por 18.
Coeficientes del polinomio del numerador
1.0000
0.0533 -0.0267
0
Coeficientes del polinomio del denominador
1.0000
0.1666 -0.2222 -0.0555
Transformada inversa Z
La inversa de la transformada Z racional puede también calcularse usando MATLAB.
El mandato impz puede utilizarse para este propósito.
[h,t] = impz(num,den.L)
Los datos de entrada consisten de los vectores num y den que contienen los
coeficientes de los polinomios del numerador y del denominador dados en potencias
descendientes de z. La salida es el vector de la respuesta al impulso h y el vector t que hace
de índice temporal. En el primer mandato, la longitud L de h es determinada
102
automáticamente por el computador con t = 0:L-1, en tanto que en los dos mandatos
restantes el usuario la proporciona. En el último mandato, el intervalo de tiempo es
escalado de modo que el intervalo de muestreo es igual al recíproco de la función de
transferencia. El valor supuesto de la función de transferencia es 1.
Otra manera de llegar al resultado es mediante el uso del mandato filter:
y = filter(num,den,x)
donde y es el vector de salida que contiene los coeficientes de la representación en
series de potencias de H(z) expresado en potencias negativas ascendientes de z. Los
coeficientes del numerador y denominador de H(z) expresados en potencias ascendientes
negativas de z son dos de los vectores de datos de entrada num y den. La longitud de x es la
misma que la de y, y todos sus elementos son cero excepto por el primero que es igual a 1.
Se presenta dos programas a continuación para ilustrar el uso de los mandatos
anteriores.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Programa 4.5
// Expansión en series de potencias de una transformada Z racional
//
// Introduzca el número de coeficientes de transformada Z inversa a ser calculados
L = input('Introduzca la longitud del vector de salida = ');
// Lea los coeficientes del numerador y del denominador de la transformada Z
num = input('Introduzca los coeficientes del numerador = ');
den = input('Introduzca los coeficientes del denominador = ');
103
// Calcule el número deseado de coeficientes de la transformada inversa
//Solución 1
x = [1 zeros(1,L-1)];
y = filter(num,den,x);
disp('Coeficientes de la expansion en series de potencias');
disp(y)
//Solución 2
k = 0:1:L-1;
t=k';
getf('SCI/modules/DSP/impz/impz.sci');
[y,t]=impz(num,den,L)
disp('Coeficientes de la expansion en series de potencias');
disp(y)
///////////////////////////////////////////////////////////////////////////////////////////////////////
Los datos de entrada llamados por el programa son el número deseado de coeficientes
y los vectores de los coeficientes del numerador y del denominador de la transformada Z
racional, con estos últimos introducidos dentro de paréntesis cuadrados. Para nuestro
ejemplo,
L = 11;
num = [1
2];
den = [1 0.4
-0.12];
104
Los datos de salida son los coeficientes deseados de la transformada Z inversa que
deben aparecer como:
1.0000 1.6000 -0.5200 0.4000 -0.2224 0.1370 -0.0815 0.0490 -0.0294 0.0176 0.0106
Este resultado se puede chequear usando división sintética.
A continuación se ofrece un programa para determinar la transformada Z inversa pero
usando el mandato filter:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Programa 4.6
// Expansión en series de potencias de una transformada Z racional
//
// Introduzca el número de coefficientes de la transformada Z inversa a calcularse
N = input('Introduzca la longitud del vector de salida = '); // N=5;
// Introduzca los coeficientes del numerador y del denominador de la transformada Z
num = input('Introduzca los coeficientes del numerador = '); // num = [1
2];
den = input('Introduzca los coeficientes del denominador = ');// den = [10.4 -0.12];
// Calcule el número deseado de coeficientes de la transformada inversa
x = [1
zeros(1,N-1)];
y = filter(num,den,x);
disp('Coeficientes de la expansión en series de potencias');
disp(y)
105
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
El programa anterior pregunta por la longitud deseada del vector de salida y (ponga N
= 5) y se le introduce también los vectores que contienen los coeficientes del numerador y
del denominador dentro de paréntesis cuadrados y en potencias descendientes positivas de
z. Después de calcular el vector de salida, muestra sus elementos que son los coeficientes
de la expansión en series de potencias de la transformada Z racional. El programa supone
que la transformada Z es una fracción propia con el polinomio del denominador con un
orden mayor que el del numerador.
Usando los valores para num y den del ejemplo inmediato anterior, la salida es la
siguiente: 0.0962
3.4,1
a)
0.1934
0.0022
0.0000
0.0000
Resultados de la cuarta práctica
Resultados del programa 4.1
Los resultados al ejecutar esta parte de la práctica en MATLAB son:
Resultados:
Los ceros estan en:
-4.0000-2.0000
-1.0000 + 1.0000i -1.0000 - 1.0000i
Los polos estan en:
-3.2361
1.2361
Constante de ganancia
0.6667
Radios de los polos
0.5000 + 0.8660i
0.5000 - 0.8660i
106
3.2361
1.2361
1.0000 1.0000
Figura 3.38 Polos y ceros en el plano Z obtenidos en MATLAB.
Al ejecutar en SCILAB se obtiene:
Los ceros estan en
- 4.
- 2.
- 1. + i
- 1. - i
Los polos estan en
- 3.236068
1.236068
0.5 + 0.8660254i
0.5 - 0.8660254i
Constante de ganancia
0.6666667
Radios de los polos
3.236068
1.236068
1.
1.
107
Figura 3.39 Polos y ceros en el plano Z obtenidos en SCILAB.
b)
Resultados del programa 4.2
Resultados obtenidos en MATLAB y SCILAB son:
Resultados:
Coeficientes del polinomio del numerador
2.2000 -6.0500 -2.2233 -1.6354
0.4932
Coeficientes del polinomio del denominador
1.0000 -1.8400
c)
1.2294
0.2300 -0.3541
Resultados del programa 4.3
Resultados obtenidos con Matllab.
Residuos
0.3600
0.2400
0.4000
Polos
0.5000 -0.3333 -0.3333
108
Constantes
0
Resultados elaborados con MATLAB.
d)
Resultados del programa 4.4
Coeficientes del polinomio del numerador
1.0000
0.0533 -0.0267
0
Coeficientes del polinomio del denominador
1.0000
0.1666 -0.2222 -0.0555
e)
Resultados del programa 4.5
y= 1. 1.6 - 0.52
0.0176374 - 0.0105813
f)
0.4 - 0.2224
0.13696 - 0.081472
Resultados del programa 4.6
Tanto con SCILAB como con MATLAB el resultado es:
0.0962
0.1934
0.0022
0.0000
0.0000
0.049024 - 0.0293862
109
3.5
En
Quinta práctica
esta práctica se trata el tema de muestreo y conversión digital analógica, el traslape
y la interpolación y decimación.
A continuación se muestra la quinta práctica.
Procesamiento Digital de Señales IE-0102
Práctica #5 con SCILAB.
Parte A: Muestreo y Conversión Digital/Analógica
Se simulará el muestreo de señales de tiempo continuo o analógicas para producir
señales de tiempo discreto. Puesto que SCILAB sólo puede procesar señales de tiempo
discreto (vectores), no se puede utilizar realmente señales analógicas sin el uso de
dispositivos externos de conversión analógico/digitales (A/D). En su lugar, por
consiguiente, se simulará el muestreo analógico mediante el muestreo de las secuencias de
tiempo discreto correspondientes, que se conoce como decimación de las secuencias.
Recíprocamente, se simulará la conversión digital-analógica (D/A)
mediante la
interpolación de secuencias de tiempo discreto. La interpolación y la decimación son
operaciones bastante útiles, aparte de su uso en la simulación de las conversiones A/D y
D/A.
Para generar un tren de impulsos de tiempo discreto para su empleo en muestreo, se
obtiene la respuesta al impulso del filtro peine H(z) = 1/(1 - z-4), como sigue:
a = [1 0 0 0 -1];
110
d = [1 zeros(1,127)];
train = filter(1,a,d);
n = 0:127;
//Grafíquese el vector train contra el vector n.
plot(n,train);
Genérese también una señal coseno con 32 muestras por ciclo mediante
x = cos(2*%pi*n/32);
El espectro correspondiente sobre el intervalo de Nyquist normalizado (-1,1) se
obtiene entonces como.
s=1; nfft =128;b=x;a=1;
nb = length(b);
na = length(a);
a = [a zeros(1,nb-na)];
b = [b zeros(1,na-nb)];
n = length(a);
h = (mtlb_fft(b,s*nfft)./mtlb_fft(a,s*nfft)).';
h = h(1:nfft);
h = h(:);
hh = h;
deltaF = (2*%pi)/nfft;
w = linspace(0,2*%pi-deltaF,nfft);
w = w(:);
111
wp = mtlb_fftshift(w)/%pi -1;
plot(wp,hh);
Otra alternativa es usar la función generada para esta aplicación:
n = 0:127;
x = cos(2*%pi*n/32);
getf('SCI/modules/DSP/freqz/freqz.sci');
[hh,w]=freqz(x,1,128,1);
wp = mtlb_fftshift(w)/%pi -1;
plot(wp,real(abs(hh)));
Por comparación, también ejecútese el comando plot(w,hh).
Nótese que los impulsos tienen forma triangular en estos gráficos. (El espectro es real
porque una señal coseno es par). Simúlese muestrear la señal coseno con ocho muestras por
ciclo multiplicándola (elemento por elemento) por el tren de impulsos, es decir,
n = 0:127;
a = [1 0 0 0 -1];
d = [1 zeros(1,127)];
train = filter(1,a,d);
x = cos(2*%pi*n/32);
y = x.*train;
M=8;
112
yy=intdec(y,M/32);
nn=[0:length(yy)-1];
plot2d3('gnn',nn,yy-3);
Para que pueda compara grafique
plot(n,y);
Grafíquese la señal muestreada yy y su espectro asociado como se hizo anteriormente
para la señal “hh”. Nótese las imágenes espectrales alrededor de cada múltiplo de la nueva
razón de muestreo (normalizada, wp = 0.5). Dado que la señal coseno es perfectamente de
banda limitada y se satisface el teorema del muestreo, no se ha producido ningún
“aliasing”.
Para estudiar las propiedades espectrales de un convertidor D/A, simúlese su
respuesta al impulso efectiva y su respuesta de magnitud mediante:
h = ones(1,4);
H = mtlb_fft(h,128);
plot(mtlb_fftshift(wp),mtlb_fftshift(abs(H)));mtlb_hold;
Aplicando este filtro D/A a la señal muestreada “y”, se obtiene en el dominio del
tiempo
yd = filter(h,1,y);
plot(n,yd);plot(n,x)
y en el dominio de la frecuencia
Yd = mtlb_fft(yd);
plot(wp,abs(Yd));mtlb_hold;
113
Explíquese los componentes espectrales residuales alrededor de las frecuencias ±0.5 y
±1.
Para aplicar un postfiltro ideal con una frecuencia de corte de un octavo la frecuencia
de muestreo a la salida del convertidor D/A, ejecútese los siguientes mandatos:
Yc = Yd;Yc(17:112) = zeros([0:95]);
plot(wp,abs(Yc));xgrid;
yc = mtlb_ifft(Yc);
plot(n,yc,n,x);mtlb_hold;
Nótese el ligero desplazamiento de fase y la atenuación en la amplitud en la salida del
postfiltro “yc” contra la señal original “x” causada por el convertidor D/A.
Parte B: Traslape (“Aliasing”)
Para un primer ejemplo de una señal no bandalimitada y el “aliasing” resultante
después del muestreo, se utilizará una señal de onda cuadrada. Para sintetizar ocho ciclos de
una onda cuadrada de tiempo discreto y para simular su espectro de magnitud DTFT, se
hace:
n = 0:127;
x = cos(2*%pi*n*8/128 + 0.01);
y = sign(x);
El pequeño desplazamiento de fase (0.01) asegura un signo correcto.
plot2d3('gnn',n,y);
b=y;a=1;s=2; nfft =64;
nb = length(b);
114
na = length(a);
a = [a zeros(1,nb-na)];
b = [b zeros(1,na-nb)];
n = length(a);
h = (mtlb_fft(b,s*nfft)./mtlb_fft(a,s*nfft)).';
h = h(1:nfft);
h = h(:);
hh = h;
deltaF = %pi/nfft;
w = linspace(0,%pi-deltaF,nfft);
w = w(:);
mag = abs(hh);
plot(w,mag);
Nótese que la onda cuadrada tiene sólo armónicas impares, que decaen de la forma 1/
k (pero no tan exactamente, pues las armónicas superiores para k = 9, 11, 13, … caen
encima de las correspondientes para k = 1, 3, 5, 7). Para producir casos donde el “aliasing”
de las armónicas superiores no se disfrace de esta manera, sintetice una onda cuadrada con
12 ciclos sobre 128 muestras, y otra con 11 ciclos, y grafíquese sus espectros de magnitud
como anteriormente se hizo.
Genérese ahora una secuencia exponencial causal y su espectro de magnitud mediante
n=0:127;
115
x = exp(-n/5);
b=x;a=1;s=2; nfft =64;
nb = length(b);
na = length(a);
a = [a zeros(1,nb-na)];
b = [b zeros(1,na-nb)];
n = length(a);
h = (mtlb_fft(b,s*nfft)./mtlb_fft(a,s*nfft)).';
h = h(1:nfft);
h = h(:);
hh = h;
deltaF = %pi/nfft;
w = linspace(0,%pi-deltaF,nfft);
w = w(:);
magX = abs(hh);
plot(w,magX);
Muestrée el exponencial a un cuarto de la razón de muestreo original usando el tren
de impulsos train de la parte A, es decir,
a = [1 0 0 0 -1];
d = [1 zeros(1,127)];
train = filter(1,a,d);
y = x.*train;
116
Para computar el espectro correspondiente y para compararlo con el del exponencial
original (después de un escalamiento adecuado), se ejecuta los mandatos,
b=x;a=1;s=2; nfft =64;
nb = length(b);
na = length(a);
a = [a zeros(1,nb-na)];
b = [b zeros(1,na-nb)];
n = length(a);
h = (mtlb_fft(b,s*nfft)./mtlb_fft(a,s*nfft)).';
h = h(1:nfft);
h = h(:);
hh = h;
deltaF = %pi/nfft;
w = linspace(0,%pi-deltaF,nfft);
w = w(:);
magX = abs(hh);
by=y;ay=1;sy=2; nffty =64;
nby = length(by);
nay = length(ay);
ay = [ay zeros(1,nby-nay)];
by = [by zeros(1,nay-nby)];
ny = length(ay);
117
yy = (mtlb_fft(by,sy*nffty)./mtlb_fft(ay,sy*nffty)).';
yy = yy(1:nffty);
yy = yy(:);
Y = yy;
deltaF = %pi/nfft;
w = linspace(0,%pi-deltaF,nfft);
w = w(:);
magY = abs(Y);
magY = magY*magX(1)/magY(1);
plot(w,magX,w,magY);
Nótese el efecto del “aliasing”. Simúlese ahora el efecto de la conversión D/A como
en la parte A, y compárese el espectro de salida asociado con los espectros precedentes para
x e y.
Parte C: Interpolación y decimación
Se puede interpolar o decimar secuencias usando los mandatos interp y decimate
(individualmente o en combinación para cambiar la razón de muestreo por un factor
racional L/K), o el único comando resample. Por ejemplo, considérese la siguiente
interpolación de un senoide por L=4:
x = linspace(0,39,10)';
y = cos(2*%pi*x/5);
dk = splin(x,y);
xx = linspace(0,39,40)';
118
[yyk, yy1k, yy2k] = interp(xx, x, y, dk);
plot2d(xx, [yyk])
plot2d(x, y, -9)
Compare los valores interpolados yyk con los valores ideales xi. ¿Dónde ocurre la
mayor desviación? Un despliegue en el dominio de la frecuencia del error de interpolación
es proporcionado por
Y = mtlb_fft(yyk);
plot2d(m,abs(Y),2);mtlb_hold;
¿Cómo deberían de ser estos valores de la FFT? (Recuérdese que la FFT es un
algoritmo rápido para calcular la transformada de Fourier). Repita el experimento anterior
para
y = sin(2*%pi*x/5);
y también para las secuencias impulso
y = zeros(1,10);y(5) = 1;
y = zeros(1,10);y(10) = 1;
Nótese las respuestas al impulso y de frecuencia (variantes con el tiempo) del filtro
interpolador.
Ahora inviértase el experimento para chequear la decimación, o sea,
m = 0:39; n = 0:9;
xi = cos(2*%pi*m/20);
xii = cos(2*%pi*m/20-5.43);
//el 5,43 es debido a un desfase originado por la función intdec de scilab.
119
yy=intdec(xii,1/4);
plot2d(4*n+3,yy,-3);plot(m,xi);
Nótese que con los desplazamientos de tiempo apropiados, como el dado, la
decimación ejecutada sobre este senoide es casi perfecta. Empero, repítase el experimento
para otras frecuencias tales como
xi = cos(4*%pi*m/20);
xi = cos(2.5*%pi*m/20);
3.5.1 Resultados de la quinta práctica.
a)
Resultados de la parte A.
Al ejecutar esta parte de la sexta práctica en MATLAB se obtine:
Figura 3.40 Tren de pulsos en MATLAB y SCILAB.
120
Figura 3.41 Espectro correspondiente sobre el intervalo de Nyquist normalizado (-1,1) en
MATLAB y SCILAB.
Figura 3.42 Señal coseno con ocho muestras por ciclo multiplicándola (elemento por elemento) por el
tren de impulsos.
121
Figura 3.43 Respuesta al impulso efectiva y su respuesta de magnitud en MATLAB y SCILAB.
Figura 3.44 Señal en el dominio del tiempo obtenida con MATLAB y SCILAB.
122
Figura 3.45 Señal en el dominio de la frecuencia obtenida con MATLAB y SCILAB.
Figura 3.46 Señales para
aplicar un postfiltro en MATLAB y SCILAB.
123
Figura 3.47 Respuesta en el tiempo al aplicar FFT en
b)
MATLAB y SCILAB.
Resultados de la parte B
Ejecutando en MATLAB obtenemos:
Figura 3.48 Primer ejemplo de aliasing en MATLAB y SCILAB.
124
Figura 3.49 Respuesta de FFT MATLAB y SCILAB.
Figura 3.50 Secuencia exponencial causal en MATLAB y SCILAB.
125
Figura 3.51 Espectro de frecuencia y señal original en MATLAB y SCILAB.
c)
Resultados de la parte C
Figura 3.52 Interpolación de un senoide por L = 4
126
Figura 3.53 Despliegue
en el dominio de la frecuencia del error en MATLAB y
SCILAB.
Figura 3.54 Chequeo de decimación en MATLAB y SCILAB.
127
3.6
Sexta práctica
A continuación se presenta la sexta práctica.
Procesamiento Digital de Señales IE-0102
Práctica #6 con SCILAB.
Técnica de relleno con ceros y de enventanado.
Parte A: Técnica de rellenado con ceros.
El relleno con ceros es la operación de extender una secuencia de longitud N 1 a una
de longitud N2 > N1 mediante el agregado de (N2 - N1) muestras cero a la secuencia inicial.
Esto se hace por dos razones: (1) para convertir la convolución circular en convolución
lineal (en el dominio del tiempo) o, (2) para interpolar entre las N 1 muestras de la DFT (en
el dominio de la frecuencia). Para demostrar el primero de estos efectos, sintetice un pulso
coseno de longitud 40 mediante los mandatos
n = [0:39];
x = cos(2*%pi*4*n/40);
Calcule ahora su DFT usando el algoritmo de la FFT escribiendo
X = mtlb_fft(x,64);
Al especificar una FFT de 64 puntos se hace que el pulso de 40 muestras sea
rellenado con ceros hasta una longitud de 64 puntos antes de calcular la DFT.
Convoluciónese el pulso consigo mismo elevando al cuadrado cada elemento de su DFT
para luego sacar la transformada inversa de la siguiente manera:
Y = X.^2;
128
y =mtlb_ifft(Y);
n = [0:63];
f0=scf(0);clf;
plot(n,real(y),-3);mtlb_hold;
mtlb_axis([min(n) max(n) min(real(y)) max(real(y))]);
xlabel('Indice n');
ylabel('Funcion resultante');
title('Efectos de la convolucion circular');
El mandato real(y) se utiliza para tomar la parte real de la secuencia y, pues en
general, tal secuencia es compleja. En este caso, la parte compleja es infinitesimal, por lo
que puede despreciarse sin problema. El mandato mtlb_axis se utiliza para encuadrar bien
la curva dentro del marco de la figura. Nótese que la porción inicial de la señal resultante
está distorsionada por los efectos de traslape y de enrollamiento de la convolución circular.
Para evitar esto, se debe incrementar el relleno con ceros hasta por lo menos completar 80
muestras, después de lo cual podemos calcular, elevar al cuadrado y sacar la transformada
inversa de la DFT para realizar la convolución lineal. Hágase esto de la siguiente forma:
X1 = mtlb_fft(x,80);
Y1 = X1.^2;
y1 = mtlb_ifft(Y1);
n1 = [0:79];
f1=scf(1);clf;
scf(f1);
129
plot2d(n,real(y),1)
plot2d(n1,real(y1),2);mtlb_hold;
xlabel('Indice n');
ylabel('Convolucion circular y relleno con ceros');
title('Efectos del relleno con ceros');
Un resultado equivalente puede obtenerse usando el mandato y = convol(x,x) pero
la convolución rápida usando el mandato FFT reduce sustancialmente el tiempo de cálculo
requerido.
Para demostrar el efecto espectral del relleno con ceros, sintetice tres ciclos de una
señal coseno con base en 32 muestras, con y sin relleno con ceros a una longitud de T
puntos:
T = 256;
// T: tamaño del vector rellenado con ceros
n = [0:31];
x = cos(2*%pi*3*n/(max(n)+1));
x1 = [x zeros(1,T-(max(n)+1))];
n1 = [0:(T-1)];
Calcule y grafique las correspondientes magnitudes de la DFT con y sin relleno con
ceros ejecutando los mandatos:
mag = abs(mtlb_fft(x));
mag1 = abs(mtlb_fft(x1));
130
n2 = (T/(max(n)+1))*n;
f2=scf(2);clf;
scf(f2);
plot2d(n1,mag1,3); plot2d(n2,mag,5);mtlb_hold;
alto = max([max(mag1) max(mag)]);
bajo = min([min(mag1) min(mag)]);
mtlb_axis([min(n1) max(n1) bajo alto]);
Repita el procedimiento seguido para la señal coseno inmediata anterior para la señal
y = cos(2*%pi*3.25*n/(max(n)+1));
y note la diferencia entre las DFTs de 32 puntos de la señal coseno original y esta
última. Haga comentarios en el sentido de justificar cualquier discrepancia.
y1 = [y zeros(1,T-(max(n)+1))];
magy = abs(mtlb_fft(y));
magy1 = abs(mtlb_fft(y1));
f3=scf(3);clf;
scf(3);
plot2d(n1,magy1,6);plot2d(n2,magy,-3);mtlb_hold;
alto = max([max(magy1) max(magy)]);
bajo = min([min(magy1) min(magy)]);
mtlb_axis([min(n1) max(n1) bajo alto]);
131
Parte B: Técnica de enventanado
La ventana rectangular implícita en la transformada discreta de Fourier tiene lóbulos
secundarios que están a lo menos 13 decibelios por debajo del lóbulo principal y que
decaen con una pendiente de 6 dB/octava. La ventana von Hann (Hanning), por otro lado,
tiene lóbulos secundarios por debajo de 31 decibelios del lóbulo principal y una pendiente
de caída de 18 dB/octava, mientras que la ventana Blackman tiene lóbulos secundarios por
debajo de 57 decibelios, con una pendiente de caída similar a la ventana von Hann, de
donde las señales pequeñas son más fáciles de detectar en la presencia de señales grandes
usando las ventanas Blackman o von Hann que con la ventana rectangular. Esto se consigue
al precio de una pérdida de resolución espectral para señales muy cercanas entre sí al
emplearse ventanas distintas de la rectangular. Recuérdese que la resolución tiene que ver
con el ancho del lóbulo principal de una ventana: al emplearse una ventana con un lóbulo
principal angosto, se obtiene una mayor resolución; de lo contrario, disminuye la
resolución.
Por ejemplo, genérese una señal con dos senoides,
N = 127;
n = [0:N];
x = sin(2*%pi*4.5*n/(N+1)) + cos(2*%pi*6.5*n/(N+1));
f1=scf(1);clf;
scf(1);
plot(n,x);mtlb_hold;
mtlb_axis([min(n) max(n) min(x) max(x)]);
132
xlabel('Indice n');
ylabel('Funcion');
title('Dos senoides juntos');
Aplíquese las ventanas von Hann y Blackman a la secuencia (realizando una
multiplicación elemento por elemento) mediante los mandatos siguientes y grafíquese los
resultados:
w=window('hn',N+1)
w1=w';
xh = x.*w1';
w2=window('kr',N+1,8.6);
w3=w2';
xb = x.*w2;
f2=scf(2);clf;
plot2d(n,xh,);
plot2d(n,xb,3);
mtlb_axis([min(n) max(n) min(xh) max(xh)]);
xlabel('Indice n (Magenta: von Hann, azul: Blackman)');
ylabel('Funcion enventanada');
title('Efecto de ventanas von Hann y Blackman');
133
Las ventanas se utilizan con la intención de eliminar el efecto de la longitud finita de
las secuencias sobre el espectro. Tal efecto se manifiesta con la dispersión espectral
(leakage en inglés).
Calcúlese y grafíquese ahora el espectro de magnitud correspondiente en decibelios
para la ventana von Hann y para la Blackman usando los mandatos:
Xh = mtlb_fft(xh);
dbh = 20*log10(abs(Xh));
dbh = dbh - max(dbh);
f3=scf(3);clf;
scf(3);
plot2d(n,dbh,3);mtlb_hold;
mtlb_axis([min(n) max(n) min(dbh) max(dbh)]);
xlabel('Indice n');
ylabel('Espectro');
title('Espectro con ventana von Hann');
Xb = mtlb_fft(xb);
dbb = 20*log10(abs(Xb));
dbb = dbb - max(dbb);
f4=scf(4);clf;
scf(4);
plot2d(n,dbb,2);mtlb_hold;
134
mtlb_axis([min(n) max(n) min(dbb) max(dbb)]);
xlabel('Indice n');
ylabel('Espectro');
title('Espectro con ventana Blackman');
En ambos espectros debiera aparecer los dos componentes senoidales. Si no son
distinguibles, explique la razón. Procédase ahora a rellenar las secuencias xh y xb con
ceros, recalcúlese ambos espectros y verifíquese si se distinguen los dos componentes
senoidales.
L = 4*(N+1);
// L: hasta donde se completa con ceros
xh = [xh zeros(1,L-(N+1))];
xb = [xb zeros(1,L-(N+1))];
n = [0:4*(N+1)-1];
Xh = mtlb_fft(xh);
dbh = 20*log10(abs(Xh));
dbh = dbh - max(dbh);
f5=scf(5);clf;
scf(5);
plot2d(n,dbh,3);mtlb_hold;
mtlb_axis([min(n) max(n) min(dbh) max(dbh)]);
xlabel('Indice n');
ylabel('Espectro de secuencia rellenada con ceros');
135
title('Espectro con ventana von Hann');
Xb = mtlb_fft(xb);
dbb = 20*log10(abs(Xb));
dbb = dbb - max(dbb);
f6=scf(6);clf;
scf(6);
plot2d(n,dbb,6);mtlb_hold;
mtlb_axis([min(n) max(n) min(dbb) max(dbb)]);
xlabel('Indice n');
ylabel('Espectro de secuencia rellenada con ceros');
title('Espectro con ventana Blackman');
Para examinar el ámbito dinámico de las dos ventanas anteriores para este ejemplo, es
decir, su capacidad para distinguir componentes espectrales débiles y cercanos entre sí,
genérese una señal multisenoidal de la forma siguiente:
N = 127;
n = [0:N];
arg = 2*%pi*n/(N+1);
x = sin(10*arg) + 0.001*(cos(15*arg) + sin(20*arg) + cos(25*arg));
f7=scf(7);clf;
scf(7);
plot2d(n,x,4);mtlb_hold;
136
mtlb_axis([min(n) max(n) min(x) max(x)]);
xlabel('Indice n');
ylabel('Funcion multisenoidal');
title('Funcion con cuatro senoides');
El indicador k dentro del mandato plot indica que se debe usar el color negro. Si su
versión de SCILAB no lo tiene, utilice otro indicador de color. Utilícese ahora ventanas
von Hann y Blackman y aplíquense sobre la secuencia:
w=window('hn',N+1);
w1=w';
xh = x.*w1';
w2=window('kr',N+1,8.6);
w3=w2';
xb = x.*w2;
Ahora, rellénense las dos secuencias con ceros, calcúlense y grafíquense los espectros
de magnitud correspondientes en decibelios. Verifíquese cuáles de los cuatro senoides
pueden distinguirse en los espectros y cuál de las dos ventanas para este ejemplo da
mejores resultados.
L = 4*(N+1);
xh = [xh zeros(1,L-(N+1))];
xb = [xb zeros(1,L-(N+1))];
n = [0:4*(N+1)-1];
Xh = mtlb_fft(xh);
137
dbh = 20*log10(abs(Xh));
dbh = dbh - max(dbh);
f8=scf(8);clf;
scf(8)
plot2d(n,dbh,3);mtlb_hold;
mtlb_axis([min(n) max(n) min(dbh) max(dbh)]);
xlabel('Indice n');
ylabel('Espectro de secuencia rellenada con ceros');
title('Espectro de secuencia enventanada con ventana von Hann');
Xb = mtlb_fft(xb);
dbb = 20*log10(abs(Xb));
dbb = dbb - max(dbb);
f9=scf(9);clf;
scf(9);
plot2d(n,dbb,6);mtlb_hold;
mtlb_axis([min(n) max(n) min(dbb) max(dbb)]);
xlabel('Indice n');
ylabel('Espectro de secuencia rellenada con ceros');
title('Espectro de secuencia enventanada con ventana Blackman');
Es interesante a esta altura del análisis apreciar el efecto amortiguador que tienen las
ventanas sobre el fenómeno de la dispersión. Para visualizar tal efecto, ejecútense los
siguientes mandatos y realícese un comentario sobre los resultados. Fundamentalmente, los
138
mandatos que a continuación se proponen realizan una comparación entre la ventana
rectangular y las dos ventanas estudiadas en esta práctica.
x = [x zeros(1,L-(N+1))];
n = [0:4*(N+1)-1];
X = mtlb_fft(x);
dbr = 20*log10(abs(X));
dbr = dbr - max(dbr);
f10=scf(10);clf;
scf(10);
plot2d(n,dbr,1);
plot2d(n,dbh,3);
mtlb_axis([min(n) max(n) min(dbh) max(dbh)]);
xlabel('Indice n (secuencias rellenadas con ceros)');
ylabel('Comparacion de espectros');
title('Efectos de ventanas rectangular y von Hann');
f11=scf(11);clf;
scf(11);
plot2d(n,dbr,5);
plot2d(n,dbb,9);mtlb_hold;
mtlb_axis([min(n) max(n) min(dbb) max(dbb)]);
xlabel('Indice n (secuencias rellenadas con ceros)');
ylabel('Comparacion de espectros');
139
title('Efectos de ventanas rectangular y Blackman');
Nota: Es siempre posible mejorar esta práctica, especialmente en lo que concierne a
utilizar una mejor programación que la propuesta para conseguir los mismos resultados.
Como estudiante, siéntase libre para usar su creatividad.
3.6.1
a)
Resultados de la sexta práctica.
Resultados de la parte A
La siguiente figura muestra a la izquierda la simulación en SCILAB y a la derecha la
simulación en MATLAB.
Figura 3.55 Efectos de la convolución circular.
Figura 3.56 Convolucion circular y rellenos con ceros.
140
Figura 3.57 Magnitudes de la DFT con y sin relleno.
Figura 3.58 Resultados de las ventanas von Hann y Blackman en señal generada con dos senoides.
141
b)
Resultados de la parte B
Figura 3.60 Espectro de magnitud correspondiente en decibelios para la ventana von Hann y para la
Blackman.
142
Figura 3.62 Efectos de la ventana rectangular y Von Hann y rectangular con ventana de
Blackman.
3.7
En
Sétima práctica
esta práctica se da la modificación de un archivo de audio tipo wav aplicando
filtros digitales, lo que permite generar efectos de reverberación, eco, etc.
A continuación se muestra la séptima práctica en SCILAB.
Procesamiento Digital de Señales IE-0102
Práctica #7 con SCILAB.
Procesamiento de señales de audio.
Entre las funciones de SCILAB están las funciones “loadwave” y “wavread” que
permiten cargar un archivo de audio “.wav”.
143
En la carpeta “DSP/wavfile” se encuentra un archivo llamado DSP.wav, cargue este
archivo de las siguiente forma:
--> x=wavread(path); //El path es la dirección del directorio raíz donde esta el archivo
// para estudiantes que utilizan SCILAB-5.1 y copiaron la carpeta DSP en la carpeta
modules
// dentro del directorio de SCILAB en archivos de programas pueden utilizar
--> x=wavread('SCI/modules/DSP/wavfile/DSP.wav');
//donde el path sería path = 'SCI/modules/DSP/wavfile/DSP.wav
Con esto se abre el archivo DSP.wav en el directorio C:\Archivos de programa\scilab5.1.1\modules\DSP\wavfile\DSP.wav
También puede utilizar:
--> x=loadwave('path') // Las comillas indican que la entrada es un string
Ahora podemos escuchar el archivo cargado tecleando.
--> [a]=playsnd(x);
Eco y reverberación
Frecuentemente se utilizan filtros digitales para el procesamiento de señales de audio,
esto con el objetivo de crear efectos especiales. Dos de estos efectos son el eco y la
reverberación.
Un filtro de eco puede presentar el siguiente diagrama.
144
Figura 3.63 Filtro de eco simple.
Para este diagrama la ecuación de diferencias será
y [n]=x [n ] x [n−D]
Para generar un efecto de eco en nuestra señal de audio digite lo siguiente:
//Reverberador multieco
//Generando
efecto de multieco
d=loadwave('SCI/modules/DSP/wavfile/DSP.wav');
a=length(d)/2;
a=round(a)-10;
for i=1:a-1;
b=d(1,i);
y(i)=b;
end
f=length(y)/2;
y1=y(1:f); y2=y(f+1:length(y));
num=[0,zeros(1,2000),1];
den=[1,zeros(1,2000),-0.8];
stacksize('max');
x1=filter(num,den,y1); x2=filter(num,den,y2); //Durara varios minutos
r=length(x1); // igual al ancho de x2
145
x=x1;
for i=r+1:r*2-1
x(i)=x2(i-r);
end
savewave('SCI/modules/DSP/wavfile/Multieco.wav',x);
Ahora podemos escuchar nuestro efecto de audio que fue generado y guardado en la
carpeta indicada por el path en la función “savewave”. La respuesta impulsional típica de
este tipo de filtros se muestra a continuación.
//Respuesta impulsional típica
I =[1,zeros(1,60)];
numi=[0,zeros(1,10),1];
deni=[1,zeros(1,10),-0.8];
d2= filter(numi,deni,I);
plot2d3('gnn',d2); plot2d([1:length(d2)],d2,-9);
xlabel('Índice de muestreo');
ylabel('Amplitud');
title(['Respuesta impulsional típica']);
La respuesta en magnitud se obtiene de la siguiente forma:
//Respuesta de magnitud
getf('SCI/modules/DSP/freqz/freqz.sci')
[h1,w] = freqz(numi,deni,512);
plot(w/%pi,20*log10(abs(h1)));grid;
146
xlabel('Frecuencia normalizada');
ylabel('Magnitud');
title(['Respuesta de magnitud']);
Reverberador de sonido ambiente (reverberador de Schroeder)
Para este caso se tiene una combinación de 4 filtros IIR y dos filtros pasatodo como
se indica en el siguiente diagrama.
147
El efecto obtenido es similar al lo que ocurre en un recinto cerrado como es una sala
de conciertos.
Genere el siguiente código de SCILAB para obtener este efecto.
//Reverberador de sonido natural
stacksize('max');
a1=0.6; a2=0.4; a3=0.2; a4=0.1; a5=0.7; a6=0.6; a7=0.8;
R1=700; R2=900; R3=600; R4=400; R5=450; R6=390;
[d]=loadwave('SCI/modules/DSP/wavfile/DSP.wav');
a=length(d)/2;
for i=1:a-1
b=d(1,i);
y(i)=b;
end
f=length(y)/2;
f=round(f)
y1=y(1:f); y2=y(f+1:length(y));
num1=[0,zeros(1,R1-1),1];
den1=[1,zeros(1,R1-1),-a1];
d1=filter(num1,den1,y1); d11=filter(num1,den1,y2);
r=length(d1);
D1=d1;
for i=r+1:r*2-1
148
D1(i)=d11(i-r);
end
num2=[0,zeros(1,R2-1),1];
den2=[1,zeros(1,R2-1),-a2];
d2=filter(num2,den2,y1); d22=filter(num2,den2,y2);
r=length(d2);
D2=d2;
for i=r+1:r*2-1
D2(i)=d22(i-r);
end
num3=[0,zeros(1,R3-1),1];
den3=[1,zeros(1,R3-1),-a3];
d3=filter(num3,den3,y1);d33=filter(num3,den3,y2);
r=length(d3);
D3=d3;
for i=r+1:r*2-1
D3(i)=d33(i-r);
end
num4=[0,zeros(1,R4-1),1];
den4=[1,zeros(1,R4-1),-a4];
d4=filter(num4,den4,y1); d44=filter(num4,den4,y2);
r=length(d4);
149
D4=d4;
for i=r+1:r*2-1
D4(i)=d44(i-r);
end
dIIR=D1+D2+D3+D4;
num5=[a5,zeros(1,R5-1),1];
den5=[1,zeros(1,R5-1),a5];
K=length(dIIR)/2;
H=round(K)-1;
dIIR1= dIIR(1:H); dIIR2=dIIR(H+1:length(dIIR));
dALL1=filter(num5,den5,dIIR1); dALL11=filter(num5,den5,dIIR2);
num5=[a6,zeros(1,R6-1),1];
den5=[1,zeros(1,R6-1),a6];
dALL2=filter(num5,den5,dALL1); dALL22=filter(num5,den5,dALL11);
r=length(dALL2);
DALL2=dALL2;
for i=r+1:r*2-1
DALL2(i)=dALL22(i-r);
end
y=y(1:length(DALL2));
dTOTAL=y+a7*DALL2;
savewave('SCI/modules/DSP/wavfile/Sonido_ambiente',dTOTAL);
150
Reverberador pasatodo.
Para desarrollar un filtro más realista tenemos el reverberador con una estructura de
filtro pasad todo.
Figura 3.65 Reverberador pasatodo
Su función de transferencia está dada por:
H  z =
z −R
−R
1×Z
Para poder generar este efecto realice los siguientes pasos:
d=loadwave('SCI/modules/DSP/wavfile/DSP.wav');
stacksize('max');
a=length(d)/2;
for i=1:a-1
b=d(1,i);
y(i)=b;
end
f=length(y)/2;
f=round(f);
151
y1=y(1:f); y2=y(f+1:length(y));
num=[0.8,zeros(1,2900),1];
den=[1,zeros(1,2900),0.8];
d1=filter(num,den,y1); d2=filter(num,den,y2);
r=length(d1);
Salida=d1;
for i=r+1:r*2-1
Salida(i)=d2(i-r);
end
savewave('SCI/modules/DSP/wavfile/ALL_PASS.wav',Salida)
Efecto de retraso
Este es un efecto simple que podemos implementar de la siguiente forma:
Figura 3.66 Filtro de Retardo Referencia (8)
Para ejecutar este efecto digite:
x=loadwave('SCI/modules/DSP/wavfile/DSP.wav');
stacksize('max');
152
xlen=length(x)/2; //calculando el número de muestras del archivo
len=round(xlen-1)
for i=1:len-1
b=x(1,i);
yy(i)=b;
end
a=0.5;
R=5000; //Calculando número de muestras en el retardo
y=zeros(size(yy));
// filtrando la señal
for i=1:1:R+1
y(i) = yy(i);
end
for i=R+1:1:xlen-2
y(i)= yy(i)+ a*yy(i-R);
end;
savewave('SCI/modules/DSP/wavfile/Delay.wav',y);
analyze(y);
Ecualizador.
Finalmente vamos a generar varios efectos tipo ecualizador, utilizando filtros paso
bajo, paso alto y pasa banda.
153
Figura 3.67 Salidas del ecualizador. Referencia (8)
//Ecualizando
stacksize('max');
[x]=loadwave('SCI/modules/DSP/wavfile/DSP.wav');
a=length(x)/2;
for i=1:a-1
b=x(1,i);
y(i)=b;
end
Fn = .031;
N = 62;
//Esta son las ganancias en las tres bandas.
gLP = 0.4; gBP = 1.5; gHP = 1.5;
LP=wfir('lp',N,[Fn 0],'re',-1);
//type='lp','hp','bp','sb' forder=orden del filtro N
//cfreq frecuencias de corte 0<cfreq(1),cfreq(2)<0.5 para paso alto o bajo solo se usa
cfreq(1)
//fpar ventana kaiser (fpar(1)>0 fpar(2)=0)
154
//wtype tipo de ventana ('re','tr','hm','hn','kr','ch')
Fn1 = [.032 .079];
BP = wfir('bp',N,Fn1,'re',-1);
Fn2 = .079;
HP = wfir('hp',N,[Fn2 0],'re',-1);
y1 = convol(LP,y);
y2 = convol(BP,y);
y3 = convol(HP,y);
yA= gHP * y3;
savewave('SCI/modules/DSP/wavfile/Equalizer3.wav',yA);
yB= gLP * y1;
savewave('SCI/modules/DSP/wavfile/Equalizer1.wav',yB);
yC= gBP * y2;
savewave('SCI/modules/DSP/wavfile/Equalizer2.wav',yC);
yD = yA + yB + yC;
savewave('SCI/modules/DSP/wavfile/Equalizer4.wav',yD);
3.7.1
Código MATLAB de la práctica 7.
Procesamiento Digital de Señales IE-0102
Práctica #7 con MATLAB.
Procesamiento de señales de audio.
155
Entre las funciones de MATLAB están las funciones “loadwave” y “wavread” que
permiten cargar un archivo de audio “.wav”.
Primero copie un archivo wav en la carpeta “work” de MATLAB (en nuestro caso el
archivo DSP.wav). Luego teclee el siguiente comando.
[x,fs]=wavread('DSP.wav');
Con
esto
se
abre
el
archivo
DSP.wav
en
el
directorio
C:\MATLAB701\work\DSP.wav
Ahora podemos escuchar el archivo cargado tecleando.
wavplay(x,fs) ;
Eco y reverberación
Frecuentemente se utilizan filtros digitales para el procesamiento de señales de audio,
esto con el objetivo de crear efectos especiales. Dos de estos efectos son el eco y la
reverberación.
Para generar un efecto de eco en nuestra señal de audio teclee lo siguiente:
[d,r,nbits]=wavread('DSP.wav');
num=[0,zeros(1,2900),1];
den=[1,zeros(1,2900),-0.8];
d1=filter(num,den,d);
wavwrite(d1,r,nbits,'Multieco_MATLAB.wav');
wavwrite(d,r,nbits,'Original_MATLAB.wav');
Ahora podemos escuchar nuestro efecto de audio que fue generado y guardado en la
carpeta “work”.
156
Podemos ver la respuesta impulsional típica de este filtro si tecleamos:
%Respuesta impulsional típica.
I =[1,zeros(1,60)];
numi=[0,zeros(1,10),1];
deni=[1,zeros(1,10),-0.8];
d2= filter(numi,deni,I);
figure(1);
stem(d2);grid;
xlabel('Índice de muestreo');
ylabel('Amplitud');
title(['Respuesta impulsional típica']);
La respuesta en magnitud se obtiene de la siguiente forma:
%Respuesta de magnitud
figure(2);
[h1,w] = freqz(numi,deni,512);
plot(w/pi,20*log10(abs(h1)));grid;
xlabel('Frecuencia normalizada');
ylabel('Magnitud');
title(['Respuesta de magnitud']);
Reverberador de sonido ambiente (reverberador de Schroeder)
157
El efecto obtenido es similar al lo que ocurre en un recinto cerrado como es una sala
de conciertos.
Genere el siguiente código de MATLAB para obtener este efecto.
a1=0.6;a2=0.4;a3=0.2;a4=0.1;a5=0.7;a6=0.6; a7=0.8;R1=700;
R2=900;R3=600;R4=400;R5=450;R6=390;
[d,r]=wavread('DSP.wav');
num1=[0,zeros(1,R1-1),1];
den1=[1,zeros(1,R1-1),-a1];
d1=filter(num1,den1,d);
num2=[0,zeros(1,R2-1),1];
den2=[1,zeros(1,R2-1),-a2];
d2=filter(num2,den2,d);
num3=[0,zeros(1,R3-1),1];
den3=[1,zeros(1,R3-1),-a3];
d3=filter(num3,den3,d);
num4=[0,zeros(1,R4-1),1];
den4=[1,zeros(1,R4-1),-a4];
d4=filter(num4,den4,d);
dIIR=d1+d2+d3+d4;
num5=[a5,zeros(1,R5-1),1];
den5=[1,zeros(1,R5-1),a5];
dALL1=filter(num5,den5,dIIR);
158
num5=[a6,zeros(1,R6-1),1];
den5=[1,zeros(1,R6-1),a6];
dALL2=filter(num5,den5,dALL1);
dTOTAL=d+a7*dALL2;
soundsc(dTOTAL,r);
wavwrite(dTOTAL,'Sonido_ambiente_MATLAB.wav');
Reverberador pasa todo.
Para desarrollar un filtro más realista tenemos el reverberador con una estructura de
filtro pasad todo.
Su función de transferencia esta dada por:
H  z =
z −R
−R
1×Z
Para poder generar este efecto realice los siguientes pasos:
%Reverberador paso todo
[d,r]=wavread('DSP.wav');
num=[0.8,zeros(1,2900),1];
den=[1,zeros(1,2900),0.8];
d1=filter(num,den,d);
wavwrite(d1,r,'All_pass_MATLAB.wav');
159
Efecto de retraso
Para ejecutar este efecto teclee:
[x,fs,nbits]=wavread('DSP.wav');
xlen=length(x); %Calculando el numero de muestras
a=0.5;
R=5000; %Calculando el número de muestras en el retardo.
y=zeros(size(x));
%Filtrando la señal
for i=1:1:R+1
y(i) = x(i);
end
for i=R+1:1:xlen
y(i)= x(i)+ a*x(i-R);
end;
wavwrite(y,fs,nbits,'Delay.wav')
Podemos ver una gráfica de frecuencia de la señal si aplicamos:
Ecualizador.
Finalmente vamos a generar varios efectos tipo ecualizador, utilizando filtros paso
bajo, paso alto y pasa banda.
%Ecualizando
[x,fs]=wavread('DSP.wav');
160
Wn = .20;
N = 62;
%Estas son las ganancias de las tres bandas
gLP = 0.4; gBP = 1.5; gHP = 1.5; LP = fir1(N,Wn);
Wn1 = [.20, .50];
BP = fir1(N,Wn1);
Wn2 = .50;
HP = fir1(N,Wn2,'high');
y1 = conv(LP,x);
y2 = conv(BP,x);
y3 = conv(HP,x);
yA= gHP * y3;
wavwrite(yA,fs,'Ecualizador3_MATLAB');
yB= gLP * y1;
wavwrite(yB,fs,'Ecualizador1_MATLAB');
yC= gBP * y2;
wavwrite(yC,fs,'Ecualizador2_MATLAB');
yD = yA + yB + yC;
wavwrite(yD,fs,'Ecualizador4_MATLAB');
3.7.2
Resultados de la séptima práctica
161
Figura 3.68 Respuesta impulsional para un reverberador multieco SCILAB y MATLAB.
Figura 3.69 Respuesta de magnitud de un reverberador multieco en SCILAB y MATLAB.
162
Figura 3.70 Gráfica de un filtro de retardo frecuencia obtenida con matlab
CAPÍTULO 4: Elaboración de prácticas de procesamiento
digital de señales en SCICOS.
Las siguientes prácticas fueron realizadas en la versión 4.2 de SCICOS. Entre estas
se encuentran una práctica sobre bancos de filtros digitales, una segunda práctica que trata
sobre filtros digitales paso banda, paso bajo y tipo Notch y la última práctica lleva a cabo
una comparación entre los filtros digitales IIR y FIR.
4.1
Primera práctica.
Procesamiento Digital de Señales IE-0102
Práctica #1 con SCICOS
Filtros digitales.
163
Un filtro digital requiere un procesador digital para realizar cálculos numéricos en los
valores muestreados de la señal. El procesador puede ser un ordenador corriente, como un
PC, o un chip DSP (Digital Signal Processor) especializado.
La parte analógica de la señal debe ser previamente muestreada y digitalizada por un
convertidor AD (analógico-digital). Los números binarios resultantes de la conversión
anterior, que representan valores sucesivos muestreados de la señal de entrada, son
transferidos al procesador, que realiza unos cálculos numéricos sobre ellos. Estos cálculos
suelen ser multiplicaciones de los valores de entrada por unas constantes y suma de las
anteriores multiplicaciones. Si es necesario, los resultados de los cálculos, que representan
los valores de una señal filtrada, son sacados a través de un convertidor DA (digitalanalógico) para convertir la señal a su forma analógica.
La señal de salida es la convolución de la señal de entrada con el filtro.
En la frecuencia el producto de los espectros de entrada y el filtro nos da el espectro
de salida.
Parte a: Resonador digital
Es un filtro pasa banda especial, con un par de polos complejos conjugados ubicados
en la vecindad del círculo unitario, como se muestra en la figura:
164
Figura 4.1 a) Diagrama de polos y ceros y b) respuesta en frecuencia de un resonador. Referencia (9).
La posición angular de los polos determina la frecuencia de resonancia del filtro. El
nombre resonador se debe a que el filtro posee una gran ganancia para señales senoidales
de frecuencia cercanas a la de los polos. Poseen aplicaciones de síntesis de voz y filtrado
pasabanda sencillo.
Los polos complejos conjugados pueden ser ubicados en:
± j o
p 1,2=r e
,0r 1
Se pueden colocar dos ceros, los ceros pueden ser ubicados en z = 1 y z = -1, esto
eliminaría completamente la respuesta del filtro a las frecuencias ω = 0 y ω = π. Si se
eligen colocar los ceros en el origen tendríamos:
H  z =
bo
1−r e
j o
−1
z 1−r e
− j  o −1
z 
=
bo
1− 2rcos o  z −1r 2 z−2
La respuesta en frecuencia alcanza su máximo en:
 r=cos−1 
1r 2
cos wo 
2r
Si r es aproximado a 1  r=o y como
o
∣H e j ∣ alcanza su máximo cerca de ω
se elige el factor de ganancia bo de forma que ∣H e j  ∣=1 para este caso:
o
b o=1−r   1−2rcos2 or 2
Ejemplo: Tomamos una frecuencia de ωo = π/4 rad.
Para esto tenemos:
165
H  z =
b o 1−z −2 
−1
2
1−2rcos o  z r z
−2
Podemos utilizar:
b o=
1−r
× 1−2rcos2 or 2
2sen o 
Con r=0.98, tenemos bo =0.0198, por lo tanto:
H  z =
0.1981−z −2
0.198−0.198z −2
=
1−1.386z−10.96z−2 1−1.386z−10.96z−2
Ahora vamos a implementar este filtro en SCICOS. Para ello genere el siguiente
diagrama de bloques en SCICOS.
Figura 4. 2 Diagrama de sistema para realizar filtrado con un filtro resonante digital.
166
Para las ondas senoidales llene los bloques con la siguiente tabla:
Generador senosoidal
Magnitud
Fase
1
0.79
10000
2
1
100
3
0.25
600
4
1,5
0.15
5
1
0.785 (frecuencia ωo)
Para los bloques CLK1 y CLK2 el periodo es 1 y el tiempo inicial es 0.1.
Para el bloque de reloj discreto el tiempo de muestreo es 1 y el offset 0.
El bloque de transformada de transferencia discreta se va a implementar como la
función de transferencia del filtro en si. Digite:
Denominador = z.^2-1.386*z+0.96
Numerador = 0.0198-0.0198*z.^2
Esto es equivalente a H(z) del filtro.
Finalmente para el bloque MScope modifique:
167
El vector Ymin = -2 3, el vector Ymax = 2 3, Refrescamiento de periodo = 50 50 y las
señales serán la entrada (suma de señales senoidales) y la salida del filtro (señal de 0.785
rad/s).
Finalmente proceda a simular y a obtener las señales de entrada y salida del sistema
digital.
Observe además las señales de entrada y la señal muestreada y compárelas.
Parte B: El filtro Notch
El comportamiento del filtro Notch ideal se muestra en la siguiente figura:
Figura 4.3 (a) Comportamiento del filtro Notch ideal y (b) comportamiento real del filtro Notch.
Referencia (9).
168
La figura muestra el comportamiento de un filtro Notch con ceros en ωo y ω1 . Son
útiles en aplicaciones donde se deben eliminar frecuencias especificas. Un ejemplo de ello
son los componentes de 50 ciclos (inducción de la frecuencia de línea) que contaminan las
señales de muy baja amplitud.
La función de sistema para el filtro Notch es:
j o −1
− j o
−1
H  z =b o 1−e. z 1−e
z 
−1
−2
H  z =b o 1−2cos  o z  z 
Este filtro Notch tipo FIR tiene el inconveniente de tener un ancho de banda
relativamente grande, por lo que elimina la frecuencia de interés pero atenuá (gravemente)
otras componentes de frecuencias vecinas. Además la ganancia para ω = 0 (z = 1) es
distinta de la ganancia ω = π (z = -1).
∣H e j ∣=0=2bo 1−cos o 
j
∣H e ∣==2bo 1cos o
La diferencia entre ambas puede ser muy grande si la frecuencia que se desea eliminar
está cerca de ω = 0 o de ω = π. A pesar de ello el coeficiente bo se calcula para que la
ganancia sea unitaria.
∣H  z ∣z=1=∣H  e j  ∣=0=1
De donde resulta que bo =[2(1-cosωo)]
La función de sistema de un filtro Notch diseñado para cancelar la frecuencia ωo =
π/4, con ganancia unitario en ω = 0 es:
H  z =
1
−1
−2
1− 2 z z 
 2− 2
169
La respuesta de este filtro se puede observar en la siguiente figura:
Figura 4.4 Respuesta en frecuencia del filtro. Referencia (9).
Para ver el comportamiento del filtro genere este filtro en SCICOS para filtrar una señal de
entrada en ωo = π/4.Para ello utilice el siguiente diagrama en SCICOS.
Figura 4.5 Sistema de prueba de filtro Notch.
170
Utilice un generador sinusoidal con magnitud = 1 y frecuencia = 0.785 (esta va a ser
la señal a eliminar). Los relojes CLK1 y CLK2 tendrán periodo = 1 y tiempo inicial 0.1. El
reloj discreto DCLK debe tener un tiempo de muestreo de 1 y un offset de 0.
Como se muestra en la figura el filtro Notch se generó por medio de tres bloques de
retardo y dos ganancias “a” y ”b”, donde:
a=
1
2−  2
b=−2
Si observa el diagrama se agrega nuevamente la implementación del filtro paso banda
anterior, esto es con la intención de notar la reducción de la señal a filtrar.
Para este diagrama obtenga la señal de salida del filtro Notch y la señal de salida del
filtro paso banda (si utilizamos el mismo diseño anterior deberíamos ver la señal a ωo = 4/π
reducida a aproximadamente cero). Obtenga la señal de entrada, compare y comente.
Para obtener la respuesta en frecuencia del filtro dígite en SCILAB.
-->[y1,y2]=frmag([1.707 -2.41 1.707],[1 0 0],256);
-->plot(y2,y1);
Parte C: Filtro paso bajo
El análisis simbólico es una moderna técnica, para poder estudiar el comportamiento
de muchos sistemas y circuitos. Un ejemplo de ello es en el diseño de circuitos digitales. El
siguiente diagrama muestra un filtro digital de orden 3:
171
Figura 4.6 Filtro digital de orden 3.
Para este filtro su función de trasferencia está dada por:
H  z =
 z 1b az 2z−aza
3
 z  za
Tomando a = 0.5 y b = 0.25, tenemos:
2
0.1250.25z0.25z 0.125z
H  z =
3
 z z0.5 
3
Si deseamos ver la respuesta en frecuencia del filtro podemos digitar en SCILAB:
--> b = 1/4; a = 1/2;
-->z=poly(0,'z');
-->h=((z+1)*b*(a*z.^2+z-a*z+a))/(z.^3+z*a)
-->[x,f]=frmag(h,256);
-->plot(f,x)
Al generar el gráfico obtenemos:
172
Figura 4.7 Respuesta en frecuencia de un filtro paso bajo.
Ahora vamos a utilizar este filtro para atenuar señales de la siguiente forma:
Figura 4.8 Aplicación para filtro paso bajo.
173
Tenemos para este caso tres generadores sinusoidales con los siguientes valores:
Señal
Frecuencia
Magnitud
1
100
2
2
0.1
1
3
80
1
Los valores de a y b para el filtro son 0.5 y 0.25 respectivamente, además cargue un
bloque de función de transferencia discreta y genere la función del filtro con la finalidad de
compara la señal de salida por ambos métodos. El tiempo de muestreo del reloj discreto es
de 0.1. Obtenga las señales de salida en ambos casos y compárelas.
4.1.1 Solución a la primera práctica en SCICOS.
Figura 4.9 Señal de salida “Gráfico 1” y señal de entrada “Gráfico 2”.
174
Figura 4.10 Señal de entrada “Grafico 1” y señal muestreada “Gráfico 2”. Filtro paso
banda resonante digital.
Figura 4.11 Señal de entrada muestreada y sin muestrear.
175
Figura 4.12 Señal filtrada por ambos filtros (Gráfico 1) y señal filtrada por el filtro Notch (Gráfico 2).
Figura 4.13 Señal de entrada y salida filtro paso bajo en diagrama de bloques.
176
Figura 4.14 Señal de entrada y salida de filtro paso bajo con el bloque de función de
transferencia.
4.2
Segunda práctica.
Procesamiento Digital de Señales IE-0102
Práctica #2 con SCICOS
Bancos de Filtros
Los bancos de filtros poseen varias aplicaciones en distintas áreas tales como
codificación de voz, procesamiento adaptivo de señales, compresión de imágenes,
transmisión de varias señales a través de una señal, etc.
177
El principal uso de los bancos de filtros, es la habilidad de tener un sistema que
separe la señal en consideración en el dominio de la frecuencia, en dos o más señales, o la
de componer dos o más señales diferentes en una sola señal.
Los bancos de filtros se dividen en dos tipos, los bancos de filtros de análisis y los
bancos de filtros de síntesis.
Figura 4.15 Ejemplo de un banco de filtros sencillo. Referencia (10).
La salida de este sistema se muestra como:
Y  z = z.−1 X  z  en otras palabras
y n= x n−1
Parte A: Simulación de un banco de filtros simple
La señal de entrada sera una señal senoidal de amplitud unitaria, de frecuencia 0.675
(rad/s) o 0.107 Hz y un tiempo de muestreo de 0.2 segundos.
Cargue SCICOS.
--> scicos; //o puede abrirlo desde el menu de SCILAB.
Genere el siguiente diagrama en SCICOS.
178
Figura 4.16 Diagrama de un banco de filtro simple.
Para generar señales senoidales use el bloque “Sinusoid generator” que se encuentra
dando clic en el Menu de SCICOS Palette- Source esto abre una pantalla donde se escoge el
bloque y se agrega a la zona del diagrama.
Dando clic derecho del mouse en el bloque y eligiendo “open set” aparece un cuadro
de diálogo donde se pueden variar los parámetros del bloque. Para este caso escogemos:
magnitud =1, frecuencia = 0.675 fase =0.
Los bloques de reloj de activación están en Palette-Source.
179
Siga la siguiente tabla:
Reloj
Periodo
Tiempo inical
1
1
0
2
0.01
0
3
0.1
4
0.1
Para el reloj 3 (Sample time clock) el tiempo de muestreo es 0.2 y el offset es 0.
El bloque de función SCILAB “Scifun” (se usan 2 para la decimación): este permite
cargar una función de SCILAB o una función generada por nosotros. Se encuentra en
Palette-Others. Para este caso se requiere se estudie el bloque dando clic derecho y luego
Help.
Para las entradas teclee:
[1,1;1,1] (genera dos puertos de entrada)
Se da clic en OK y se despliega un nuevo cuadro de diálogo, donde se define la
función que computa la salida.
En el espacio vamos a digitar:
--> if u1 < 2
y1=u2
else
y1=0
end
180
De momento los demás cuadros que aparezcan no van a variar, solo de clic en OK
hasta que ya no aparezcan más cuadros.
Para los contadores estos irán de 1 a 4.
El valor para el bloque de ganancia es 0.5 (El banco de filtros genera una ganancia de
2 que debemos atenuar).
El bloque Sample and hold (S/H):como lo indica su nombre este bloque muestrea y
espera al próximo evento, para volver a muestrear. Este se encuentra en la paleta “Lineal”.
Este bloque no va a variar sus propiedades.
El bloque reatrdo (1/z): Se encuentra en la paleta “Lineal”, es equivalente a la
función:
Y  z =
1
z
Finalmente, para poder ver los resultados cargamos el bloque “Mscope” el cual
debemos llenar de la siguiente forma.
Números de puertos de entrada
1 1
Colores o marcas
No se varia
Numeros de ventanas de salida
No varia
Posición de ventana de salida
No varia
Tamaño de ventana de salida
No varia
Vector Ymin
-1 -1
Vector Ymax
1 1
Refrescar periodo
140 140
Accept herited events 0/1
0
Nombre del osciloscopio
Entrada y salida
181
Para simular el ejercicio en el “Menu” de SCICOS en “Simulate” debe darse un clic
en “Run”.
Tome las capturas de las señales y explique lo que sucede.
Parte B: Filtro de análisis-síntesis
Un Banco de filtros de análisis consiste en un conjunto de filtros, acomodados en
paralelo. Las características de la respuesta en frecuencia de estos bancos de filtros es que
divide la señal en sub-bandas.
Por otra parte el banco de filtros de síntesis consiste en un grupo de filtros cuyas
salidas son sumadas para formar la señal sintetizada.
El siguiente es un banco de filtros de análisis-síntesis donde:
H o  z =
1z.−1
1−z.−1
y H 1  z =
2
2
Figura 4.17 Banco de filtros análisis-síntesis. Referencia (10)
Si tomamos:
Go  z =
1z.−1 
1−z.−1 
y G 1  z =
2
2
Esto implica que:
Y  z = X  z  z.−1
182
En otras palabras, y n= x n−1 indicando que la figura es un banco de filtros de
reconstrucción perfecta.
Vamos entonces a simular un filtro de reconstrucción perfecta en SCICOS.
Para ello elabore el siguiente diagrama en SCICOS.
Figura 4.18 Aplicación de un filtro de reconstrucción pérfecta.
Para este caso se mantienen los valores anteriores de los bloques Generador senoidal,
Mscope, relojes 1,2 y 3 y de S/H. Se agrega en 4 ocasiones un nuevo bloque que es el
bloque de función de transferencia discreta. Al abrir este se solicita el denominador y el
numerador los cuales se pueden escribir como si fueran los correspondientes polinomios en
Z y con lenguaje SCILAB. Luego de conectar los bloque simúlese y coméntese sus
resultados.
183
Parte C: Simulación de un banco QMF. (Quadrature Mirror Filter).
La señal de entrada primeramente es filtrada a través de dos filtros Ho(z) y H1(z),
siendo estos filtros paso bajos y paso altos. Cada señal en subbanda es limitada en banda
aproximadamente en un ancho total de π. Las zonas en subbandas son decimadas en un
factor de dos para obtener Vk(n). Cada señal decimada es codifica de forma que las
propiedades especiales de la subbanda son explotadas. Las señales producidas
decodificadas para generar Vo(n) y V1(n) se hacen pasar a través de los filtros F0(z) y F1(z)
para producir la señal de salida. Ho(z) y H1(z) son llamados el filtro análisis. F0(z) y F1(z)
conforman el banco de síntesis.
Figura 4.19 Diagrama de banco QMF. Referencia (10)
184
Procedemos a continuación a generar una simulación de un banco QMF en SCICOS.
Figura 4.20 Diagrama en SCICOS de simulación de un banco de filtros QMF.
Para generar el diagrama use:
Reloj
Periodo
1
0.001
2
0.01
3
0.0001
4
0.1
Para el reloj discreto el tiempo de muestreo es 0.001. La señal senoidal debe ser de
magnitud 1 y de frecuencia 0.5, el contador de SCI1 cuenta de 0.001 hasta 6 e igual para el
contador de SCI2.
En este caso para los bloques SCI (ambos), dé clic derecho y digite:
185
En los puertos de entrada [1,1;1,1] (genera dos puertos de entrada), luego debemos
dar clic en OK , en el siguiente cuadro de texto digitamos:
if u1 < 2
y1=u2
else
y1=0
end
y damos OK hasta salir.
Para los filtros:
H o  z =
0.5z0.5
z
H 1  z =
0.5z−0.5
z
F o  z =
z1
z
F 1  z =
z −1
z
Para la señal de salida de F1 use un rango en Y de (-0.002, 0.002) para poder observar
la señal. Mida además la señal de salida de los filtros y la salida general. Compare y
comente los resultados.
4.2.1 Resultados de la segunda práctica.
Tras simular el diagrama en SCILAB obtenemos los siguientes gráficos.
186
Figura 4.21 Entrada y salida del diagrama de bloques de un banco de filtros simple.
Figura salida de diagrama 1 primera práctica con SCICOS.
Para Simulink es posible simular el siguiente diagrama.
Figura 4.22 Diagrama en Simulink del primer ejemplo para la práctica 1 de SCICOS.
187
Tras dar los mismos valores y simular el diagrama obtenemos:
Figura 4.23 Resultados de primer diagrama hechos con MATLAB.
Como se muestra la salida es igual a la entrada más un pequeño retraso lo cual es lo
esperado basado en la teoría. Para el caso de SCICOS al no encontrar bloques de upsample
y downsample que posee MATLAB, generamos un algoritmo poco elegante pero que
muestra el comportamiento del sistema.
Para la parte B tenemos los siguientes resultados.
Figura 4.24 Salida y entrada del banco de filtros análisis-síntesis en MATLAB
188
Estas imágenes fueron obtenidas con los mismos valores usados en SCICOS y
utilizando el siguiente diagrama en MATLAB.
Figura 4.25 Diagrama para filtro análisis-síntesis en MATLAB.
Figura 4.26 Entrada y salida de banco de filtro análisis-síntesis en SCILAB.
189
Figura 4.27 El gráfico superior muestra la salida del filtro F0, la figura inferior muestra la salida del
filtro F1.
Figura 4.28 El gráfico superior muestra la salida del sistema, el gráfico inferior es la entrada.
190
Para este caso se observa que aun permanece ruido en la señal, esto debido a que la
aproximación realizada para la decimación no es muy buena, mas permite ver el efecto del
sistema a grandes rasgos.
4.3
Tercera práctica en SCICOS.
Procesamiento Digital de Señales IE-0102
Práctica #3 con SCICOS
Filtros FIR e IIR.
Normalmente un filtro IIR requiere de menos coeficientes que un filtro FIR pero
también requiere las mismas especificaciones. Los filtros IIR se emplean cuando se
requieren transiciones abruptas y alto rendimiento. El precio a pagar es que el filtro IIR se
convierte en inestable o se degradan las características en frecuencia si no se toman algunas
precauciones. Los sistemas IIR no van a presentar una característica de fase exactamente
lineal si queremos que sean causales. La solución más habitual se basa en aproximar el
módulo de la función de transferencia sin preocuparnos de la fase, ya que esta se ajusta en
una etapa posterior de pasa todo.
El siguiente es un ejemplo de un filtro digital IIR que se puede generar en SCILAB.
Este es un filtro elíptico pasobanda de orden 6:
hz=iir(3,'bp','ellip',[.25 .35],[.08 .03]);
[hzm,fr]=frmag(hz,256);
plot2d(fr',hzm')
191
xtitle('Filtro paso banda discreto IIR 0.20<fr<0.40 ',' ',' ');
q=poly(0,'q'); //expresa el resultado en términos de q = z-1
hzd=horner(hz,1/q)
Podemos generar además un filtro pasabanda FIR de la siguiente forma:
hn=eqfir(30,[0 .2;.25 .35;.4 .5],[0 1 0],[1 1 1]);
[hm,fr]=frmag(hn,256);
plot(fr,hm)
Tenemos la siguiente respuesta en frecuencia obtenida.
Figura 4.29 Respuesta en frecuencia de filtro FIR de orden 30 y de un IIR de orden 6.
Ahora tómese tres señales en SCICOS; una a f1 = 500, otra a f2=2500 y una última a
f3 = 5000 y aplique ambos filtros de la siguiente forma.
192
Figura 4.30 Implementación de un filtro IIR paso banda.
Los coeficientes del numerador son: -0.1324, -0.0627, 0.213, 8.82x10-17, -0.213,
0.06127 y 0.1324.
Los coeficientes del denominador son: 0.2432, 0.59, 1.28, 1.42, 1.63, 1.46 y 1.
Para el caso del filtro FIR tenemos el siguiente diagrama:
193
Figura 4.31 Filtro FIR.
Para este caso se tienen los siguientes coeficientes
- 0.0581614,
0.2157638,
0.0180146, - 0.2606135,
- 0.2606135,
0.0180146 , 0.2157638 , - 0.0581614.
0.1769141,
0.1769141,
La transformación bilineal:
Es un mapeo matemático de variables, en filtrado digital esto es un mapeo estándar de
s o del plano análogo dentro de z o el plano digital. Esta transforma filtros analógicos y los
diseña usando técnicas clásicas de filtrado en sus equivalentes discretos.
194
SCILAB utiliza la función “bilin” para llevar a cabo la transformación bilineal. Su
sintaxis es:
[sl1]=bilin(sl,v); //donde sl1 y sl son sistemas lineales y v es un vector con 4 entradas
(v=[a,b,c,d])
El siguiente ejemplo genera la transformación bilineal de un espacio lineal.
s=poly(0,'s');z=poly(0,'z');
w=ssrand(1,1,3);
wtf=ss2tf(w);v=[2,3,-1,4];a=v(1);b=v(2);c=v(3);d=v(4);
[horner(wtf,(a*z+b)/(c*z+d)),ss2tf(bilin(w,[a,b,c,d]))]
clean(ss2tf(bilin(bilin(w,[a,b,c,d]),[d,-b,-c,a]))-wtf)
También se utiliza la función cls2dls con la siguiente sintaxis.
[sl1]=cls2dls(sl,T[,fp]) // T es el periodo de muestreo. Un ejemplo de este comando
es:
s=poly(0,'s');z=poly(0,'z');
sl=syslin('c',(s+1)/(s^2-5*s+2));
//Sistema de tiempo continuo como función de
//transferencia
slss=tf2ss(sl); //Ahora en forma de espacio de estados
sl1=cls2dls(slss,0.2); //sl1= salida de cls2dls
sl1t=ss2tf(sl1) // Convierte en función de transferencia
sl2=horner(sl,(2/0.2)*(z-1)/(z+1)) //Compare sl1 y sl2
[x,f]=frmag(sl1t,256);
plot(f,x)
195
La transformación bilineal evita inconvenientes como el solapamiento que ocurre a
veces en otros métodos como el de transformación invariante al impulso. Además esta
permite mantener la estabilidad del sistema
Vamos a comparar un filtro digital con uno analógico.
Desarrolle el siguiente diagrama en SCICOS.
Para el filtro discreto num [-0.0811, 0.01869, 0.1028], den [0.906, -1.8317, 1]
Para el sistema continuo H=(s+1)/(s^2+0.5*s+2)
Figura 4 .32 Sistema de filtrado analógico y digital.
El reloj discreto tiene un tiempo de muestreo de 0.0015, las señales son de
magnitudes 3, 1, 1 y frecuencias respectivas de 1000, 500 y 0.4.
Para el diagrama simule el sistema y compare el filtro digital con el analógico.
Ahora vamos a generar filtros FIR e IIR usando SCILAB.
//Filtro rechaza banda FIR
196
hn=eqfir(5,[0 .2;.25 .35;.4 .5],[0 1 0],[1 1 1]);
//Filtro paso alto FIR
hn=eqfir(5,[0 .2;.10 .12;.4 .5],[0 0 1],[1 1 1]);
//Filtro paso alto IIR
hz=iir(3,'hp','butt',[.15 .25],[.08 .03]);
Obtenga las respuestas de frecuencia de estos filtros, comente las diferencias entre
estos. Y establezca diferencias entre los filtros FIR e IIR.
4.3.1 Resultados de la tercera práctica en SCICOS.
Figura 4.33 Salida de señal filtrada con filtro IIR.
197
Figura 4 .34 Señal de entrada y de salida para filtro FIR
Figura 4.35 Filtro analógico y filtro digital IIR.
198
CAPÍTULO 5: Conclusiones y recomendaciones.
SCILAB es una herramienta muy útil en el aprendizaje, ya que permite interactuar con
un número considerable de funciones matemáticas y lógicas, que permiten generar
aplicaciones y así fomentar nuestra inventiva. De igual forma SCICOS como herramienta
de SCILAB es capaz de interactuar con este directamente y así generar un entorno gráfico
amigable con el usuario.
A pesar de ser un software muy útil tanto SCILAB como SCICOS aún son muy
simples si los comparamos con MATLAB y SIMULINK. Por ejemplo, al acceder al
número de bloques de SIMULINk podemos ver que este es considerablemente mayor al de
SCICOS. Es debido a esto que muchas aplicaciones de SIMULINK aun están disponibles
en SCICOS. De igual forma sucede entre MATLAB y SCILAB. Otro aspecto en donde
esto se muestra es en el espacio de memoria asignado a las variables. Mientras MATLAB
puede procesar un archivo de audio pequeño en 5 segundos, SCILAB en ocasiones tardaba
hasta 1 hora y el archivo no podía sobrepasar dicho límite de memoria.
Pese a lo anterior SCILAB te permite generar tu propia biblioteca de funciones, claro
esta, debes saber lo básico sobre programación y tener a mano el manual de ayuda de
SCILAB y SCICOS.
Las funciones de MATLAB en si difieren bastante a las de SCILAB, en algunas
ocasiones, estas cumplen una labor similar y hasta tienen el mismo nombre en ambos
softwares, más la mayoría de las funciones difieren en uso y aplicación. Un ejemplo de ello
es la función “freqz” de MATLAB, ya que esta función puede hacer o tomar distintas
199
decisiones dependiendo de sus entradas asignadas. En otras palabras una función de
MATLAB puede hacer la misma función que dos o más funciones de SCILAB.
Se recomienda a aquellas personas que desean explorar las funcionalidades de
SCILAB y SCICOS el uso de las herramientas informáticas que se encuentran en la página
oficial de SCILAB, en especial recomiendo para los amantes de las telecomunicaciones el
de librerías de telecomunicaciones y bloques para SCICOS.
200
BIBLIOGRAFÍA
Páginas web:
1.
SCILAB
GROUP.
“Signal
Processigng
With
SCILAB”,
http://pauillac.inria.fr/cdrom/ftp/scilab/documentation/pdf/signal.pdf.
2.
Delicado B. “Introducción al modelado y simulación de sistemas con la Toolbox
SCICOS de SCILAB”, http://pauillac.inria.fr/cdrom/ftp/scilab/contrib/delicado/
3.
Delicado B. “Manual de introducción al tratamiento de señales con SCILAB
para
usuarios
de
MATLAB”.
http://pauillac.inria.fr/cdrom/ftp/scilab/contrib/delicado/scilab.pdf
4.
SCILAB
GROUP.
“Introduction
to
SCILAB”.
a
SCILAB”.
http://pauillac.inria.fr/cdrom/ftp/scilab/documentation/pdf/intro.pdf-0
5.
Mora
Hector.
“Introducción
http://www.scilab.org/publications/SCISPANISH/Intro_Spanish.pdf
6.
Also
Ch.
“Comparing
SCILAN
and
MATLAB”.
http://www.num.uni-
sb.de/iam/studium/vorlesungen/ss2007/prama/praktische_aufgaben/matlab/Comparing
%20MATLAB%20and%20SCILAB.pdf
7.
Gilberto
E.
“Programming
with
SCILAB”
http://www.infoclearinghouse.com/files/scilab/scilab02.pdf
8.
“Demostraciones
con
MATLAB.”
http://www.lpi.tel.uva.es/~nacho/docencia/ing_ond_1/trabajos_02_03/Acustica_arq
uitectonica/practica/MATLAB.HTML
201
9.
“Diseño
de
filtros
sencillos”.
http://www.ingelec.uns.edu.ar/pds2803/Materiales/Cap10/10-Cap10.pdf
10.
“Bancos
de
filtros
digitales”.
http://catarina.udlap.mx/u_dl_a/tales/documentos/lem/madrid_q_a/capitulo_5.html#
Descargar