Vous êtes sur la page 1sur 6

Laboratorio de Sistemas e Sinais

Analise Espectral
Lus Caldas de Oliveira
Abril 2009

O objectivo deste trabalho de laboratorio e o de ensinar a analisar sinais no domnio da frequencia. Utilizaremos
dois metodos. O primeiro consiste em representar graficamente os coeficientes da serie discreta de Fourier de sinais
de duracao finita. O segundo metodo representa os coeficientes de segmentos de duracao limitada de sinais que
variam no tempo, criando o que e chamado de espectrograma.

1 Introducao
Um sinal em tempo discreto de duracao finita com p amostras pode ter a seguinte expansao em serie de Fourier:
p1
X
2

x(n) = A0 + Ak cos(k0 n + k ) (1)


k=1

se p for um numero mpar e


p
X
2

x(n) = A0 + Ak cos(k0 n + k ) (2)


k=1

se p for par.
Um sinal de duracao finita pode ser considerado como um ciclo de um sinal periodico com frequencia funda-
mental 0 = 2/p em radianos por amostra, ou f = 1/p em Hertz. Neste laboratorio assumiremos que p e sempre
par e faremos a representacao grafica de cada uma das componentes em frequencia |A0 |, . . . , |A p/2 | para diversos
sinais com o objectivo de compreender o significado desses coeficientes.
De notar que cada |Ak | da a amplitude da componente sinusoidal do sinal a frequencia k0 = k2/p, que
tem como unidades radianos por amostra. Para interpretar estes coeficientes podera ser conveniente converter esta
unidade para Hertz. Se a frequencia de amostragem for f s amostras por segundo, entao a conversao podera ser
feita atraves de:
(k2/p)[radianos/amostra] f s [amostras/segundo] k f s
= [ciclos/segundo]
2[radianos/ciclo] p
Assim, cada |Ak | da a amplitude da componente sinusoidal com frequencia k f s /p Hz.
Note que o Matlab nao tem nenhuma funcao pre-definida para calcular os coeficientes da serie de Fourier,
tendo no entanto uma funcao que calcula a transformada rapida de Fourier, chamada fft. Esta funcao pode ser
usada para calcular os coeficientes da serie de Fourier atraves da seguinte funcao serieFourier:

function [amplitude, fase] = serieFourier(x)


% SERIEFOURIER - Retorna a amplitude e a fase de cada componente
% sinusoidal da expansao em serie de Fourier do sinal dado como
% argumento, que e interpretado como um ciclo de um sinal
% periodico. Assume-se que o argumento tem um numero de amostras p que
% e par. O primeiro valor de retorno e um vector contendo as
% amplitudes da componentes sinusoidais na expansao em serie de
% Fourier com frequencias 0, 1/p, 2/p, ... 1/2. O segundo valor de
% retorno e um vector com as fases das componentes sinusoidais. Ambos
% os vectores tem comprimento de (p/2)+1.

1
p = length(x);
f = fft(x)/p;
amplitude(1) = abs(f(1));
upper = p/2;
amplitude(2:upper) = 2*abs(f(2:upper));
amplitude(upper+1) = abs(f(upper+1));
fase(1) = angle(f(1));
fase(2:upper) = angle(f(2:upper));
fase(upper+1) = angle(f(upper+1));

Se se tiver um vector x com comprimento par, pode-se usar a funcao para obter os coeficientes da DFS:

[A, phi] = serieFourier(x);

Os vectores A e phi contem a amplitude e a fase de cada coeficiente.


Para representar graficamente as amplitudes dos coeficientes em funcao da frequencia basta fazer:
p = length(x);
frequencias = [0:fs/p:fs/2];
plot(frequencias, A);
xlabel(frequencia em Hertz);
ylabel(amplitude);
Em que fs tera o valor da frequencia de amostragem em amostras por segundo. A linha

frequencias = [0:fs/p:fs/2];

requer uma analise mais cuidada. Produz um vector com o mesmo comprimento de A, ou seja 1 + p/2, em
que p e o comprimento do vector x. Os elementos do vector frequencias sao as frequencias em Hertz de cada
componente da serie de Fourier.

2 Trabalho para os Alunos


1. Considere o sinal produzido da seguinte forma:

