Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DPFI
PRACTICA No. 2
NOVIEMBRE-05
INDICE
OBJETIVOS GENERALES:..................................................................................................3 DESARROLLO:.....................................................................................................................4 1. Acondicionamiento de la seal ECG..............................................................................4 1.2 Diseo del oscilador......................................................................................................7 RESULTADOS:..........................................................................................................9 DESEMPEO...........................................................................................................10 CONCLUSIONES: ..................................................................................................10 2. Diseo del filtro IIR......................................................................................................10 RESULTADOS:........................................................................................................14 DESEMPEO...........................................................................................................15 CONCLUSIONES:...................................................................................................16 3. Diseo del filtro FIR.....................................................................................................16 RESULTADOS:........................................................................................................19 DESEMPEO...........................................................................................................19 CONCLUSIONES:...................................................................................................20 BIBLIOGRAFIA...................................................................................................................21 ANEXO A. Cdigo fuente del oscilador...........................................................................22 ANEXO B. Cdigo fuente del filtro IIR...........................................................................23 ANEXO C. Cdigo fuente del filtro FIR..........................................................................25
OBJETIVOS GENERALES:
Comprobar de manera prctica el clculo, la implementacin y el funcionamiento, en el DSP TMS320C5402, de un oscilador tipo IIR de una determinada frecuencia; as como tambin de los filtros digitales tipo IIR y FIR. La seal de un oscilador diseado a 10 Hz, acta como una seal de ruido sobre una seal de electrocardiograma (ECG) previamente muestreada, el objetivo principal es disear dos diferentes filtros, IIR y FIR, para eliminar la seal de 10 Hz de la seal ECG. Observando ventajas y desventajas de cada uno de ellos.
DESARROLLO:
Dada una seal de electrocardiograma (ECG), suponer que cada ciclo de ECG corresponde a un segundo de tiempo. I.- Utilizando el DSP TMS320C5402 disear y realizar un oscilador del tipo IIR, a la seal senoidal con una SNR de 25 dB y 10 Hz.
La frecuencia de muestreo de la seal ECG se selecciono tomando en cuenta el nmero de ciclos en 5000 puntos, es decir:
fS = 5000 = 108.6956 , La cual se aproximo a f S = 110 Hz 46
3. Agregar la seal de salida del oscilador a la seal ECG. EL programa principal que ejecuto esto en el DSP es el siguiente.
DP= #sen SXM = #1 AR1 = #ecg AR2 = #sen BRC ; apunta a pagina de sen ; habilita extension de signo ; apuntador a la ECG ; apuntador a la salida del oscilador ; repite el ciclo para 1024 muestras
AR3 = #ecg_sen ; apuntador a la ECG mas la salida del oscilador = #(NP-1) A = *AR1+ A = A + *AR2+ ; suma seales *AR3+ = A FIN_SUM blockrepeat (FIN_SUM)
En la figura 1.2 es mostrada la salida producida por el programa anterior, en la cual se puede ver que por cada ciclo de la seal ECG hay aproximadamente 10 ciclos de la seal senoidal de ruido.
Los espectros de la seal ECG original y con ruido son mostradas en las Figura 1.3 y 1.4.
En la figura 1.4 se ve claramente la espiga de 10 HZ que ha sido agregada al espectro de la seal ECG.
a2 = 1
b0 = Asen( w0 )
0 = 2
f0 fS
Siendo f 0 la frecuencia de oscilacin y f S la frecuencia de muestreo. Si f 0 =10 Hz y f S = 110 Hz (la cual se aproxim tomando en cuenta la seal ECG) entonces:
0 = 2
10 Hz = 0.5712 110 Hz
Con lo que:
a1 = 2 cos(0.5712) = 1.6825
De acuerdo a las especificaciones de diseo la amplitud de la senoidal generada por el oscilador debe ser tal que:
PS SNR = 10 log P r = 25dB ,
Pr =
PS 10 2.5
1 N
Donde: PS =
x
i =0
N 1
( sen 2 w0 )tdt
De la que resulta, A = 2 Pr = 2(0.62055W ) = 1.1140V la cual se normaliza respecto al mximo valor de la ECG, es decir:
AN = A 1.1140 = = 0.010928 max( ECG ) 101.9434
Valor de amplitud que resulto muy pequeo respecto a la seal ECG, sobre todo para motivos de visualizacin, por lo que se opto a utilizar una amplitud de 7 la cual fue claramente visible y por la tanto la SNR = 10 log Con lo que finalmente:
AN = A 7 = = 0.068665 max( ECG ) 101.9434
y
b0 = Asen( w0 ) = (0.068665) sen(0.5712) = 0.037123
a 2 =1 (212 ) = 4096
b0 = 0.037123 ( 212 ) = 152
FIN_OSC Donde se observa que la salida del filtro para n = 0 es simplemente el valor del coeficiente b0 , ya que en este instante de tiempo la entrada impulsiva vale 1. Despus de calcular la primera salida del filtro, se realiza un bloque de repeticin de ciclo para NP igual a 1024 muestras y en donde se realizan las siguientes acciones: 1. Cargar AR2 con la direccin que apunta a la salida del filtro mas retardada, en esta caso para un retardo de 2.
2. Inicializar el acumulador A con cero, y ejecutar la instruccin macd(*AR2-, ai, A) para cada coeficiente ai 3. Actualiza el valor del la salida del filtro retardada en 1, la cual es el valor actual del filtro. 4. Almacena en memoria la salida actual del filtro.
RESULTADOS:
En la figura 1.2.1. Se muestran 110 puntos de la seal senoidal generada por el oscilador implementado en el DSP. En la cual se puede ver claramente una frecuencia de 10 ciclos en 110 puntos o 93 ciclos en 1024 puntos, la cual equivale efectivamente a una senoidal de 10 Hz si la frecuencia de muestreo es 110Hz.
DESEMPEO. EL consumo de memoria de la implementacin del oscilador en el DSP se resume en la Tabla 1.1.
Tabla 1.1. Consumo de memoria.
Cabe mencionar que se reservaron 1024 localidades de memoria de programa adicionales para almacenar la salida del oscilador. El ciclo principal del filtro se ejecuta en 110ns donde 60ns corresponden a la operacin de multiplicacin acumulacin que se ejecuta en 3 ciclos de instruccin, ya que solo se repite dos veces, y no da tiempo que comience el pipeline para que se ejecute en un solo ciclo de instruccin.
CONCLUSIONES: Una vez diseado el oscilador, implementarlo en el DSP result sencillo gracias a las instrucciones de repeticin de instruccin y la de multiplicacin acumulacin macd, las cuales permitieron la implementacin con tan solo 4 instrucciones, con un mnimo de memoria, y un tiempo de ejecucin pequeo que permite su implementacin para una gran variedad de aplicaciones en tiempo real, adems de que debido a la estructura del mismo basta con recalcular los coeficientes para poder generar una gran variedad de frecuencias dentro de los limites del DSP.
La funcin utilizada en matlab para el diseo del filtro es: [NUM,DEN] = IIRNOTCH(Wo,BW, Ab) la cual disea un filtro digital notch de segundo orden con la frecuencia de notch en Wo y un ancho de banda BW en el nivel Ab. Wo debe satisfacer 0.0 < Wo < 1.0, con 1 correspondiendo a pi radianes por muestra. 10
BW =
Donde f 0 es la frecuencia de notch, calidad del filtro. wo = 10/(110/2); bw = wo/25; [b,a] = iirnotch(wo,bw,3);
Cuya respuesta en frecuencia es mostrada en la figura 2.1, donde se puede ver que la frecuencia de notch esta en la frecuencia normalizada de de la espiga de 10 Hz es decir Wo = 0.1818 .
El espectro en frecuencia de la seal de salida del filtro es mostrada en la figura 2.2. Donde se aprecia claramente que la espiga de 10Hz ha sido casi completamente eliminada.
11
Figura 2.2. Espectro en frecuencia de la salida del filtro IIR (ECG filtrada).
En la figura 2.3 se muestra la seal de salida del filtro digital, donde se puede ver que la componente de ruido de 10 Hz ha sido prcticamente eliminada, con un mnimo de distorsin de la seal ECG original, por lo que se decidi utilizar los coeficientes b y a retornados.
Una vez obtenidos los coeficientes del filtro en matlab se normalizaron al formato Q12 para ser cargados en el DSP, los cuales son mostrados en la tabla 2.1.
12
En la cabecera del programa se inicializa el DSP y se inicializan los apuntadores a las seales de entrada y salida del filtro (almacenadas y para almacenar en el DSP). Dentro del bloque de repeticin de ciclo que se repite 1024 veces se lee la muestra actual de entrada, despus se calcula es la parte no recursiva del filtro, la cual simplemente consiste de:
13
1. Cargar AR3 con la direccin que apunta a la entrada del filtro mas retardada, en esta caso para un retardo de 2. 2. Inicializar el acumulador A con cero, y ejecutar la instruccin macd(*AR2-, bi, A) para cada coeficiente bi Enseguida se calcula la parte recursiva del filtro la cual es exactamente a la del filtro IIR que se utiliz como oscilador. Finalmente se almacena el resultado en memoria y se hace el ajuste final al formato Q12.
RESULTADOS: En la Figura 2.4 se ilustra la salida del filtro IIR implementado en el DSP la cual es bastante similar a la obtenida en la simulacin de matlab.
En la figura 2.5 se ilustra la salida del filtro IIR en el DSP sobrepuesta con la obtenida de la simulacin. En ella se puede apreciar que las diferencias son mnimas.
14
Figura 2.5 Seales de salida del filtro, una entregada por matlab y otra por el DSP.
DESEMPEO. EL consumo de memoria de la implementacin del filtro IIR en el DSP se resume en la Tabla 2.2
Tabla 2.2. Consumo de memoria.
Cabe mencionar que se reservaron 2048 localidades de memoria de programa adicionales para almacenar la entrada y salida del filtro IIR. El ciclo principal del filtro se ejecuta en 250ns donde 150ns corresponden a la operacin de multiplicacin acumulacin que se ejecuta en 3 ciclos de instruccin, que solo se repite dos veces para el calculo de la parte recursiva del filtro y tres para la no recursiva, por lo que no da tiempo que comience el pipeline en ningn caso, para que se ejecute en un solo ciclo de instruccin.
15
CONCLUSIONES: La implementacin del filtro IIR en el DSP fue relativamente sencilla al igual que oscilador, la nica diferencia fue que se agrego un segmento de programa para calcular la parte no recursiva del filtro, la cual requiri solo 4 instrucciones ms. Debido a que el orden del filtro fue de dos se consumi muy poca memoria de datos. El tiempo de ejecucin resultante fue muy pequeo, por lo que puede aplicarse sin ninguna dificultad al procesamiento de una seal ECG en tiempo real, y otras seales ms rpidas como audio, etc. El mayor inconveniente que se encontr en la implementacin de un filtro IIR sobre un DSP fue que para filtro de mayor orden, se presentan problemas de estabilidad, sobre todo, debido a la perdida de precisin al usar los formatos Q. Al comparar las respuestas obtenidas con el DSP y matlab, se observa que son muy pequeas, por lo que se puede considerar que la realizacin de filtros en DSP resulta de muy buen calidad cuando se utiliza como fija. Tambin cabe mencionar que gracias a que se utilizo un filtro notch para eliminar la espiga de 10 Hz, la cual se encuentra dentro de una zona del espectro de la seal ECG donde sus componentes contribuyen considerablemente, esta ltima se distorsion minimamente.
16
El espectro en frecuencia de la seal de salida del filtro es mostrado en la figura 3.2. Donde se aprecia claramente que la espiga de 10Hz ha sido casi completamente eliminada, pero en el proceso tambin se han atenuado componentes de la seal original
17
En la figura 3.3 se muestra la seal de salida del filtro digital, donde se puede ver que la componente de ruido de 10 Hz ha sido bastante atenuada, sin embargo se observa una pequea distorsin de la seal, adems del retardo caracterstico de aproximadamente 100 muestras. Una vez obtenidos los coeficientes del filtro en matlab se normalizaron al formato Q15 para ser cargados en el DSP, los cuales son mostrados en la tabla 3.1.
Figura 3.3. Salida del filtro FIR en matlab. Tabla 3.1. Coeficientes del filtro FIR.
1 0 -10 -25 -37 -37 -18 18 62 98 108 80 14 -73 -157 -203 -188
292 326 256 91 -128 -333 -454 -442 -284 -16 284 523 616 520 249 -123 -486
-141 319 704 888 804 464 -35 -543 -901 -992 -777 -317 253 758 103 9 100 5 662
3168 0 -922 -476 113 662 1005 1039 758 253 -317 -777 -992 -901 -543 -35 464 804
-141 -533 -743 -720 -486 -123 249 520 616 523 284 -16 -284 -442 -454 -333 -128
292 178 29 -106 -188 -203 -157 -73 14 80 108 98 62 18 -18 -37 -37
11
18
-24 -8 12
-14 -12 -5
-106 29 178
91 256 326
-25 -10 0
23 36 39
-12 -4 5
El ajuste a Q15 se realiz tomando en cuenta que la magnitud de los coeficientes que el programa en matlab entreg son mucho menores de uno, as como, la misma seal ECG, lo que asegur que no se desbordara el formato. El programa en el DSP que implementa el filtro anterior es el siguiente:
DP = #xn SXM = #1 AR1 = #buf_in AR2 = #buf_out BRC = #(NP-1) blockrepeat(FIN_IIR) A = *AR1+ @xn = A AR3 = #xe ; carga apuntador a las muetras de entrada repeat(#ORB), A = #0 macd(*AR3-, bi, A) *AR2+ = A>>15 FIN_IIR ; apunta a pagina de xn ; habilita extension de signo
En la cabecera del programa se inicializa el DSP y se inicializan los apuntadores a las seales de entrada y salida del filtro (almacenadas y para almacenar en el DSP). La parte restante del programa donde se implementa el filtro es similar a la parte no recursiva del filtro IIR. RESULTADOS: La salida de la ejecucin del programa anterior es mostrado en la figura 3.4, la cual como se observa es bastante similar a la obtenida en matlab. DESEMPEO. EL consumo de memoria de la implementacin del filtro FIR en el DSP se resume en la Tabla 3.2
Tabla 3.2. Consumo de memoria.
Memoria de Programa 15
19
401 416
Adicionalmente se reservaron 2048 localidades de memoria de programa para almacenar la entrada y salida del filtro FIR. El ciclo principal del filtro se ejecuta en 2070ns, donde 2010ns corresponden a la operacin de multiplicacin acumulacin que se ejecuta en un ciclo de instruccin, ya que el pipeline comienza despus de la sexta repeticin y la macd llega a ejecutarse en solo ciclo de instruccin.
CONCLUSIONES: La implementacin del filtro FIR fue sencilla, por las mismas razones que las de oscilador y filtro IIR. Pero el consumo de memoria de datos y tiempo de ejecucin no resultaron tan eficientes, debido al gran nmero de coeficientes para obtener una respuesta aceptable, la cual es de menor calidad que la respuesta del filtro IIR de solo segundo orden. La respuesta del filtro FIR aunque elimina casi por completo la espiga de 10 HZ introduce distorsiona la seal ECG ya que tambin atena los componentes en la vecindad de la espiga, adems del retardo caracterstico de los filtros FIR. Aun as el tiempo de ejecucin resultante, todava permite aplicar al filtro FIR, sin ninguna dificultad, al procesamiento de una seal ECG en tiempo real, y otras seales ms rpidas como el audio, etc.
20
BIBLIOGRAFIA.
[1] SPRA819 - Generation of a Sine Wave Using a TMS320C54x Digital Signal Processor (July 2004). [2] SPRA669 - TMS320C54x Digital Filters ( July 2000). [3] SPRA079-IIR Filter Design on the TMS320C54x DSP [4] Pgina de MATLAB. www.mathworks.com (May 1996)
21
NP
buf_out
.sect ".data"
xn
xe xb yn
ye yb
.word 0 .word 0
.sect ".coef"
ai
.word -2048*2 ; apuntador a los coeficientes de entrada .word 3445*2 .word 2048*2
bi
22
; apunta a pagina de sen_in ; habilita extension de signo ; carga apuntador a buffer de salida
BRC = #(NP-1) blockrepeat(FIN_OSC) AR2 = #ye ; carga apuntador a las muestras de salida repeat (#1), A = #0 macd(*AR2-, ai, A) @(yn+1) = A>>12 *AR3+ = A>>12 FIN_OSC
yn
ye yb
23
.sect ".coef"
; seccion de coeficientes
ai
; coeficientes no recursivos
bi
; coeficientes recursivos
** seccion de codigo .sect ".text" _c_int00 DP = #xn SXM = #1 ; apunta a pagina de xn ; habilita extension de signo
AR1 = #buf_in ; apunta a buffer de entrada AR2 = #buf_out ; apunta a buffer de salida
A = *AR1+ @xn = A
AR3 = #xe ; carga apuntador a las muestras de entrada actual y retardadas repeat(#ORB), A = #0 ; calcula parte no recursiva del filtro macd(*AR3-, bi, A)
AR4 = #ye ; carga apuntador a las muestras de salida retardadas repeat (#ORA), B = #0; calcula parte recursiva del filtro macd(*AR4-, ai, B)
A = A - B ; calcula salida actual del filtro @(yn+1) = A>>12 ; almancena y(n-1) *AR2+ = A>>12 FIN_IIR FIN nop goto FIN .end ; almacena resultado en memoria (formato Q12)
24
** seccion de datos
; orden filtro .word 0 .word 0 .word 0 .word 0 .word 0 (deben ser 200 localidades de memoria reservadas) ; apuntador a las muestras de entrada
xe xb
.sect ".coef"
bi .word 11 .word 5 .word -4 .word -12 .word -17 .word -17 .word -12 .word -2 .word 10 .word 19 .word 24 .word 21
25
.word 11 .word -3 .word -18 .word -29 .word -32 .word -24 .word -8 .word 12 .word 29 .word 39 .word 36 .word 23 .word 1 .word -21 .word -37 .word -42 .word -33 .word -15 .word 7 .word 26 .word 34 .word 32 .word 20 .word 4 .word -8 .word -14 .word -12 .word -5 .word 1 .word 0 .word -10 .word -25 .word -37 .word -37 .word -18 .word 18 .word 62 .word 98 .word 108 .word 80 .word 14 .word -73 .word -157
26
.word -203 .word -188 .word -106 .word 29 .word 178 .word 292 .word 326 .word 256 .word 91 .word -128 .word -333 .word -454 .word -442 .word -284 .word -16 .word 284 .word 523 .word 616 .word 520 .word 249 .word -123 .word -486 .word -720 .word -743 .word -533 .word -141 .word 319 .word 704 .word 888 .word 804 .word 464 .word -35 .word -543 .word -901 .word -992 .word -777 .word -317 .word 253 .word 758 .word 1039 .word 1005 .word 662 .word 113
27
.word -476 .word -922 .word 31680 .word -922 .word -476 .word 113 .word 662 .word 1005 .word 1039 .word 758 .word 253 .word -317 .word -777 .word -992 .word -901 .word -543 .word -35 .word 464 .word 804 .word 888 .word 704 .word 319 .word -141 .word -533 .word -743 .word -720 .word -486 .word -123 .word 249 .word 520 .word 616 .word 523 .word 284 .word -16 .word -284 .word -442 .word -454 .word -333 .word -128 .word 91 .word 256 .word 326 .word 292
28
.word 178 .word 29 .word -106 .word -188 .word -203 .word -157 .word -73 .word 14 .word 80 .word 108 .word 98 .word 62 .word 18 .word -18 .word -37 .word -37 .word -25 .word -10 .word 0 .word 1 .word -5 .word -12 .word -14 .word -8 .word 4 .word 20 .word 32 .word 34 .word 26 .word 7 .word -15 .word -33 .word -42 .word -37 .word -21 .word 1 .word 23 .word 36 .word 39 .word 29 .word 12 .word -8 .word -24
29
.word -32 .word -29 .word -18 .word -3 .word 11 .word 21 .word 24 .word 19 .word 10 .word -2 .word -12 .word -17 .word -17 .word -12 .word -4 .word 5 .word 11
DP = #xn SXM = #1
AR1 = #buf_in ; carga apuntador a buffer de entrada AR2 = #buf_out ; carga apuntador a buffer de salida
A = *AR1+ @xn = A
AR3 = #xe ; carga apuntador a las muetras de entrada repeat(#ORB), A = #0 macd(*AR3-, bi, A) ; calcula el filtro
*AR2+ = A>>15 ; almacena resultado en memoria(formato Q15) FIN_FIR FIN nop goto FIN .end
30
31