Você está na página 1de 15

Sinais Analógicos, Discretos e Digitais

Osmar Tormena Júnior, Prof. Dr.

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.

load kobe; % carrega os dados


n = (0:length(kobe) - 1)'; % gera vetor de índices
t = datetime(1995,1,16,20,56,51) + seconds(n); % gera vetor com duração
figure(1) % cria a figura
clf("reset") % reset da figura entre as execuções
plot(t,kobe/1e3,"LineWidth",2) % plota os dados na figura
axis tight % ajusta os eixos aos dados
grid on % sobrepõe um grid
title("Figura 1 — Terremoto de Kobe.")
xlabel("Tempo (GMT)")
ylabel("$x(t)$ ($\mu$m/s$^2$)","Interpreter","latex")

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.

O sinal apresentado na Figura 1 está armazenado no MATLAB, um software operando em um computador


digital. Assim, não deve ser supresa que ele de fato é um sinal digital. A grande densidade de amostras, bem
como a interpolação linear da ferramenta de plotagem, apenas passam a impressão de um sinal analógico. No
entanto, sua natureza digital fica clara pelo código utilizado na reprodução da Figura 1.

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.

A Figura 3 representa um exemplo simples de um sinal multivariado: uma imagem bidimensional


monocromática. O valor numérico de cada pixel da imagem codifica sua escala de cinza, do preto ao branco.

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.

Descrição no domínio do tempo


O tempo flui continuamente e de forma irreversível, sendo uma escolha natural na ordenação dos valores
dos sinais. Seja a variável independente o tempo, ou uma outra dimensão espacial, ou até uma contagem
de eventos, a representação de um sinal em função dos seus valores ordenados é chamada de descrição no
domínio do tempo.

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))

A regularidade entre os picos é de 214 amostras.

fprintf("Frequência cardíaca de %d bpm.\n",round(bpm))

Frequência cardíaca de 280 bpm.

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.")

fprintf("A regularidade entre os picos é de %d amostras.",round(reg))

8
A regularidade entre os picos é de 375 amostras.

fprintf("Frequência cardíaca de %d bpm.\n",round(bpm))

Frequência cardíaca de 160 bpm.

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.

Além disso, a equação do filtro média móvel

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))

A regularidade entre os picos é de 750 amostras.

fprintf("Frequência cardíaca de %d bpm.\n",round(bpm))

Frequência cardíaca de 80 bpm.

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.")

fprintf("A regularidade entre os picos é de %d amostras.",round(reg))

A regularidade entre os picos é de 500 amostras.

fprintf("Frequência cardíaca de %d bpm.\n",round(bpm))

Frequência cardíaca de 120 bpm.

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.

Descrição no domínio da frequência


Considerando como x o sinal de ECG original e y o sinal filtrado e com a linha de base ajustada, suas PSDs
(Power Spectrum Density—Densidade Espectral de Potência) podem ser visualizada na Figura 9. A PSD
representa a distribuição de energia (ou potência) em um sinal, de acordo com sua frequência. A obtenção da
PSD é uma aplicação da análise de Fourier, onde um sinal com transformada de Fourier , possui
PSD dada por . A Figura 9 traz as PSDs e dos sinais x e y, respectivamente.

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?

Descrição no domínio do tempo-frequência


Ambas as análises no domínio do tempo, ou no domínio da frequência, oferecem uma visão extremamente
limitada da dinâmica temporal, ou espectral. Uma abordagem mista, através da transformada parcial de Fourier
(ou da transformada de Gabor), oferece uma visualização do sinal em ambos os domínios, como mostra a
Figura 10.

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.

Descrição no domínio da escala


O domínio da escala é definido pelo tamanho (i.e. escala) de certas características de um sinal. A
representação no domínio da escala é obtida através da transformada wavelet. Diferentes wavelets pode ser
usadas na tentativa de uma melhor representação da escala do sinal. Apesar de estarem foram do escopo
deste curso, as transformações wavelet representam o que há de mais avançado na análise e processamento
de sinais, justificando sua menção aqui.

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")

Dentre as representações das Figuras 4, 8, 9, 10 e 11, diferentes técnicas de segmentação e categorização


das ondas PQRST do ECG terão distintas características de robustez e reproducibilidade. Isso é essencial no
desenvolvimento de equipamentos médicos automatizados, capazes de ofercer suporte efetivo e eficaz aos
profissionais de saúde.

15

Você também pode gostar