Introducao
Introducao
Introducao
Sumário
Introdução a sinais....................................................................................................................................................1
Conceitos básicos.................................................................................................................................................1
Descrição no domínio do tempo............................................................................................................................... 5
Descrição no domínio da frequência...................................................................................................................... 11
Descrição no domínio do tempo-frequência........................................................................................................... 12
Descrição no domínio da escala.............................................................................................................................14
Sinais são a matéria-prima do processamento de sinais. Processos naturais, com ou sem ação humana,
produzem sinais analógicos. Sinais analógicos ocorrem de forma contínua sobre um intervalo de tempo e/ou
espaço. O modelo matemático de um sinal analógico é uma função definida sobre uma parte da reta real.
O condicionamento de sinais analógicos usa circuitos analógicos para adquirir, amplificar, filtrar e transmitir
esses sinais. Muitas vezes, especialmente desde a década de 1980, um processamento digital pode ser
necessário. Sistemas para processamento digital de sinais oferecem várias vantagens: maior imunidade ao
ruído; maior flexibilidade na implementação; melhor capacidade de produção em massa; e menor custo. Sinais
analógicos podem ser convertidos para sinais digitais através de um processo de digitalização.
Em contraste com sinais analógicos, sinais discretos possuem valores somente em pontos isolados. Sua
representação matemática é uma função sobre os números inteiros: uma sequência. Se os valores dos sinais
são precisão finita, sendo assim passíveis de armazenamento em registradores com um dado número de bits,
o sinal discreto é mais exatamente chamado por sinal digital.
Introdução a sinais
Nossa abordagem inicial, na apresentação dos conceitos de sinais e seu processamento, será empírica,
através de simulações no MATLAB. Veremos que uma abordagem intuitiva ao processamento de sinais é
inerentemente limitada. Em algumas oportunidades, seremos capazes de observações técnicas sobre a melhor
escolha de uma ferramenta matemática, na solução de um problema de análise de sinais. Com o avanço do
curso, considerações mais abstratas da teoria de sinais serão apresentadas.
Conceitos básicos
Sinais podem ser simbólicos ou numéricos. Nesse curso serão abordados sinais que podem ser quantificados
através de uma variável numérica. Sinais contínuos serão representados como uma função no tempo t, de
maneira que é o valor do sinal x no tempo t. O sinal pode variar com uma outra variável espacial, porém
em ambos os casos o domínio é um subconjunto dos números reais. Nesse caso, é um sinal analógico.
Um exemplo de um sinal analógico é o sismograma, que é uma gravação do movimento vibratório durante um
terremoto. Um instrumento de precisão, chamado sismógrafo, é capaz de medir deslocamentos da ordem de
1 m, produzindo um sismograma em uma fita de papel sobre um tambor rolante. A Figura 1 representa os
dados obtidos durante o terremoto de Kobe, no Japão, em 1995. Essas medidas foram feitas na Universidade
1
da Tasmânia, em Hobart, Austrália, em 16 de janeiro de 1995, começando às 20:56:51, com um tempo de
registro de 51 min.
Sismologistas analisam esses sinais de várias maneiras. A deflexão total da pena sobre o gráfico é útil na
determinação da magnitude do tremor. Três tipos de ondas são registrados: as ondas primárias P, secundárias
S e as ondas de superfície. As ondas P são compressivas (longitudinais) e chegam primeiro, seguidas das
ondas S que são transversais. Por fim as ondas de superfície, de grande amplitude são registradas no traço.
Esse exemplo ilustra bem a necessidade do processamento de sinais. O processamento é necessário para
remover ruído. Esse ruído pode ser gerado por atividades humanas, como o deslocamento de veículos
pesados, ou por fontes naturais, como a arrebentação de ondas na praia. No sinal da Figura 1, as ondas
P estão "enterradas" em um ruído de fundo e não podem ser observadas.
2
O intervalo de tempo entre a incidência das ondas P e S é crítico na localização do epicentro do tremor. Essas
ondas são geradas simultaneamente durante um terremoto, porém viajam com velocidades médias distintas
pela crostra terrestre. Assim, uma medida do seu intervalo se traduz para uma estimativa da distância entre o
sismógrafo e o epicentro. Assim, com três sismógrafos em locais distintos, é possível localizar o epicentro.
Por razões de ordem científica, econômica e de segurança pública, a interpretação de sinais sísmicos é uma
área muito importante da análise de sinais, com muitas técnicas sendo pioneiramente usadas nesse campo.
Sinais também podem ser fenômenos discretos, que ocorrem em instantes distintos no tempo, sobre intervalos
não contínuos. Então o domínio é um subconjunto dos inteiros n e o sinal é um sinal discreto. Sinais
discretos são uma construção teórica, na prática eles são representados com uma precisão binária finita em
computadores digitais, sendo então chamados de sinais digitais.
Muitos processos produzem mais de um sinal mensurável como uma função de uma mesma variável
independente. Embora cada um desses sinais possa ser tratado individualmente, pode ser mais útil agrupar
todos os sinais, como em um vetor. Sinais assim são chamados de multicanais. Por exemplo, um sinal
analógico possui N canais, de forma que .
O eletromielograma (EMG) é um sinal biomédico que representa a excitação elétrica sobre a musculatura
esquelética. Ele costuma ser adquirido através de múltiplos eletrodos em diferentes grupos musculares, sendo
usado no diagnóstico de doenças neuromotoras. A Figura 2 traz um exemplo de três canais, dentre oito, de um
EMG multicanal.
load EMGdata
fs = 1000;
t = ((0:size(data,1) - 1)/fs)';
figure(2)
clf("reset")
subplot(3,1,1)
plot(t,data(:,1),"LineWidth",2)
title("Figura 2 — Sinal de EMG."), axis tight, grid on
ylabel("$x_1(t)$ (mV)","Interpreter","latex")
subplot(3,1,2)
plot(t,data(:,2),"LineWidth",2)
title("Figura 2 — Sinal de EMG."), axis tight, grid on
ylabel("$x_2(t)$ (mV)","Interpreter","latex")
subplot(3,1,3)
plot(t,data(:,3),"LineWidth",2)
title("Figura 2 — Sinal de EMG."), axis tight, grid on
ylabel("$x_3(t)$ (mV)","Interpreter","latex")
xlabel("$t$ (s)","Interpreter","latex")
3
Assim como na Figura 1, os sinais de EMG da Figura 2 também são digitais, porém a alta densidade de
amostras e a ferramenta de plotagem representam-no como um simulacro analógico.
Sinais também podem ser funções de mais de uma variável independente. Sinais sobre mais de uma variável
são chamados de multidimensionais. Apesar de images serem um exemplo clássico de um sinal bidimensional,
o processamento de sinais multidimensionais é comumente chamado de processamento de imagens. Imagens
podem ser analógicas ou digitais. Uma imagem bidimensional possui elementos chamados pixels (picture
element—elemento de imagem), enquanto imagens tridimensionais são separadas em voxels (volume element
—elemento de volume), por exemplo.
I = imread("cameraman.tif");
figure(3)
clf("reset")
imagesc(I)
colormap("gray")
xticks([]), yticks([])
title("Figura 3 — Imagem monocromática.")
4
O processamento de imagens está estreitamente relacionado à outras áreas, como Visão Computacional e
Robótica. Em nossos estudos, no intuito de apresentar os fundamentos matemáticos da forma mais simples
possível, serão trabalhados sinais unidimensionais e com um único canal. Apesar de não ser necessariamente
verdadeiro, vamos considerar que nossos sinais estão definidos sobre uma variável independente temporal.
Nem sempre é viável, ou mesmo possível, obter uma descrição exata no domínio do tempo. Processos
aleatórios produzem sinais com essa característica. Comumente, na prática do processamento de sinais,
temos sinais de interesse sobrepostos à ruído aleatório. A corrupção por ruído é prejudicial à interpretação e
análise do sinal.
Por exemplo, a Figura 4 traz um eletrocardiograma (ECG), que é um sinal biomédico de enorme importância
clínica. Sua correta interpretação é, literalmente, vital. Porém trata-se de um sinal fraco, cuja captação é
dificultada por uma série de fatores práticos. O ECG da Figura 4 está ruidoso, como pode ser visto pela
indefinição do seu traço. Ele também sofre com uma deriva da sua linha de base, que é um artefato comum
nas medidas de ECG, em resposta à tensões eletrostáticas.
load noisyecg
n = (0:length(noisyECG_withTrend) - 1)';
5
figure(4)
clf("reset")
plot(n,noisyECG_withTrend,"LineWidth",2)
grid on
xlabel("$n$ (amostras)","Interpreter","latex")
ylabel("$x(n)$","Interpreter","latex")
title("Figura 4 — Sinal ruidoso de ECG.")
Percebe-se também na Figura 4 que foi abandonado o simulacro analógico até então mantido. A
representação gráfica do sinal está indexada pelo próprio índice amostral. Também observa-se que as
unidades de estão implícitas, já que elas não têm influência no processamento em si. O sinal digital
é tratado como uma sequência de números, pura e simplesmente.
A regularidade o ECG nos oferece uma medida de frequência cardíaca, uma informação clínica relevante no
diagnóstico de braquicardia, taquicardia ou arritmias. Uma das formas mais simples de medir essa regularidade
é reconhecendo os picos dos complexos QRS. A função findpeaks pode ser utilizada para obter essa
regularidade de forma simples, como mostra a Figura 5.
[pks,locs] = findpeaks(noisyECG_withTrend,...
"MinPeakHeight",1);
figure(5)
clf("reset")
plot(n,noisyECG_withTrend,"LineWidth",2)
hold on
plot(locs,pks,"rv","MarkerFaceColor","r")
hold off
6
grid on
xlabel("$n$ (amostras)","Interpreter","latex")
ylabel("$x(n)$","Interpreter","latex")
legend("ECG","Picos")
title("Figura 5 — Deteção de picos.")
Como podemos ver na Figura 5, não há valor de limiar que pode ser usado na deteção dos picos que seja
capaz de detectar apenas o maior valor de cada complexo QRS. Assumindo uma frequência de amostragem
de 1 kHz, a frequência cardíaca, em batimentos por minuto (bpm), pode ser estimada por:
fs = 1e3;
reg = mean(diff(locs));
bpm = 60*fs/reg;
fprintf("A regularidade entre os picos é de %d amostras.",round(reg))
Como podemos ver, a maioria dos picos espúrios encontrados pelo findpeaks são resultado de rápidas
variações causadas pela presença de ruído de alta frequência. Podemos tentar resolver esse problema através
de um filtro média móvel, da forma
7
A largura da janela de média móvel, parametrizada por N, pode ser ajustada para melhores resultados,
visualizados na Figura 6.
N = 4;
h = ones(2*N + 1,1)/(2*N + 1);
filtECG = conv(noisyECG_withTrend,h);
[pks,locs] = findpeaks(filtECG,...
"MinPeakHeight",0.9);
reg = mean(diff(locs));
bpm = 60*fs/reg;
figure(6)
clf("reset")
plot(n,noisyECG_withTrend,"LineWidth",2)
hold on
plot(n,filtECG(1 + N:end - N),"LineWidth",2)
plot(locs,pks,"gv","MarkerFaceColor","g")
hold off
grid on
xlabel("$n$ (amostras)","Interpreter","latex")
ylabel("$x(n)$","Interpreter","latex")
legend("ECG original","ECG filtrado","Picos")
title("Figura 6 — Deteção de picos após filtragem.")
8
A regularidade entre os picos é de 375 amostras.
Como podemos ver, a filtragem média móvel melhora muito a qualidade do ECG, mas ainda é difícil obter um
par de valores para a largura do filtro média móvel e de altura mínima do pico que obtenha uma estimativa
confiável da frequência cardíaca.
depende de entradas futuras de . Embora isso não seja um problema para o sinal digital já armazenado,
isso não é uma opção para processamento digital em tempo real, ou processamento analógico. Com a mesma
parametrização, é possível propor um filtro média móvel alternativo, que não dependa de amostras futuras,
como:
A Figura 7 traz os resultados dessa filtragem em tempo real. Como pode ser visto, apesar de um sinal de
saída atrasado em relação ao sinal de entrada, que fica mais evidente para filtros mais longos, isso não altera
a análise para obtenção da frequência cardíaca.
N = 8;
h = ones(2*N + 1,1)/(2*N + 1);
filtECG = conv(noisyECG_withTrend,h);
[pks,locs] = findpeaks(filtECG,...
"MinPeakHeight",0.9);
reg = mean(diff(locs));
bpm = 60*fs/reg;
figure(7)
clf("reset")
plot(n,noisyECG_withTrend,"LineWidth",2)
hold on
plot(n,filtECG(1:end - 2*N),"LineWidth",2)
plot(locs,pks,"gv","MarkerFaceColor","g")
hold off
grid on
xlabel("$n$ (amostras)","Interpreter","latex")
ylabel("$x(n)$","Interpreter","latex")
legend("ECG original","ECG filtrado","Picos")
title("Figura 7 — Deteção de picos após filtragem causal.")
9
fprintf("A regularidade entre os picos é de %d amostras.",round(reg))
Como pode ser observado nas últimas análises, embora o ruído de alta frequência seja prejudicial à análise,
também há um sério problema com o desvio da linha de base do sinal. A função detrend permite a supressão
de um termo polinomial sobreposto ao sinal. A variável ord define a ordem do polinômio a ser removido. A
Figura 8 apresenta o resultado da análise com a filtragem e a correção da linha de base.
N = 5;
ord = 3;
h = ones(2*N + 1,1)/(2*N + 1);
x = conv(noisyECG_withTrend,h);
y = detrend(x,ord);
[pks,locs] = findpeaks(y,...
"MinPeakHeight",0.5);
reg = mean(diff(locs));
bpm = 60*fs/reg;
figure(8)
clf("reset")
plot(n,noisyECG_withTrend,"LineWidth",2)
hold on
plot(n,y(1:end - 2*N),"LineWidth",2)
10
plot(locs,pks,"gv","MarkerFaceColor","g")
hold off
grid on
xlabel("$n$ (amostras)","Interpreter","latex")
ylabel("$x(n)$","Interpreter","latex")
legend("ECG original","ECG filtrado","Picos")
title("Figura 8 — Deteção de picos após processamento.")
Como pode ser visto, uma vez removido o artefato da linha de base, é bastante simples obter um alcance dos
outros parâmetros que ainda permitam a correta análise da frequência cardíaca.
11
x = noisyECG_withTrend;
[Pxx,f] = pspectrum(x,fs);
[Pyy,~] = pspectrum(y,fs);
figure(9)
clf("reset")
plot(f,pow2db(Pxx),"LineWidth",2)
hold on
plot(f,pow2db(Pyy),"LineWidth",2)
hold off
axis tight, grid on
xlabel("$f$ (Hz)","Interpreter","latex")
ylabel("PSD (dB)")
legend("$P_{xx}(f)$","$P_{yy}(f)$","Interpreter","latex")
title("Figura 9 — Densidade Espectral de Potência.")
Analisando a Figura 9, percebemos que o sinal filtrado possui oscilações em sua PSD, para frequências mais
altas. O número dessas oscilações varia com N, do qual depende o comprimento da janela média móvel. No
entanto, a atenuação mínima entre as componentes é razoavelmente insensível à N. Isso nos leva à pergunta:
como projetar um filtro para garantir uma maior atenuação das componentes indesejadas na frequência?
12
[px,fx,tx] = pspectrum(x,fs,"spectrogram");
[py,fy,ty] = pspectrum(y,fs,"spectrogram");
figure(10)
clf("reset")
colormap bone
esp = tiledlayout(1,2);
ax1 = nexttile;
surf(tx,fx,pow2db(px),"EdgeColor","none","FaceColor","interp")
view(2), axis tight
xlabel("$t$ (s)","Interpreter","latex")
ylabel("$f$ (Hz)","Interpreter","latex")
title("$|X(t,f)|^2$","Interpreter","latex","FontWeight","normal")
c = colorbar;
c.Label.String = "Potência (dB)";
caxis([min(pow2db([px(:);py(:)])) max(pow2db([px(:);py(:)]))])
ax2 = nexttile;
surf(ty,fy,pow2db(py),"EdgeColor","none","FaceColor","interp")
view(2), axis tight
xlabel("$t$ (s)","Interpreter","latex")
ylabel("$f$ (Hz)","Interpreter","latex")
title("$|Y(t,f)|^2$","Interpreter","latex","FontWeight","normal")
c = colorbar;
c.Label.String = "Potência (dB)";
caxis([min(pow2db([px(:);py(:)])) max(pow2db([px(:);py(:)]))])
title(esp,"Figura 10 — Espectrogramas.","FontWeight","bold")
13
Porém, como pode ser visto na Figura 10, as técnicas tempo-frequência apresentam um compromisso entre
a resolução temporal e espectral que não se mostra boa o suficiente para uma análise mais específica.
As limitações das técnicas tempo-frequência impulsionaram uma revolução das bases matemáticas do
processamento de sinais, com a introdução das wavelets na década de 1980.
A Figura 11 traz os escalogramas do sinal de ECG original e sua versão processada. Comparada à Figura
10, percebemos uma resolução muito maior no discernimento tempo-frequência do que foi possível com o
espectrograma. As linhas tracejadas pretas representam o "cone de influência" (CoI—Cone of Influence).
Valores externos ao CoI sofrem com efeitos de borda, e seus resultados não são confiáveis para análise.
tx = ((0:length(x) - 1)/fs)';
ty = ((0:length(y) - 1)/fs)';
[wtx,fx,coix] = cwt(x,[],fs,"VoicesPerOctave",48);
[wty,fy,coiy] = cwt(y,[],fs,"VoicesPerOctave",48);
figure(11)
clf("reset")
colormap bone
sca = tiledlayout(1,2);
ax3 = nexttile;
surf(tx,fx,mag2db(abs(wtx)),"EdgeColor","none","FaceColor","interp")
hold on
plot3(tx,coix,zeros(size(tx)),"k--","LineWidth",2)
hold off
view(2), axis tight
xlabel("$t$ (s)","Interpreter","latex")
ylabel("$f$ (Hz)","Interpreter","latex")
title("CWT$(x)$","Interpreter","latex","FontWeight","normal")
c = colorbar;
c.Label.String = "Potência (dB)";
caxis([min(mag2db(abs([wtx(:);wty(:)]))) max(mag2db(abs([wtx(:);wty(:)])))])
ax4 = nexttile;
surf(ty,fy,mag2db(abs(wty)),"EdgeColor","none","FaceColor","interp")
hold on
plot3(ty,coiy,zeros(size(ty)),"k--","LineWidth",2)
hold off
view(2), axis tight
xlabel("$t$ (s)","Interpreter","latex")
ylabel("$f$ (Hz)","Interpreter","latex")
title("CWT$(y)$","Interpreter","latex","FontWeight","normal")
c = colorbar;
c.Label.String = "Potência (dB)";
caxis([min(mag2db(abs([wtx(:);wty(:)]))) max(mag2db(abs([wtx(:);wty(:)])))])
14
title(sca,"Figura 11 — Escalogramas.","FontWeight","bold")
15