Académique Documents
Professionnel Documents
Culture Documents
Sinais
Módulo 1 - Espectro de Sinais Discretos 1D
Prof. João Beleza Sousa
21 de Dezembro de 2006
1
Conteúdo
1 Introdução 3
1.1 Sistema de Transmissão de Rádio . . . . . . . . . . . . . . . . 3
1.2 Compressão de Imagens Digitais . . . . . . . . . . . . . . . . . 3
2 Sinais Discreto 7
2.1 Sinal Discreto 1D . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Sinal Discreto 2D . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Sinal Discreto 3D . . . . . . . . . . . . . . . . . . . . . . . . . 8
6 Espaços de Sinais 21
2
1 Introdução
Nestes apontamentos apresenta-se de forma informal a teoria do processa-
mento digital de sinais que permite representar qualquer sinal discreto no
domı́nio da frequência, isto é, como a soma de sinais sinusoidais de diferen-
tes amplitudes, frequências e fases. Às amplitudes desses sinais sinusoidais
chama-se espectro de amplitude do sinal discreto. Às fases desses sinais si-
nusoidais chama-se espectro de fase do sinal discreto.
O conceito de espectro é um conceito central da teoria do processamento
digital de sinais e da teoria do processamento de sinais em geral, porque
sistemas tão importantes como a transmissão de rádio, e aplicações tão im-
portantes como a compressão de imagens digitais se baseiam na análise e na
manipulação do espectro dos sinais.
3
Figura 1: Exemplo de uma imagem digital.
50
100
150
200
4
têm menor importância que outras. A técnica de compressão sugerida não
armazena portanto as partes pouco importantes do espectro, reduzindo assim
a quantidade de informação a armazenar.
A figura 3 mostra o espectro resultante do aproveitamento da parte cen-
tral do espectro da figura 2. Em termos quantitativos foram preservados
um quarto dos valores do espectro original. Os restantes três quartos dos
valores foram explicitamente igualados a zero. A figura 4 mostra a imagem
correspondente.
50
100
150
200
5
Figura 4: Imagem digital correspondente ao espectro de amplitude apresen-
tado na figura 3.
6
2 Sinais Discreto
2.1 Sinal Discreto 1D
Um sinal discreto 1D (a uma dimensão) é uma sequência de números inde-
xada por um número inteiro.
Sendo n o número inteiro usado como ı́ndice da sequência x[n], a sequência
x[n] definida pela tabela 1, é um sinal discreto a uma dimensão. O sinal x[n]
está representado graficamente na figura 5. A listagem 1 mostra como definir
o sinal x[n], obter a sua representação gráfica e armazenar a sua representação
gráfica em ficheiros com formato PDF 2 e EPSC 3 , utilizando a linguagem
de programação Matlab 4 .
n x[n]
-2 1,1
-1 2,3
0 0,7
1 -1,4
2 -0,5
3 0,9
Listagem 1: sinalXn.m
clear all
close all
% vector tempo
n = [−2 −1 0 1 2 3];
% sinal
xn = [1.1 2.3 0.7 −1.4 −0.5 0.9];
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
2
Portable Document Format.
3
Encapsulated PostScript Color.
4
Todas as listagens apresentadas ao longo deste documento estão escritas na linguagem
de programação Matlab.
7
2.5
1.5
0.5
−0.5
−1
−1.5
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2 2.5 3
stem(n, xn)
%print −dpdf ../figuras/sinalXn.pdf
print −depsc ../figuras/sinalXn.eps
8
Uma sequência de vı́deo digital constitui um exemplo de um sinal discreto
a três dimensões.
9
3 Alguns Sinais Discretos Elementares 1D
3.1 Impulso Unitário
Define-se o sinal discreto Impulso Unitário como:
(
1, n = 0
δ[n] = (1)
6 0
0, n =
A função apresentada na listagem 2 define o sinal δ[n] em Matlab.
x = double(n==0);
Listagem 3: sinalDeltan.m
clear all
close all
n = [−2 −1 0 1 2 3];
dn = impulso n(n);
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
stem(n, dn)
%print −dpdf ../figuras/sinalDeltan.pdf
print −depsc ../figuras/sinalDeltan.eps
Verifica-se que δ[n − 10]x[n] = δ[n − 10]x[10]. Isto porque por definição
do sinal δ[n], δ[n − 10] só é diferente de zero quando a quantidade n − 10 for
igual a zero, o que acontece quando n = 10. Mas quando n = 10, δ[n − 10] é
igual a 1 e x[n] é igual a x[10]. E para todos os outros valores de n diferentes
de 10, δ[n − 10] é igual a zero, o que multiplicado por x[n] dá zero.
Generalizando, para um qualquer valor inteiro n0 , vem:
10
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2 2.5 3
11
com k inteiro (note-se que o produto kn também é um número inteiro).
O que decorre do facto da função contı́nua cos(α) ser periódica de perı́odo
2π, isto é, com k inteiro tem-se que cos(α + k2π) = cos(α).
Na figura 7 estão representadas 6 sinusóides discretas, com amplitude
A = 1, fase φ = 0 e frequências Ω = 0, π/2, 2π/2, 3π/2, 4π/2 e 5π/2.
Pode-se constatar nestas 6 sinusóides a periodicidade de 2π na frequências
das sinusóides discretas. Na listagem 4 está o programa com que a figura foi
obtida.
1
0.5
0
−5 0 5 10
1
0
−1
−5 0 5 10
1
0
−1
−5 0 5 10
1
0
−1
−5 0 5 10
1
0.5
0
−5 0 5 10
1
0
−1
−5 0 5 10
Listagem 4: sinusoides.m
clear all
close all
n = [−5:10];
A = 1;
fi = 0;
k = [0:5];
omegas = k * pi/2;
12
sinais = zeros(length(k), length(n));
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
for p=1:length(k)
sinais(p,:) = A*cos(omegas(p)*n + fi);
subplot(length(k),1,p)
stem(n, sinais(p,:))
end
A última igualdade verifica-se pelo facto da função coseno ser par, ou seja,
cos(−α) = cos(α).
Pelo facto a periodicidade das sinusóides discretos na frequência ter valor
2π é habitual representar-se o domı́nio da frequência dos sinais discretos, no
intervalo Ω ∈ [−π : π[. Neste gama de frequências, o valor central Ω = 0
correponde à componente contı́nua.
13
3.3 Exponencial Complexa Discreta
Define-se exponencial complexa discreta com:
ejα + e−jα
cos α = (7)
2
ejα − e−jα
sin α = (8)
2j
A importância da utilização de exponenciais complexas reside no facto
de permitirem estudar sinais sinusoidais contornando o uso de cálculo trigo-
nométrico. O apêndice A mostra, por exemplo, como é possı́vel deduzir uma
formula trigonométrica sem usar cálculo trigonométrico.
14
4 Sinal Discreto como Combinação Linear de
Impulsos Unitários
A figura 8 (gerada pelo programa incluı́do na listagem 5) mostra como o
sinal x[n] pode ser obtido pela soma de impulsos unitários multiplicados por
constantes. Analiticamente, trata-se de representar x[n] como:
Listagem 5: somaDeImpulsos.m
sinalXn
k = n;
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
for p=1:length(xn)
15
4
x[−2]d[n+2]
2 x[−1]d[n+1]
x[0]d[n+0]
0 x[1]d[n−1]
x[2]d[n−2]
−2 x[3]d[n−3]
−2 −1 0 1 2 3
4
x[n]
2
−2
−2 −1 0 1 2 3
sinalSoma = sum(sinaisParcelas(1:p,:),1);
subplot(2,1,2)
stem(n, sinalSoma)
legend('x[n]')
pause
end
16
5 Série de Fourier de Sinais Discretos
Seja xp [n] um sinal periódico de perı́odo N amostras, isto é, xp [n+N ] = xp [n].
O sinal xp [n] pode decompor-se na série de Fourier:
N −1
Ck ejkΩ0 n
X
xp [n] = (11)
k=0
17
2
0.52*cos(0*n)
1.53*cos(1.05*n+1.58)
0 0.67*cos(2.09*n+1.13)
−0.08*cos(pi*n)
−2
−2 −1 0 1 2 3
−2
−2 −1 0 1 2 3
Listagem 6: somaDeSinusoides.m
sinalXn
whos
N = length(xn);
xpn = zeros(size(xn));
indiceAmostraZero = find(rem(n,N)==0);
indiceAmostraMenosUm = indiceAmostraZero − 1;
xpn(1:end−indiceAmostraZero+1) = xn(indiceAmostraZero:end);
if indiceAmostraMenosUm > 0
xpn(end−indiceAmostraZero+2:end) = xn(1:indiceAmostraMenosUm);
end
n1 = [0:N−1];
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
stem(n1, xpn)
omega0 = 2*pi/N;
18
Ck = zeros(size(xpn));
for k=0:N−1
Ck(k+1) = 1/N*sum(xpn.*exp(−j*k*omega0*n1));
end
Ck
paridadeN = rem(N,2);
PAR = 0;
IMPAR = 1;
if paridadeN == PAR
parcelasCosenos = zeros(N/2+1, length(n));
parcelasCosenos(1,:) = Ck(1);
for k=1:N/2−1
parcelasCosenos(k+1,:) = ...
2*abs(Ck(k+1))*cos(k*omega0*n+angle(Ck(k+1)));
end
parcelasCosenos(N/2+1,:) = Ck(N/2+1)*cos(pi*n);
end
if paridadeN == IMPAR
parcelasCosenos = zeros((N−1)/2+1, length(n));
parcelasCosenos(1,:) = Ck(1);
for k=1:(N−1)/2
parcelasCosenos(k+1,:) = ...
2*abs(Ck(k+1))*cos(k*omega0*n+angle(Ck(k+1)));
end
end
if paridadeN == PAR
legenda = cell(N/2+1,1);
legenda{1} = strcat(sprintf('%.02f', Ck(1)), '*cos(0*n)');
for k=1:N/2−1
legenda{k+1} = strcat(sprintf('%.02f', ...
2*abs(Ck(k+1))), ...
'*cos(', sprintf('%.02f', k*omega0), '*n', ...
sprintf('%+.02f', angle(Ck(k+1))),')');
end
legenda{N/2+1} = strcat(sprintf('%.02f', ...
real(Ck(N/2+1))), ...
'*cos(pi*n)');
end
19
if paridadeN == IMPAR
legenda = cell((N−1)/2+1,1);
legenda{1} = strcat(sprintf('%.02f', Ck(1)), '*cos(0*n)');
for k=1:(N−1)/2
legenda{k+1} = strcat(sprintf('%.02f', ...
2*abs(Ck(k+1))), ...
'*cos(', sprintf('%.02f', k*omega0), '*n', ...
sprintf('%+.02f', angle(Ck(k+1))),')');
end
end
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
for p=1:size(parcelasCosenos,1)
subplot(2,1,1)
stem(n,parcelasCosenos(1:p,:)')
legend(legenda{1:p})
subplot(2,1,2)
stem(n,sum(parcelasCosenos(1:p,:),1))
pause
end
20
6 Espaços de Sinais
Consideremos a representação de vectores no espaço vectorial a duas di-
mensões (2D). Consideremos a base vectorial constituı́da pelos vectores ~u1 e
~u2 6 .
" # " #
1 0
~u1 = , ~u2 = (16)
0 1
Consideremos ainda o vector ~v representado na base vectorial (~u1 , ~u2 ),
com coordenadas 3 segundo ~u1 e −1 segundo ~u2 .
~v = vw~ 1 w
~ 1 + vw~ 2 w
~2 (20)
As coordenadas do vector ~v na base (w ~ 1, w
~ 2 ), são dadas pela projecção
do vector ~v segundo os vectores w
~1 e w
~ 2.
< ~v , w
~1 >
vw~ 1 = proj~v|w~ 1 = (21)
<w
~ 1, w ~1 >
< ~v , w
~2 >
vw~ 2 = proj~v|w~ 2 = (22)
<w
~ 2, w ~2 >
onde < p~, ~q > representa o produto interno entre vectores.
21
As coordenadas do vector ~v na base (w
~ 1, w
~ 2 ) são portanto:
" #
h i 1
3 −1
−1 3+1
vw~ 1 = h " # = =2 (25)
i 1 1+1
1 −1
−1
" #
h i −2
3 −1
−2 −6 + 2
vw~ 2 = h " # = = −0, 5 (26)
i −2 4+4
−2 −2
−2
A figura 10 ilustra o vector ~v representado nas bases (~u1 , ~u2 ) e (w
~ 1, w
~ 2 ).
4
u1
3 u2
v
w1
2
w2
vw1*w1
1 vw2*w2
−1
−2
−3
−4
−4 −3 −2 −1 0 1 2 3 4
22
~v(w~ 1 ,w~ 2 ) = A~v(~u1 ,~u2 ) (28)
" #" #
0, 5 −0, 5 3
= (29)
−0, 25 −0, 25 −1
" # " #
1, 5 + 0, 5 2
= = (30)
−0, 75 + 0, 25 −0, 5
Listagem 7: espacoVectorial2d.m
clear all
close all
u1 = [1; 0];
u2 = [0; 1];
v = [3; −1];
w1 = [1; −1];
w2 = [−2; −2];
vw1 = (v'*w1)/(w1'*w1)
vw2 = (v'*w2)/(w2'*w2)
A = [w1'/(w1'*w1); w2'/(w2'*w2)]
vw = A*v
23
% dadas as coordenadas de um vector na base (w1, w2) as
% coordenadas desse vectro na base (u1, u2) podem obter−se
% multiplicando às esquera ambos os termos da igualdade anterior
% por Aˆ(−1). Vem:
% Aˆ(−1)*vw = Aˆ(−1)*A*v = v
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
axis([−4 4 −4 4])
grid on
hold on
x = [u1 u2];
z = x(1,:)+j*x(2,:);
compass(z,'b')
x = [v];
z = x(1,:)+j*x(2,:);
compass(z,'r')
x = [w1 w2];
z = x(1,:)+j*x(2,:);
compass(z,'g')
x = [vw1*w1 vw2*w2];
z = x(1,:)+j*x(2,:);
compass(z,'c')
legend('u1', 'u2', 'v', 'w1', 'w2', 'vw1*w1', 'vw2*w2')
hold off
24
Isto porque a equação 11 é válida para qualquer n, em particular para
n ∈ {0, 1, · · · , N − 1}, e neste caso tem-se que xp [n] = x[n].
À semelhança das equações 17 e 20 em que um vector é representado
como combinações lineares de outros vectores, nas equações 32 e 33 o sinal
x[n] é representado como combinações lineares de outros sinais. No primeiro
caso uma combinação linear de N impulsos unitários e no segundo caso uma
combinação linear de N exponenciais complexas. Os valores de cada um dos
N impulsos unitários para n ∈ {0, 1, · · · , N −1} definem um vector no espaço
a N dimensões. Da mesma forma, os valores de cada uma das exponenciais
complexas para n ∈ {0, 1, · · · , N − 1} definem um vector no espaço a N
dimensões. Assim, os coeficientes x[k] representam as coordenadas do sinal
x[n] no espaço dos impulsos unitários e os coeficientes Ck representam as
coordenadas do sinal x[n] nos espaço das exponenciais complexas.
Torna-se claro que se podem obter as coordenadas Ck recorrendo a uma
matriz de mudança de base A. De acordo com a equação 27 a matriz A é
constituı́da por:
ej0Ω0 n /M0
ej1Ω0 n /M1
A= .. (34)
.
ej(N −1)Ω0 n /MN −1
onde:
Listagem 8: espacoDeSinais.m
somaDeSinusoides
xpn
25
Ck
A = zeros(N);
for k=0:N−1
exponencial = exp(j*k*omega0*n1);
% o comando seguinte é equivalente a:
% sum(exponencial.*exponencial)
norma2 = exponencial*exponencial';
A(k+1,:) = exponencial/norma2;
end
Ck = A*xpn'
(a) são ortogonais, isto é, todos os vectores que constituem a base são
ortogonais entre si. Como consequência, cada coordenada repre-
senta a componente dos vectores numa única direcção;
(b) são completas, isto é, qualquer vector do espaço se pode represen-
tar sem que seja cometido qualquer erro de aproximação, por uma
combinação linear dos vectores da base.
26
As bases de sinais constituı́das por impulsos unitários e as constituı́das
por exponenciais complexas são ortogonais e são completas.
27
7 Transformada de Fourier de Sinais Discre-
tos
Um sinal discreto não periódico pode decompor-se na soma de infinitas ex-
ponenciais discretas dada pela equação 37.
1 Z
x[n] = X(Ω)ejΩn dΩ (37)
2π 2π
A função X(Ω) é a transformada de Fourier de sinais discretos e é dada
pela equação 38.
+∞
x[n]e−jΩn
X
X(Ω) = (38)
n=−∞
Listagem 9: transformadaFourier.m
clear all
close all
sinalXn
28
6
0
−4 −3 −2 −1 0 1 2 3 4
−5
−4 −3 −2 −1 0 1 2 3 4
−2
−10 −5 0 5 10
5
−5
−10 −5 0 5 10
5
−5
−10 −5 0 5 10
syms n sym w
29
% (o impulso unitário no módulo de
% cálculo simbólico chama−se "charfcd[n0](n)"
% onde "n0" é o instante onde ∆[n] = 1 e
% "n" é a variável independente)
xn str = '';
for m=1:length(n)
xn str = strcat(xn str, ...
sprintf('%+.2f', xn(m)), ...
'*charfcn[', ...
sprintf('%d', n(m)), ...
'](n sym)');
end
xn str
xn sym = sym(xn str)
ec = sym('exp(−j*w* n sym)')
w vector = linspace(−pi,pi,100);
xw vector = double(subs(xw, w, w vector));
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
subplot(2,1,1)
plot(w vector, abs(xw vector))
subplot(2,1,2)
plot(w vector, angle(xw vector))
%print −dpdf ../figuras/transformadaFourier.pdf
print −depsc ../figuras/transformadaFourier.eps
figure('PaperUnits', 'inches',...
'PaperSize',[5 3],...
'PaperPosition', [0 0 5 3])
axes('FontSize', 8)
for k=1:3
n2 = [−10:10];
xn2 = zeros(size(n2));
for m=1:length(n2)
ec2 str = strcat('exp(j*w*(', num2str(n2(m)),'))')
ec2 = sym(ec2 str);
xn2(m) = 1/(2*pi)*double(int(xw*ec2,w,−pi/3*k,pi/3*k));
end
subplot(3,1,k)
stem(n2, real(xn2))
30
end
%print −dpdf ../figuras/transformadaFourierInversa.pdf
print −depsc ../figuras/transformadaFourierInversa.eps
31
8 Transformada de Fourier Discreta
Seja xp [n] um sinal discreto periódico de perı́odo N amostras, isto é, xp [n +
N ] = xp [n]. A transformada de Fourier discreta do sinal xp [n] é dada pela
equação 40.
N −1
xp [n]e−jkΩ0 n
X
X[k] = (40)
n=0
com Ω0 = 2πN
e k ∈ {0, 1, · · · N − 1}.
O sinal xp [n] pode ser obtido a partir da sua transformada de Fourier
discreta usando a transformada de Fourier discreta inversa. A transformada
de Fourier discreta inversa é dada pela equação 41.
−1
1 NX
x[n] = X[k]ejkΩ0 n (41)
N k=0
Comparando a equação 40 com a equação 12 verifica-se que:
X[k] = N Ck (42)
Por outro lado, comparando a equação 40 com a equação 38 verifica-se
que:
2π
X[k] = X(Ω) = X(k ) (43)
Ω = kΩ0 = k 2π
N N
com k ∈ {0, 1, · · · N − 1}.
A equação 43 mostra que a transformada de Fourier discreta permite
contornar o problema referido no final da secção 7. O espectro de um sinal
discreto não periódico é uma função contı́nua. No entanto, usando a trans-
formada de Fourier discreta, ou seja, assumindo que o sinal é periódico com
perı́odo de N amostras, pode determinar-se o valor do espectro em N pontos
uniformemente espaçados entre 0 e 2π.
Uma nota final para referir que o número de operações envolvidas no
cálculo da transformada de Fourier discreta pela definição (equação 40) é
da ordem das N 2 operações. O cálculo da transformada de Fourier discreta
de uma imagem de 1000x1000 pixels, ou seja, a transformada de Fourier
discreta de um sinal com 106 de pontos, envolve portanto um número de
operações da ordem das 1012 operações. Existe, felizmente, um algoritmo
de cálculo rápido da transformada de Fourier discreta conhecido por Fast
Fourier Transform capaz de produzir o mesmo resultado efectuando apenas
um número de operações da ordem das N log2 N operações. No caso da
32
imagem de 1000x1000 pixels a transformada de Fourier discreta pode ser
calculada com um número de operações da ordem das 106 log2 106 = 106 ∗19, 9
em vez das 1012 envolvidas no cálculo pela definição. Em termos práticos
trata-se da diferença entre conseguir e não conseguir calcular transformadas
de Fourier discretas de imagens digitais.
33
A Dedução da fórmula trigonométrica cos(a) cos(b)
usando exponenciais complexas
Dados dois ângulos, a e b, se quiser saber quanto vale o produto dos cosenos
desses dois ângulos, e não tiver à mão nenhum formulário trigonométrico,
pode usar a relação 7 e fazer:
34