Este documento descreve dois métodos para analisar sinais no domínio da frequência: 1) representar graficamente os coeficientes da série de Fourier de sinais de duração finita e 2) representar os coeficientes de segmentos limitados de sinais que variam no tempo, criando espectrogramas. O documento fornece exemplos e funções para aplicar esses métodos a sinais como sinusoides e chirps.
1. Laborat ´orio de Sistemas e Sinais
An´alise Espectral
Lu´ıs Caldas de Oliveira
Abril 2009
O objectivo deste trabalho de laborat ´orio ´e o de ensinar a analisar sinais no dom´ınio da frequˆencia. Utilizaremos
dois m´etodos. O primeiro consiste em representar graficamente os coeficientes da s´erie discreta de Fourier de sinais
de durac¸ ˜ao finita. O segundo m´etodo representa os coeficientes de segmentos de durac¸ ˜ao limitada de sinais que
variam no tempo, criando o que ´e chamado de espectrograma.
1 Introduc¸ ˜ao
Um sinal em tempo discreto de durac¸ ˜ao finita com p amostras pode ter a seguinte expans˜ao em s´erie de Fourier:
x(n) = A0 +
p−1
2
X
k=1
Ak cos(k!0n + k) (1)
se p for um n´umero ´ımpar e
x(n) = A0 +
p
2
X
k=1
Ak cos(k!0n + k) (2)
se p for par.
Um sinal de durac¸ ˜ao finita pode ser considerado como um ciclo de um sinal peri ´odico com frequˆencia funda-mental
!0 = 2/p em radianos por amostra, ou f = 1/p em Hertz. Neste laborat ´orio assumiremos que p ´e sempre
par e faremos a representac¸ ˜ao gr´afica de cada uma das componentes em frequˆencia |A0|, . . . , |Ap/2| para diversos
sinais com o objectivo de compreender o significado desses coeficientes.
De notar que cada |Ak| d´a a amplitude da componente sinusoidal do sinal `a frequˆencia k!0 = k2/p, que
tem como unidades radianos por amostra. Para interpretar estes coeficientes poder´a ser conveniente converter esta
unidade para Hertz. Se a frequˆencia de amostragem for fs amostras por segundo, ent˜ao a convers˜ao poder´a ser
feita atrav´es de:
(k2/p)[radianos/amostra] fs[amostras/segundo]
2[radianos/ciclo]
=
k fs
p
[ciclos/segundo]
Assim, cada |Ak| d´a a amplitude da componente sinusoidal com frequˆencia k fs/p Hz.
Note que o Matlab n˜ao tem nenhuma func¸ ˜ao pr´e-definida para calcular os coeficientes da s´erie de Fourier,
tendo no entanto uma func¸ ˜ao que calcula a transformada r´apida de Fourier, chamada fft. Esta func¸ ˜ao pode ser
usada para calcular os coeficientes da s´erie de Fourier atrav´es da seguinte func¸ ˜ao serieFourier:
function [amplitude, fase] = serieFourier(x)
% SERIEFOURIER - Retorna a amplitude e a fase de cada componente
% sinusoidal da expans˜ao em s´erie de Fourier do sinal dado como
% argumento, que ´e interpretado como um ciclo de um sinal
% peri´odico. Assume-se que o argumento tem um n´umero de amostras p que
% ´e par. O primeiro valor de retorno ´e um vector contendo as
% amplitudes da componentes sinusoidais na expans˜ao em s´erie de
% Fourier com frequˆencias 0, 1/p, 2/p, ... 1/2. O segundo valor de
% retorno ´e um vector com as fases das componentes sinusoidais. Ambos
% os vectores tˆem comprimento de (p/2)+1.
1
2. 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 func¸ ˜ao para obter os coeficientes da DFS:
[A, phi] = serieFourier(x);
Os vectores A e phi contˆem a amplitude e a fase de cada coeficiente.
Para representar graficamente as amplitudes dos coeficientes em func¸ ˜ao da frequˆencia basta fazer:
p = length(x);
frequencias = [0:fs/p:fs/2];
plot(frequencias, A);
xlabel(’frequencia em Hertz’);
ylabel(’amplitude’);
Em que fs ter´a o valor da frequˆencia de amostragem em amostras por segundo. A linha
frequencias = [0:fs/p:fs/2];
requer uma an´alise 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 s˜ao as frequˆencias em Hertz de cada
componente da s´erie 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 sinus´oide de 800 Hz amostrada a 8 kHz. Oic¸a o vector x. Utilize
a func¸ ˜ao serieFourier descrita anteriormente para representar graficamente a amplitude dos coeficientes
da s´erie de Fourier de x.
2. O sinal da al´ınea anterior pode ser visto como a amostragem da sinus´oide cont´ınua:
x(t) = sin(2800t)
Repare que a frequˆencia angular da sinus´oide ´e a derivada em ordem ao tempo do argumento da func¸ ˜ao seno:
! =
d
dt
2800t = 2800
Considere agora o sinal
y(t) = sin(2800t2)
A este sinal d´a-se o nome de chirp. A frequˆencia instant ˆanea pode ser obtida pela derivada do argumento
da func¸ ˜ao seno:
!(t) =
d
dt
2800t2 = 4800t
Num sinal chirp a frequˆencia varia constantemente com o tempo.
Considere a amostragem a 8 kHz de y(t):
2
3. t = [0:1/8000:1-1/8000];
y = sin(2*pi*800*(t.*t));
Oic¸a o sinal e represente graficamente os coeficientes da s´erie de Fourier. Que gama de valores toma a
frequˆencia instantˆanea?
3. Os coeficientes de Fourier que calculou anteriormente, descrevem a gama de frequˆencias do chirp bem, nas
n˜ao a sua dinˆamica. Represente graficamente os coeficientes da s´erie de Fourier do sinal z dado por:
z = y(8000:-1:1)
Oic¸a o sinal. Compare o som de z com o de y e compare os gr´aficos dos coeficientes de Fourier.
4. O sinal chirp tem uma representac¸ ˜ao em frequˆencia que varia com o tempo. Mais precisamente, existem
certas propriedades do sinal que mudam suficientemente devagar para o nosso ouvido as entender como uma
variac¸ ˜ao na composic¸ ˜ao em frequˆencia do sinal em vez de o considerar como pertencente ao pr ´oprio sinal
(como o timbre ou conte´udo tonal). Note que o nosso ouvido n˜ao ´e sens´ıvel a frequˆencias abaixo dos 30
Hz. Em vez disso, o nosso c´erebro entende essas variac¸ ˜oes como variac¸ ˜oes na natureza do som e n˜ao como
conte´udo no dom´ınio da frequˆencia. Os m´etodos de an´alise de Fourier usados anteriormente n˜ao reflectem
esse fen´omeno psico-ac´ustico.
A s´erie de Fourier localizada procura resolver este problema. O sinal chirp tem 8000 amostras num se-gundo,
mas como n˜ao ouvimos variac¸ ˜oes abaixo dos 30 Hz como conte´udo na frequˆencia, pode fazer sentido
re-analisar o sinal ao ritmo de 30 vezes por segundo. Isto pode ser feito com a seguinte func¸ ˜ao:
function espectrogramaCascata(s, fs, amostrasespectro, numdeespectros)
% ESPECTROGRAMACASCATA - Faz o gr´afico 3-D do espectrograma do sinal
% s.
%
% Argumentos:
% s - o sinal.
% fs - frequˆencia de amostragem em amostras por segundo.
% amostrasespectro - o n´umero de amostras usadas para calcular cada
% espectro.
% numdeespectros - n´umero 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 func¸ ˜ao 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 gr´afico da figura 4. O gr´afico mostra 30 conjuntos distintos de coeficientes de Fourier, cada
um calculado com 400 das 8000 amostras dispon´ıveis. Explique como ´e que este gr´afico descreve o que
ouviu. Crie um gr´afico semelhante para o chirp invertido z.
3
4. 0
1000
2000
3000
4000
0
10
20
0.6
0.5
0.4
0.3
0.2
0.1
0
30
tempo frequencia
amplitude
Figura 1: Representac¸ ˜ao da s´erie de Fourier localizada de um sinal chirp
5. A figura 4 ´e f´acil de interpretar grac¸as `a estrutura relativamente simples do sinal chirp. Sinais mais inte-ressantes
s˜ao mais dif´ıceis de analisar desta forma. Uma forma de visualizac¸ ˜ao alternativa do conte´udo em
frequˆencia ´e o espectrograma. Um espectrograma ´e um gr´afico 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 func¸ ˜ao pr´e-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 omiss˜ao
(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 variac¸ ˜ao da frequˆencia ins-tant
ˆanea.
6. Junto a este relat ´orio 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
5. Time
Frequency
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
4000
3500
3000
2500
2000
1500
1000
500
0
Figura 2: Representac¸ ˜ao da s´erie 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 s´erie de Fourier usando a func¸ ˜ao serieFourier. Escreva uma func¸ ˜ao Matlab
que use a equac¸ ˜ao 2 para reconstruir o sinal original a partir dos coeficientes. A sua func¸ ˜ao Matlab dever´a
comec¸ar 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 s´erie
% de Fourier. Assume-se que os argumentos tˆem comprimento ´ımpar,
% p/2+1, e que o vector de retorno tem comprimento p.
E dever´a realizar a seguinte equac¸ ˜ao:
8n 2 {m 2 š|m p}, x(n) =
p/2
X
k=0
Ak cos(2 fkn + k)
em que Ak e k s˜ao respectivamente a amplitude e a fase dos coeficientes da s´erie de Fourier. Tenha em
atenc¸ ˜ao que os ´ındices dos vectores em Matlab comec¸am em 1.
Note que esta func¸ ˜ao requere um n´umero elevado de operac¸ ˜oes. Se o seu computador n˜ao for suficientemente
potente, construa os coeficientes de Fourier para as primeira 1000 amostras em vez das 8000 e reconstrua
5
6. o sinal a partir desses coeficientes. Para verificar que a reconstruc¸ ˜ao funciona, subtraia o sinal reconstru´ıdo
do sinal original e examine a diferenc¸a. A diferenc¸a poder´a n˜ao ser exactamente zero, mas dever´a ser muito
pequena quando comparada com o sinal original. Desenhe o gr´afico do sinal de diferenc¸a.
8. Iremos agora estudar sinais de batimento que correspondem `a combinac¸ ˜ao de sinais sinusoidais comfrequˆencias
pr ´oximas. Comece por usar as relac¸ ˜oes de Euler para mostrar que:
2 cos(!ct) cos(!t) = cos((!c + !)t) + cos((!c − !)t)
em que !c,!, t 2 ’.
Esta identidade significa que a multiplicac¸ ˜ao de dois sinais sinusoidais com frequˆencias !c e ! ´e igual `a
soma de duas sinus´oides com frequˆencias !c + ! e !c − !.
9. Construa um sinal com a soma de duas sinus´oides de frequˆencias 790 e 810 Hz, amostradas `a frequˆencia
de 8 kHz e com a durac¸ ˜ao de 1 segundo. Oic¸a o sinal resultante e descreva o que ouve. Desenhe o gr´afico
das primeiras 800 amostras. Mostre como ´e que o gr´afico ilustra o que ouviu e utilize a identidade da al´ınea
anterior para explicar o gr´afico.
10. Qual ´e o per´ıodo do sinal da al´ınea anterior? Qual ´e a frequˆencia fundamental da sua expans˜ao em s´erie de
Fourier? Apresente o gr´afico da amplitude dos seus coeficientes de Fourier usando a func¸ ˜ao serieFourier.
Desenhe o espectrograma usando specgram. Escolha cuidadosamente os parˆametros de specgram para a
imagem ser mais clara. Qual dos dois gr´aficos representa melhor o que ouviu?
6