Código MATLAB

Propaganda
Processamento Digital de Sinais
Engenharia Biomédica
2º Semestre 2009/2010
Processamento de Sinais Biomédicos
27 de Abril de 2010
Grupo 10
Joana Nunes
Nº 58497
João Marques
Nº 58513
1. Visualização do sinal de EOG
Analisa-se neste trabalho um sinal de EOG obtido através de movimentos
laterais dos olhos. Para além do sinal de EOG são também conhecidos os instantes de
tempo em que são dadas instruções para movimentos dos olhos.
Na Figura 1 estão representados os dois sinais provenientes desta análise.
Figura 1. Sinal t, representativo dos instantes de tempo em que foram dadas instruções para mover os
olhos (em cima); Sinal de EOG (em baixo).
É facilmente identificável através dos gráficos a relação temporal entre os
instantes em que são dadas instruções e os instantes em que se verifica movimento no
sinal de EOG. O código referente a esta alínea encontra-se no script visuzalizacao.m.
Código MATLAB
%visualização do sinal de eog e dos tempos em que foram dadas as
ordens de
%movimento
figure;
subplot(2,1,1); plot(t);
subplot(2,1,2); plot(eog);
1
Trabalho 4
Processamento de Sinais Biomédicos
Processamento Digital de Sinais
2. Remoção do ruído através da utilização de um filtro linear.
Nesta alínea, optou-se por utilizar um filtro de atraso de grupo constante, já que
o filtro de Butterworth, por exemplo, pode induzir atrasos diferentes para diferentes
frequências, o que resulta na saída distorcida quando a entrada é um sinal contido na
banda de passagem. Este filtro é conseguido através da função FIR1, que recebe como
argumentos a ordem do filtro (10) e a frequência de corte pretendida (𝜋/2). Esta
frequência de corte é particularmente importante já que se está a tentar eliminar ruído de
banda larga quando o sinal pretendido é também de banda larga. O resultado obtido
encontra-se na Figura 2. O código utilizado encontra-se no script filtro_2.m
Figura 2. Sinal de EOG obtido após filtragem com um filtro de atraso de grupo constante
Código MATLAB
%Filtro
B=FIR1(10,.5);
filt=filter(B,1,eog); %filtragem
figure;
plot(filt);
3. Remoção da componente DC do sinal.
Para remover a componente DC do sinal recorreu-se a uma moving window, de
tamanho escolhido por nós igual a 25. Para tal, atribui-se a cada posição do array de
valores a seguinte expressão:
𝑟(𝑖) = 𝑓𝑖𝑙𝑡(𝑖) − 𝑚𝑒𝑎𝑛(𝑓𝑖𝑙𝑡(𝑖 − 𝑛: 𝑖 + 𝑛))
Aqui, 𝑟 é o vector de resposta, 𝑓𝑖𝑙𝑡 é o vector que contém o sinal de EOG filtrado, e 𝑛
corresponde ao tamanho da janela (25). O resultado obtido encontra-se na Figura 3. O
código utilizado encontra-se no script dc_3.m
2
Trabalho 4
Processamento de Sinais Biomédicos
Processamento Digital de Sinais
Figura 3. Sinal filtrado sem componente DC
Código MATLAB
%Filtro
B=FIR1(10,.5);
filt=filter(B,1,eog);
%Remover DC
n=25;
l=length(filt);
if n>=l %caso em que se tem a media do vector total
r=filt-mean(filt)*ones(l,1);
else
r=zeros(l,1);
for i=1:1:n+1;
r(i)=filt(i)-mean(filt(1:n+i));
end
for i=l-n+1:1:l;
r(i)=filt(i)-mean(filt(i-n:l));
end
for i=n+2:1:l-n;
r(i)=filt(i)-mean(filt(i-n:i+n));
end
end
figure;
plot(r);
4. Processamento do sinal de EOG.
Para processar o sinal de EOG, construiu-se um script que o percorre e detecta
as suas variações quer positivas quer negativas. Depois, apenas é necessário distinguir
entre variações de positivo para negativo (esquerda-direita) e negativo para positivo
(direita-esquerda). É necessário também, para o cálculo qualitativo da velocidade, saber
os instantes de tempo em que ocorrem os picos. O resultado obtido pode ser encontrado
na Figura 4.
3
Trabalho 4
Processamento de Sinais Biomédicos
Processamento Digital de Sinais
Figura 4. Resultados obtidos para o processamento do sinal de EOG
Pode observar-se nesta figura os diversos movimentos que já haviam sido
observados directamente a partir do EOG, bem como a sua duração, e
consequentemente a sua velocidade (que é inversamente proporcional à duração). O
código utilizado pode ser consultado no script processa_4.m
Código MATLAB
r1 = (r>11);%picos positivos
r2 = (r<-10);%picos negativos
s=r1-r2;%todos os picos
s(1:10)=0; %limpar o inicio do sinal que apresenta uma descontinuidade
i=1;
while i<=length(s)%percorrer todo o sinal
while s(i)==0 %avançar enquanto for 0
if i>=length(s)
return;
end
i=i+1;
end
if s(i)>0 %distinguir entre variaçoes positivas ou negativas
ev='Esquerda-Direita'; %registo do evento
max = r(i);
t1 = i;
while s(i)>0 %procurar o pico
if r(i)>max
max = r(i);
t1 = i;
end
i=i+1;
end
while s(i)==0 %passar enventuais valores nulos
i=i+1;
end
min = r(i);
t2 = i;
while s(i)<0 %procurar o pico
if r(i)<min
min=r(i);
t2=i;
end
i=i+1;
end
fprintf([ev ' deltaT= %d; 1/deltaT= %g\n'],t2-t1,1/(t2-t1));
%print
4
Trabalho 4
Processamento de Sinais Biomédicos
Processamento Digital de Sinais
else
ev='Direita-Esquerda'; %registo do evento
min = r(i);
t1 = i;
while s(i)<0 %procurar o pico
if r(i)<min
min=r(i);
t1=i;
end
i=i+1;
end
while s(i)==0 %passar enventuais valores nulos
if i>=length(s)
return;
end
i=i+1;
end
max = r(i);
t2 = i;
while s(i)>0%procurar o pico
if r(i)>max
max = r(i);
t2 = i;
end
i=i+1;
end
fprintf([ev ' deltaT= %d; 1/deltaT= %g\n'],t2-t1,1/(t2-t1));
%print
end
end
5
Download