t = [0:1/8000:1-1/8000];
x = sin(2*pi*800*t);

Isto corresponde a 8000 amostras de uma sinusoide de 800 Hz amostrada a 8 kHz. Oica o vector x. Utilize
a funcao serieFourier descrita anteriormente para representar graficamente a amplitude dos coeficientes
da serie de Fourier de x.
2. O sinal da alnea anterior pode ser visto como a amostragem da sinusoide contnua:

x(t) = sin(2800t)

Repare que a frequencia angular da sinusoide e a derivada em ordem ao tempo do argumento da funcao seno:
d
= 2800t = 2800
dt
Considere agora o sinal
y(t) = sin(2800t2 )
A este sinal da-se o nome de chirp. A frequencia instantanea pode ser obtida pela derivada do argumento
da funcao seno:
d
(t) = 2800t2 = 4800t
dt
Num sinal chirp a frequencia varia constantemente com o tempo.
Considere a amostragem a 8 kHz de y(t):

2
t = [0:1/8000:1-1/8000];
y = sin(2*pi*800*(t.*t));

Oica o sinal e represente graficamente os coeficientes da serie de Fourier. Que gama de valores toma a
frequencia instantanea?

3. Os coeficientes de Fourier que calculou anteriormente, descrevem a gama de frequencias do chirp bem, nas
nao a sua dinamica. Represente graficamente os coeficientes da serie de Fourier do sinal z dado por:

z = y(8000:-1:1)

Oica o sinal. Compare o som de z com o de y e compare os graficos dos coeficientes de Fourier.

4. O sinal chirp tem uma representacao em frequencia que varia com o tempo. Mais precisamente, existem
certas propriedades do sinal que mudam suficientemente devagar para o nosso ouvido as entender como uma
variacao na composicao em frequencia do sinal em vez de o considerar como pertencente ao proprio sinal
(como o timbre ou conteudo tonal). Note que o nosso ouvido nao e sensvel a frequencias abaixo dos 30
Hz. Em vez disso, o nosso cerebro entende essas variacoes como variacoes na natureza do som e nao como
conteudo no domnio da frequencia. Os metodos de analise de Fourier usados anteriormente nao reflectem
esse fenomeno psico-acustico.
A serie de Fourier localizada procura resolver este problema. O sinal chirp tem 8000 amostras num se-
gundo, mas como nao ouvimos variacoes abaixo dos 30 Hz como conteudo na frequencia, pode fazer sentido
re-analisar o sinal ao ritmo de 30 vezes por segundo. Isto pode ser feito com a seguinte funcao:

function espectrogramaCascata(s, fs, amostrasespectro, numdeespectros)


% ESPECTROGRAMACASCATA - Faz o grafico 3-D do espectrograma do sinal
% s.
%
% Argumentos:
% s - o sinal.
% fs - frequencia de amostragem em amostras por segundo.
% amostrasespectro - o numero de amostras usadas para calcular cada
% espectro.
% numdeespectros - numero de espectros a calcular.
frequencias = [0:fs/amostrasespectro:fs/2];
offset = floor((length(s)-amostrasespectro)/numdeespectros);
for i=0:(numdeespectros-1)
start = i*offset;
[A, phi] = serieFourier(s((1+start):(start+amostrasespectro)));
amplitude(:,(i+1)) = A;
end
waterfall(frequencias, 0:(numdeespectros-1), amplitude);
xlabel(frequencia);
ylabel(tempo);
zlabel(amplitude);

Esta funcao pode ser chamada do seguinte modo:

t = [0:1/8000:1-1/8000];
y = sin(2*pi*800*(t.*t));
espectrogramaCascata(y, 8000, 400, 30);

Que produz o grafico da figura 4. O grafico mostra 30 conjuntos distintos de coeficientes de Fourier, cada
um calculado com 400 das 8000 amostras disponveis. Explique como e que este grafico descreve o que
ouviu. Crie um grafico semelhante para o chirp invertido z.

3
0.6

0.5
amplitude

0.4

0.3

0.2

0.1

0
30
4000
20
3000
10 2000
1000
tempo 0 0
frequencia

Figura 1: Representacao da serie de Fourier localizada de um sinal chirp

