Kioto-Koizumo_Junsaku-twin_dragons_2

Koizumi Junsaku's twin dragons - Kennin-ji Buddhist temple (Kyoto)

Usando função fft do Matlab

Seja o seguinte exemplo:

Vamos sintetizar uma onda formada por 3 senóides de diferentes frequências, defasadas entre si.

e vamos considerar que estamos amostrando este sinal usando a frequência de amostragem .

Então, período de amostragem seria:

Usando o Matlab, podemos sintetizar estas formas de onda:.

Com isto acabamos obtendo uma figura (janela) com os seguintes gráficos:

fft_ondas.png

Realizando a fft() sobre este sinal, resulta:

Averiguando o conteúdo dos vetores:

Note que alguns valores calculados correspondem praticamente à valores nulos (por exemplo: ). Mas nem todos os valores calculados são nulos (por exemplo: ).

O vetor (ou variável Y) é formado por números complexos porque representam amplitudes e fases das senóides presentes no sinal de entrada (vetor y).

Porém os dados brutos de são complicados para serem entendidos. É mais interessante calcular a amplitude (magnitude) dos valores envolvidos com o vetor :

Podemos verificar a magnitude de na mesma faixa de valores já explorada anteriormente:

Obs.: Dependendo do formato adotado para mosrtrar dados, o Matlab pode parecer que gera outra resposta:

Neste documento, está sendo usando >> format shortg.

Podemos transformar o vetor y_mag num gráfico:

Com isto, será gerada uma figura como:

fft_onda_2.png

Note que aparecem alguns picos (correspondentes às frequências das senóides presentes no sinal) e há vales. O vetor é composto por 1500 pontos porque nosso vetor de entrada para a função fft possuia 1500 amostras.

O gráfico original do algortimo FFT é "refletido" entre seu lado esquerdo e seu lado direito (são simétricos). Para analisar o espectro resultante, basta então escolher um dos lados, normalmente o lado esquerdo. Podemos realizar um "zoom", separar o lado esquerdo na figura:

O gráfico agora deve ter ficado como:

fft_onda_3.png

O detalhe é que o eixo X corresponde à frequência., mas não em Hz. Na realidade, o algoritmo FFT retorna a frequência na unidade de "bins", onde cada "bin" corresponde à ; onde: quantidade de amostras do sinal de entrada) e frequênica de amostragem adotada no vetor de entrada. O eixo Y corresponde à magnitude.

Podemos criar um vetor de frequências em Hz para o eixo X e melhorar um pouco o entendimento do gráfico anterior:

fft_onda_4.png

No gráfico gerado anteriormente se aproveitou e foram acrescentados "Data Tips" para comprovar as frequências e aplitudes inicialmente calculadas para os picos da FFT executada sobre o sinal de entrada. Perceba que com exceção da amplitude, a frequência em que ocorrem os picos corresponde ao esperado.

Note que o intervalo de frequência onde termina a parte útil da FFT (lado esquerdo do gráfico) corresponde à metade do número de amostras multiplicado pelo fator bin. Podemos realizar um "zoom" na parte de baixas frequênicias e perceber que:

E o gráfico fica então:

fft_onda_5.png

Agora ficou fácil de perceber que o sinal usado para a FFT possui componente DC nula (na frequência de 0 Hz, a aplitude é nula) e que o sinal de entrada só possui componentes nas frequencias de 20, 30 e 40 Hz. O único "detalhe" é que a amplitude calculada pelo algoritmo de FTT não corresponde às amplitudes reais das senóides presentes no sinal (na realizada está relacionado com o número de amostras do sinal ingressado no algoritmo de FFT).

Ver também: Help Center da MathWorks: fft.

Para "corrigir" o eixo de magnitudes do espectro, devemos considerar que o algoritmo de FFT, escalona o vetor gerado, de um fator de (quantidade de amostras usadas). Então inicialmente temos que redimencionar o vetor fazendo a divisão por : . E depois temos que considerar o espectro "refletido" gerado pelo algoritmo FFT. Na realidade este espectro refletido é composto por pares conjugados complexos, e o espectro originalmente é bilateral (vetor abaixo). E ainda deve ser considerado que o primeiro elemento calculado no espectro, corresponde à frequência nula (0 Hz, nível DC do sinal).

Considerando os fatores anteriores, podemos gerar um novo gráfico do espectro do sinal de entrada , fazendo:

fft_mag_freq_corretos1

O cálculo anterior poderia ser simplificado para:

Que gera o mesmo gráfico anterior, mas com o gráfico ainda mostrando todo o espectro bilateral gerado originalmente pela função FFT:

fft_mag_freq_corretos2

Um zoom na frequencia até 50 Hz, usando o comando axis([0 50 0 3.5]), resulta em:

fft_mag_freq_corretos2_zoom

 

Calculando informação da Fase do sinal

Podemos ainda separar a informação de fase espectral do sinal de entrada:

E obtemos a seguinte figura:

y_phase1

Este diagrama não parece tão útil quanto o da magnitude do espectro do sinal. E note que os ângulos variam no intervalo: .

Podemos realizar um "zoom" na região de interesse:

 

fft_onda_8.png

Mas provavelmente será melhor primeiro identificar os componentes frequênciaiss importantes (os "picos") no gráfico de magnitude do espectro do sinal e então, isolar na janela de comandos do Matlab, as fases que importam:

O arquivo de dados refletindo os cálculos e variáveis criadas pode ser carregado aqui: fft_onda1.mat. E um arquivo de registros dos comandos usados, criado usando o comando diary aula_23042024.txt pode ser obtido aqui: aula_23042024.txt.


Resumindo

A sequencia final de comandos que leva ao espectro de Magnitude do sinal de entrada pode ser feito da seguinte forma:

fft_mag_freq_corretos_zoom

Se for desejado mostrar uma espécie de tabela com os resultados obtidos:

Fim.


Exercícios Propostos.

  1. Sintetize um sinal oscilante usando a eq. abaixo:

    onde amplitude (de pico) da onda, frequência da onda (em Hz) e defassagem do sinal (em radianos).

    Plote as diferentes ondas para 1,5 ciclos da mesma quando:

    a) ;

    b)

    Gráfico desta parte:

    sinais_cos_sin

    c)

    d)

    Gráfico destes últimos 2 itens (comparados com uma cosenoóide defasada de ):

    sinais_3_cossenos_mais_info

    Obs.: considere para os 3 casos, e Hz.

    Perceba que:

    -- ou seja, uma senóide = coseno atrasado de .


Possível solução:

Fim.


Fernando Passold, em 29/03/2024