Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DIGITAL DE SEÑALES
PRÁCTICAS DE INTRODUCCIÓN AL
PROCESADO DIGITAL DE SEÑALES.
Curso 2009-2010
marcelino.martinez@uv.es
emilio.soria@uv.es
jose.v.frances@uv.es
LABORATORIO:
Práctica 1.- Introducción al programa MATLAB.
Práctica 2.- Muestreo de Señales.
Práctica 3.- Cuantificación.
Práctica 4.- Convolución y ecuaciones en diferencias
Práctica 5.- Sesión 1. Mini-proyecto de IPDS
Práctica 6.- La transformada Z
Práctica 7.- Sesión 2. Mini-proyecto de IPDS
Práctica 8.- Respuesta en frecuencia de los sistemas discretos
Práctica 9.- Sesión 3. Mini-proyecto de IPDS
Práctica 10.- Práctica-resumen.
OBJETIVOS:
Los objetivos del módulo de laboratorio de Introducción al procesado digital de señales son que el alumno lleve a
la práctica los conceptos adquiridos en el módulo teórico, implementado algoritmos y construyendo sistemas de
procesado que sirvan de nexo de unión con la infinidad de aplicaciones prácticas que esta disciplina tiene en la
actualidad.
BIBLIOGRAFÍA BÁSICA:
MÉTODO DE EVALUACIÓN:
Módulo de laboratorio:
Se realizará un examen, para los alumnos que asistan al laboratorio, en la sesión número 10, cuyo valor será el 50%
de la nota de laboratorio. El 50% restante se obtendrá de la evaluación continua de cada una de las sesiones (10 %) y
de la realización de un mini-proyecto (40%).
Habrá un examen de laboratorio, el día de la convocatoria oficial, al que podrán presentarse los alumnos que no
hayan asistido a las sesiones de laboratorio o que deseen mejorar su nota que constituirá el 100% de la nota de
laboratorio.
2
PRÁCTICA I: INTRODUCCIÓN AL MATLAB.
Esta primera sesión, a diferencia de las demás, es una práctica completamente guiada para que
el alumno se familiarice con el programa Matlab que se utilizará para el resto de prácticas.
En primer lugar es conveniente revisar alguno de los manuales sobre este programa que se
encuentran en la página web de la asignatura (www.uv.es/~martsobm)
Desde el prompt Matlab funciona como una calculadora realizando las operaciones que se le
indique y mostrando el resultado, si introducimos 3+4*8 nos muestra el resultado, 35 que se
almacena en una variable generada automáticamente llamada ans que contiene el resultado
(answer) de la última operación.
>> 3+4*8
ans =
35
Además de estas operaciones básicas, Matlab tiene infinidad de funciones y comandos que
permiten realizar tareas específicas de todo tipo. Estas funciones se encuentran agrupadas
formando librerías (Toolboxes). De las mútiples librerías existentes nos centraremos en la
librería de Signal Processing.
Un ejemplo de comandos de Matlab son pwd y cd-. Podemos obtener información de
cualquier comando utilizando la instrucción help. Así si escribimos en el prompt
ans =
3
c:\users\marsel
• Utiliza el comando chdir para situarte en el directorio que has creado anteriormente
>>cd(‘c:\ipds\martinez’)
Matlab (MATrix LABoratory) está optimizado para trabajar con matrices de datos por lo que
prestaremos especial atención a este tipo de datos y sus operaciones.
Definicion de variables.
Podemos definir variables asignándoles un valor:
>> x=5, y=7;
x =
5
Cuando una asignación acaba con ‘;’ no se muestra el resultado por pantalla pero la variable
esta definida y puede utilizarse en operaciones posteriores
>> z=x+y
z =
12
Hay una serie de variables que Matlab tiene definidas por defecto como son: pi, j, i, inf(valor
máximo representable) , NaN (el resultado no es un número ej 0/0), etc. Estas variables
conservan su valor original si el usuario no las modifica; es decir si escribimos
>> pi
ans =
3.1416
Pero si realizamos una nueva asignación
>> pi=33
pi =
33
dejará de tener su valor original. Las variables i, j originalmente representan a la unidad
imaginaria
Para declarar vectores procedemos de igual forma pero los elementos de un vector se
escribirán entre corchetes separados por comas o espacios en blanco para un vector fila y
separados por ‘;’ para un vector columna
>> x1=[1 3,4], x2=[3;5;7]
x1 =
1 3 4
x2 =
3
4
5
7
Se puede transformar un vector fila en uno columna y viceversa utilizando el operador
traspuesta “ ’ ”.
>> y1=x1'
y1 =
1
3
4
>> y2=x2'
y2 =
3 5 7
ans =
5
EL ÍNDICE DEL PRIMER ELEMENTO DE UN VECTOR ES EL 1. SI SE INTENTA
ACCEDER A UN ELEMENTO CON UN INDICE 0 O NEGATIVO SE PRODUCE UN
ERROR.(no confundir con el lenguaje C)
>> x2(0)
??? Subscript indices must either be real positive integers or
logicals.
Para definir una Matriz procedemos de forma similar a un vector, separando los elementos de
una fila por comas o espacios en blanco y las columnas ‘ ; ’
>> A=[1 2 5;3,6,4;1+j,3-j 1]
A =
Para acceder a los elementos de una matriz procedemos de la misma forma que para un vector
pero en este caso hemos de indicar con un índice el número de fila y con otro el de columna.
>> A(3,2)
ans =
3.0000 - 1.0000i
>> b=A(2,2)
b =
6
5
También se pueden generar matrices uniendo vectores
>> P=[x1;x2';[7 9 5]]
P =
1 3 4
3 5 7
7 9 5
Obsérvese que como x2 lo habíamos definido como un vector columna será necesario
trasponerlo, de lo contrario se producirá un error
>>P=[x1;x2;[7 9 5]]
??? Error using ==> vertcat
All rows in the bracketed expression must have the same
number of columns.
y1 =
1
3
4
>> y1(2)=[]
y1 =
1
4
El elemento indicado se elimina y desplaza al resto.
Se pueden realizar operaciones aritméticas sobre los datos con los operadores
+, -, *, /, ^ (potencia), para matrices además se puede calcular la inversa (inv), determinante
(det), etc. Cuando estas operaciones se realizan sobre matrices es necesario que las
dimensiones sean las correctas
>> x1*x2
ans =
46
>> x2*x1
ans =
3 9 12
5 15 20
7 21 28
>> x1+x2
??? Error using ==> +
Matrix dimensions must agree.
>> A*B
ans =
>> inv(A)
ans =
>> det(A)
ans =
11.0000 -33.0000i
>> B/A
ans =
>> B*inv(A)
ans =
En ocasiones nos interesa realizar operaciones entre elementos o matrices pero no como están
definidos habitualmente sino indicando que queremos que se realicen elemento a elemento
esto se lleva a cabo precediendo el operador por un punto así tendremos los operadores ./, .*,
.^
>> A.^2
ans =
7
>> A^2
ans =
El Operador “:”
Un operador muy empleado en los programas es “:”, que genera un secuencia de valores entre
el valor inicial y el final con el incremento especificado. Su formado es, inicio:incremento:fin.
Si no se especifica el incremento se considera de valor 1. El incremento no necesita ser
entero,
>> pares=0:2:9
pares =
0 2 4 6 8
>> impares=1:2:10
impares =
1 3 5 7 9
>> x=-1:0.25:1
x =
También se puede utilizar este comando para acceder a los elementos de una matriz. En este
caso si únicamente se indica el operador “:” indica que se toman todos los elementos de la fila
o columna
>> A(:,1)
ans =
1.0000
3.0000
1.0000 + 1.0000i
>> A(1:2,2:2)
ans =
2
6
• Verifique qué operaciones realizan los siguientes comandos:
>> B(:,1)=[1;9;2];
>>B(1:2:3,:)=[]
8
>>B=magic(4)
>>B([1 3],1)
Todas las variables que hemos ido declarando se almacenan en el espacio de trabajo de
Matlab (workspace) la memoria del ordenador. Podemos ver las variables definidas utilizando
los comandos who y whos, cuya única diferencia está en la información que proporcionan
>> whos
Name Size Bytes Class
Las variables se pueden borrar con la instrucción clear. La sentencia siguiente borra las
varibles indicadas
>>clear x y z
>>clear
>>whos
>>load variables
>>whos
9
Scripts.
Hasta ahora nos hemos limitado a introducir órdenes en la línea de comandos, que no resulta
operativo cuando hemos de realizar un gran número de operaciones en determinado orden. La
alternativa es escribir un programa, que Matlab se denomina script, y que no son más que una
secuencia de comandos almacenados en un fichero de texto que al ser llamado desde Matlab
se ejecutará línea a línea en el orden que aparece en el programa.
.
Los ficheros de texto se pueden crear con cualquier editor de texto, si bien, Matlab lleva su
propio editor integrado.
• Abra un nuevo script (File --> New -->Mfile) y escriba el siguiente código
%Mi primer script. Esto es un comentario
%Vamos a realizar un programa para representar gráficamente las
%ecuaciones y=x, y=2x e y=x/3+0.5
Almacene el fichero en el directorio que creó al iniciar la sesión con el nombre primero.m
(todos los scripts de Matlab tiene la extensión *.m)
>> primero
>> plot(x(2:2:end),y2(2:2:end))
Otra forma de superponer 2 gráficas en una misma figura, como se ha hecho en el ejemplo
anterior, es utilizando el comando hold.
10
• Copie las siguientes líneas de código en el programa anterior
En los programas anteriores hemos aprendido a poner leyendas en los ejes y títulos con las
instrucciones xlabel, ylabel y title.
Es posible representar varias gráficas en una misma figura dividiendo la figura en diferentes
subventanas para ellos se utiliza el comando subplot(XYN).
Veamos que esto es muy sencillo. Las siguientes figuras muestran los parámetros de llamada
del comando subplot para cada una de ellas.
11
1 1 1
0.9 0.9
0.7 0.7
0.6 0.6
122 0
121 0 0.2 0.4 0.6 0.8 1
0.5 0.5
0.4 0.4 1
0.3 0.3
0.1 0.1
0 0 0
0 0.5 1 0 0.5 1 0 0.2 0.4 0.6 0.8 1
1 1 1
0 0 0
0 0.5 1 0 0.5 1 0 0.2 0.4 0.6 0.8 1
1 1 1 1
0 0 0 0
0 0.5 1 0 0.5 1 0 0.5 1 0 0.5 1
• Copie el siguiente código que le permite hacer una representación en varias ventanas:
12
#
!&"
!!&"
!#
! " #! #" $! $" %! %"
!&"
!!&"
!#
! " #! &'()*'+,-+,./0*0+*1-,0*
#" $! $" %! %" '!
%!
$#
456!74
$!
!
! !"# $ $"# %
23,/),-/10
%!!
456!746(97
!%!!
!8!!
! !"# $ $"# %
23,/),-/10
Una característica de los scripts es que las variables que se definen durante su ejecución
permanecen en el espacio de entorno una vez ha finalizado la ejecución del programa.
A continuación veremos las funciones, que no son más que una porción de código que realiza
una tarea determinada, exactamente igual que en lenguaje C.
Funciones:
Una función en Matlab es un segmento de código como el que se indica a continuación:
Los parámetros de llamada pueden ser variables definidas en el espacio de entorno o valores
numérico introducidos directamente. Tanto las variables de llamada como los parámetros
devueltos no tienen que coindicir con las variables utilizadas en la declaración de la función
ya que únicamente se copian los valores. En este caso las variables cociente y resto se copian
en las variables a y b respectivamente.
La principal diferencia con un script es que las variables internas utilizadas en la función (coc
y resto en este caso), no permanecen en el espacio de entorno al retornar de la función.
La forma más sencilla de escribir una función es partir de un script y una vez verificado su
funcionamiento transformarlo en un función.
Las primeras líneas de comentarios que se incluyen en una función son las que nos muestra la
instrucción help. Si ejecutamos:
Vamos a escribir una función que nos permita representar gráficamente la función
en un intervalo elegido por el usuario
Si queremos representar la gráfica en el intervalo [-5,6] con 1000 puntos solo hemos de
escribir en el prompt de Matlab
>> [x,y]=representa(-5,6,1000);
14
12+32425.67-8592592,9-5.23:6,89;!<9=9!>
%
$&'
$&!
$&"
$&#
)*+,-./0
$
!$&#
!$&"
!$&!
!$&'
!%
!! !" !# $ # " !
(
>> representa(-5,6,1000);
LASFUNCIONES PUEDEN SER LLAMADAS DESDE UN SCRIPT U OTRA FUNCIÓN, SOLO HEMOS DE
CONOCER LOS PARÁMETROS DE LLAMADA Y LOS PARAMETROS DEVUELTOS.
Las librerías de Matlab están formadas por múltiples funciones que realizan tareas
específicas. Nosotros podemos crearnos nuestras propias funciones para reutilizar código en
las prácticas.
Ejemplo de utilización
>> [fi,co]=size(B)
fi =
co =
15
4
Todas las funciones de Matlab tienen un conjunto de parámetros de llamada, que se indican
entre paréntesis y un conjunto de parámetros devueltos que se indican entre corchetes cuando
son más de uno, de esta forma pueden utilizarse y recoger sus resultados. Exactamente igual
que las funciones definidas por el usuario.
Otras funciones relacionadas con el procesado que utilizaremos en las siguientes prácticas
son: zplane, filter, roots, poly, residuez, conv, xcorr, freqz, impz, etc
Operadores relacionales
Operadores Lógicos.
Ejemplo:
>> x=1:5
x =
1 2 3 4 5
>> b=x>2
b =
0 0 1 1 1
>> c=gt(x,2)
c =
16
0 0 1 1 1
>>
Sentencia condicional
if A > B
disp([num2str(A) ' es mayor que ' num2str(B)])
elseif A < B
disp([num2str(A) ' es menor que ' num2str(B)])
elseif A == B
disp([num2str(A) ' es igual que ' num2str(B)])
else
disp('Situacion no esperada')
end
Bucles:
%Bucle for
%Repite la ejecucion un numero fijo de veces
x(1)=0.3;
x(2)=0.5*x(1);
for n = 3:32
x(n)=0.5*x(n-1)+.3*x(n-2)
end
%Bucle while
%Repite un el bucle mientras la condicion sea cierta.
a = 0; fa = -Inf;
b = 3; fb = Inf;
error=1e-10;
while b-a > error*b
x = (a+b)/2;
fx = x^3-2*x-5;
if sign(fx) == sign(fa)
a = x; fa = fx;
else
b = x; fb = fx;
end
end
%La solucion es x = 2.0946
Solución:
clear
17
close all
N=input('Introduce un numero entero ');
n=1;
%n es indice para almacenar los elementos de la secuencia en un vector
n=1;
secuencia(n)=N; %En esta variable almacenamos la secuencia generada
while(N~=1) %tambien podemos poner (ne(N,1))
[coc,resto]=div_entera(N,2);
if(resto==0)
N=N/2;
else
N=3*N+1;
end
n=n+1; %Incrementamos el indice de la secuencia
secuencia(n)=N; %Almacenamos el nuevo valor
end
secuencia %Sacamos la secuencia por pantalla
Ejercicio:
Transforme el programa anterior en un función a la que se le pase como parámetro N y
devuelva la secuencia generada.
Solución:
%Funcion sin ayuda
function [secuencia]=gen_secu(N)
n=1;
%n es indice para almacenar los elementos de la secuencia en un vector
n=1;
secuencia(n)=N; %En esta variable almacenamos la secuencia generada
while(N~=1) %tambien podemos poner (ne(N,1))
[coc,resto]=div_entera(N,2);
if(resto==0)
N=N/2;
else
N=3*N+1;
end
n=n+1; %Incrementamos el indice de la secuencia
secuencia(n)=N; %Almacenamos el nuevo valor
end
%Guardamos en fichero con el nombre gen_secu.m
>> y =gen_secu(5)
18
2.-Una secuencia Chirp está definada como:
con n=0:Npuntos-1
x=GenChirp(A,r,fd,incremento,Npuntos,fase_inicial)
19
PRÁCTICA II: MUESTREO
En esta práctica se estudiarán las consecuencias del teorema de muestreo, haciendo especial
hincapié en los efectos que se pueden producir si se muestrea una señal con la frecuencia
demasiado baja.
1) Genera dos períodos correspondientes al muestreo de una sinusoide (coseno) analógica de
frecuencia 200 Hz, amplitud 1 y frecuencia de muestreo 1 kHz.
2) Realiza la misma operación que en el apartado 1) pero ahora la sinusoide a muestrear es de
1’2 kHz (el mismo número de puntos).
3) Representa en una misma figura las señales obtenidas en los apartados anteriores, ¿qué
ocurre?, ¿qué consecuencias sacas de las gráficas?.
4) Se estudiará el efecto del muestreo sobre el espectro de la señal. Genera un segundo de una
sinusoide discreta de frecuencia 100 Hz y una amplitud de 1 con un período de muestreo
de 1 ms. Representa el espectro de la señal usando:
APLICACIÓN PRÁCTICA I
• Genera 88.000 muestras de una sinusoide de frecuencia F=300 Hz muestreada a
44100Hz y escúchala con la instrucción sound.
• Repite el apartado anterior sustituyendo la sinusoide por una onda cuadrada. ¿Qué
diferencias aprecias?
APLICACIÓN PRÁCTICA II
20
PRÁCTICA III: CUANTIFICACIÓN.
xq=quanti(x,N,m)
1. Sin utilizar la función quanti, determina cuáles serán los valores obtenidos al cuantificar
por redondeo las 5 primeras muestras de una sinusoide de amplitud 3V, frecuencia 20 Hz y
frecuencia de muestreo 100Hz, si se emplea un conversor bipolar de intervalo de entrada
±3 V de 4 bits. Repite el proceso si el conversor cuantifica por truncamiento.
4. Efecto de la cuantificación sobre una señal de audio. Para ello vamos a utilizar el fichero
p44100.wav. Lee dicho fichero con la instrucción [y,Fs,bits]=wavread('p44100.wav'); y
escucha su contenido con sound(y,Fs). Repite el proceso cuantificando la señal a 8, 4, 3 y 2
bits. (Utiliza como valor de m el valor máximo en valor absoluto de y). ¿A qué se debe el
ruido que se escucha ?, ¿ se podría resolver este problema aumentando la frecuencia de
muestreo ?.
21
PRÁCTICA IV: CONVOLUCIÓN Y ECUACIONES EN DIFERENCIAS
a. Escribe las ecuaciones en diferencias que te permiten calcularla salida del sistema a
partir de la entrada.
b. Calcula la salida a partir de las ecuaciones en diferencias utilizando como entrada la
señal contenida en el fichero ecg.mat (Frecuencia de muestreo 1kHz) y visualízalas.
Dibuja en otra figura el espectro de la señal de entrada y salida superpuesta con
distinto color.
c. Repite el apartado anterior utilizando la instrucción filter para calcular la salida
tomando para , ,
d. ¿Qué efecto tiene sobre la señal la modificación del parámetro α?
3. CORRELACIÓN.
En este apartado se va a usar la autocorrelación para encontrar posibles periodicidades
dentro de una señal. Utilizaremos la serie de datos sobre la aparición de manchas en la
superficie solar durante los años 1700 hasta el 1995 (fichero sunspots.dat). Cada una de las
muestras se ha tomado con un período de 1 mes. Calcula la autocorelación de la señal e
interpreta los máximos de la serie obtenida; ¿existe algún periodo en la señal que se pueda
destacar?.
El fichero radar.mat contiene la señal original (original) enviadas por el sistema detector y el
eco recibido tras localizar un objeto (echo). Usa la correlación cruzada entre las dos señales y,
sabiendo que se han usado ondas electromagnéticas (velocidad luz=300000 km/s) y una
frecuencia de muestreo de 100 kHz determina la distancia a la que se encuentra el objeto.
22
Sesión 1. Mini Proyecto de Introducción al Procesado Digital de Señales.
23
PRÁCTICA VI: TRANSFORMADA Z.
1.-Un sistema digital tiene como respuesta impulsional la serie infinita h(n) definida como:
ii)
3. Los sistemas digitales definidos por las dos ecuaciones en diferencias siguientes se
conectan en cascada.:
Utilizando la instrucción filter, determina la salida intermedia y la salida total del sistema,
para la dos posibles conexiones en cascada de estos sistemas. La señal de entrada se encuentra
almacenada en el fichero ecg50.mat. Comenta los resultados obtenidos. ¿Qué hace cada uno
de estos filtros ?
24
Sesión 2. Mini Proyecto de Introducción al Procesado Digital de Señales
25
PRÁCTICA VII: RESPUESTA EN FRECUENCIA DE LOS SISTEMAS DISCRETOS
Primera Parte
Ejecuta la demo desde Matlab (versión 6.5) colocándote en la carpeta en la que has
descomprimido los ficheros y ejecutando el script pezdemo.m
Esta demostración ilustra la relación entre el diagrama de polos y ceros de un sistema con su
respuesta impulsional y su respuesta en frecuencia.
1) Coloca un cero (o un par complejos conjugados) en ω=0 y observa qué ocurre cuando
mueves (pincha con el ratón sobre él y arrastra) dicho cero variando su módulo,
manteniendo el ángulo.
2) Repite el apartado anterior variando el ángulo del cero. ¿ qué le ocurre a la respuesta en
frecuencia?, ¿Cuántos términos tiene la respuesta impulsional en los apartados 1 y 2) ?
3) Coloca un polo (o un par complejos conjugados) en w=0 y observa qué ocurre cuando
mueves (pincha con el ratón sobre él y arrastra) dicho polo variando su módulo,
manteniendo el ángulo, ¿Si el polo tiene modulo mayor que la circunferencia unidad que
valores toma la respuesta impulsional ?
4) Repite el apartado anterior pero variando el ángulo.(ω)
5) Cuántos términos tiene la respuesta impulsional en los apartados 3 y 4.
6) Diseña un sistema que tenga 2 ceros sobre la circunferencia unidad con ángulo y dos
polos con el mismo ángulo pero con modulo algo menor para asegurar la estabilidad.
Observa la respuesta del filtro obtenido. ¿De qué tipo de filtro se trata?. Varia la distancia
del polo a la circunferencia unidad y observa la respuesta del sistema. ¿Qué efecto tiene la
distancia del polo a la circunferencia unidad?. ¿Qué ocurre si el cero no esta sobre la
circunferencia unidad ?
7) Utiliza la opción PZ que coloca un polo y cero que es su recíproco conjugado
, ¿qué forma tiene la respuesta en frecuencia en módulo?
Segunda Parte
a) Justifica dicha respuesta de acuerdo con la posición de los polos y los ceros de la
función de transferencia, utiliza la función zplane
b) ¿Cuál es la relación entre la posición del cero y el orden del promediado ?
c) Representa la respuesta en módulo en escala lineal y en dB para los dos sistemas
anteriores
2) Dibuja la respuesta en frecuencia en módulo, en escala lineal y en dB, y el diagrama de
polos y ceros para el siguiente sistema:
26
a) Si un sistema tiene un cero en una determinada frecuencia, que forma tendrá su
respuesta en frecuencia en dicha frecuencia. Qué ocurre si el cero se encuentra
exactamente sobre la circunferencia unidad.
b) Cuál es la forma más sencilla de que un sistema que diseñamos amplifique una
determinada frecuencia que se le aplique a su entrada.
4) Un “notch filter” se define como aquel sistema que presenta APROXIMADAMENTE la
siguiente respuesta en frecuencia (en módulo)
Implementa el sistema de orden 2 mediante ecuación en diferencias con wo= π/2. Comprueba
el funcionamiento considerando como entrada la señal con wa= 0, π/4, π/2,
3π/4. ¿Se podría implementar con un sistema de orden 1?
27
Sesión 3. Mini Proyecto de Introducción al Procesado Digital de Señales
28