5. A figura 4 e facil de interpretar gracas a estrutura relativamente simples do sinal chirp. Sinais mais inte-
ressantes sao mais difceis de analisar desta forma. Uma forma de visualizacao alternativa do conteudo em
frequencia e o espectrograma. Um espectrograma e um grafico como o da figura 4, mas visto de cima. A
altura de cada ponto e representada por uma cor diferente (ou intensidade numa imagem a preto-e-branco).
No Matlab existe uma funcao pre-definida para gerar um espectrograma:

specgram(y,512,8000);

Isto resulta na imagem apresentada na figura 5. Nessa imagem utilizou-se o mapa de cores por omissao
(jet). Pode experimentar com outros mapas de cores usando o comando colormap. Um particularmente
util e:

colormap(hot)

Crie uma imagem semelhante para o chirp invertido z. Determine a gama de variacao da frequencia ins-
tantanea.
6. Junto a este relatorio encontra alguns ficheiros de audio. Use os seguintes comandos para os ouvir e visuali-
zar:

[y,fs] = wavread(audio1.wav);
soundsc(y,fs)
subplot(2,1,1); specgram(y,1024,fs,[],900)
subplot(2,1,2); plot(y)

4
4000

3500

3000

2500
Frequency

2000

1500

1000

500

0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
Time

Figura 2: Representacao da serie de Fourier localizada de um sinal chirp

Interprete os resultados
7. Para o sinal chirp usado anteriormente:

t = [0:1/8000:1-1/8000];
y = sin(2*pi*800*(t.*t));

produza os coeficientes da serie de Fourier usando a funcao serieFourier. Escreva uma funcao Matlab
que use a equacao 2 para reconstruir o sinal original a partir dos coeficientes. A sua funcao Matlab devera
comecar da seguinte forma:

function x = reconstroi(amplitude, fase)


% RECONSTROI - Dado um vector de amplitudes e um vector de fases,
% constroi um sinal que tem estes valores como coeficientes da serie
% de Fourier. Assume-se que os argumentos tem comprimento mpar,
% p/2+1, e que o vector de retorno tem comprimento p.

E devera realizar a seguinte equacao:


X
p/2
n {m |m < p}, x(n) = Ak cos(2 fk n + k )
k=0

em que Ak e k sao respectivamente a amplitude e a fase dos coeficientes da serie de Fourier. Tenha em
atencao que os ndices dos vectores em Matlab comecam em 1.
Note que esta funcao requere um numero elevado de operacoes. Se o seu computador nao for suficientemente
potente, construa os coeficientes de Fourier para as primeira 1000 amostras em vez das 8000 e reconstrua

5
o sinal a partir desses coeficientes. Para verificar que a reconstrucao funciona, subtraia o sinal reconstrudo
do sinal original e examine a diferenca. A diferenca podera nao ser exactamente zero, mas devera ser muito
pequena quando comparada com o sinal original. Desenhe o grafico do sinal de diferenca.

8. Iremos agora estudar sinais de batimento que correspondem a combinacao de sinais sinusoidais com frequencias
proximas. Comece por usar as relacoes de Euler para mostrar que:

2 cos(c t) cos( t) = cos((c + )t) + cos((c )t)

em que c , , t .
Esta identidade significa que a multiplicacao de dois sinais sinusoidais com frequencias c e e igual a
soma de duas sinusoides com frequencias c + e c .
9. Construa um sinal com a soma de duas sinusoides de frequencias 790 e 810 Hz, amostradas a frequencia
de 8 kHz e com a duracao de 1 segundo. Oica o sinal resultante e descreva o que ouve. Desenhe o grafico
das primeiras 800 amostras. Mostre como e que o grafico ilustra o que ouviu e utilize a identidade da alnea
anterior para explicar o grafico.

10. Qual e o perodo do sinal da alnea anterior? Qual e a frequencia fundamental da sua expansao em serie de
Fourier? Apresente o grafico da amplitude dos seus coeficientes de Fourier usando a funcao serieFourier.
Desenhe o espectrograma usando specgram. Escolha cuidadosamente os parametros de specgram para a
imagem ser mais clara. Qual dos dois graficos representa melhor o que ouviu?

Vous aimerez peut-être aussi