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