Teoria

Introdução

E aí, meu povo, tudo joia? Deixa eu te perguntar: você curte música? Não importa o gênero: sertanejo, axé, pagode ou samba, todo mundo ama uma musiquinha. Já parou pra pensar como as gravadoras fazem o tratamento do som gravado após sua banda favorita terminar as gravações no estúdio? Não?

Pois saiba que eles usam um conceito que a gente usa muito em engenharia, especialmente em tratamento de sinais. Eles usam a transformada de Fourier, que decompõe um sinal em senos e cossenos, para converter um sinal no domínio do tempo, como por exemplo o canto do vocalista ou um solo maneiro de guitarra, para o domínio da frequência.

O domínio do tempo, que pode ser dado em segundos, por exemplo, é representado por valores reais. Já o domínio da frequência é representado por valores complexos, que, por sua vez, podem ser representados por senoides que compõem o sinal.

E por que eles fazem isso? Porque às vezes pode ser muito mais fácil analisar um sinal no domínio da frequência do que no domínio do tempo. A transformada de Fourier é muito utilizada no tratamento de sinais de diversas áreas do conhecimento. Ela pode ser usada para resolver problemas de condução térmica, interpretar eletrocardiogramas, eletroencefalogramas e sinais de pressão sanguínea e até mesmo para estudar terremotos!

A função do MATLAB fft

O MATLAB tem uma função chamada f f t que calcula a transformada de Fourier de um vetor X , o qual está no domínio do tempo:

Y = f f t ( X )

A saída é um vetor Y com números complexos: é a conversão de X no domínio do tempo para o domínio da frequência.

O vetor X pode ser alguma medição que fazemos no domínio do tempo, como a gravação de um instrumento, por exemplo. A f f t assume que os elementos do vetor X tem um passo constante (por exemplo, X = [ 0 0,5 1 1,5 ] tem passo constante igual a 0,5 ) e o vetor de saída Y tem a mesma quantidade de elementos de X .

Veja que o uso da função f f t é bem direto. Porém, antes de vermos um exemplo de aplicação da f f t , para entendermos bem como utilizá-lo, precisamos ver bem direitinho o que é esse negócio de “domínio do tempo” e “domínio da frequência”.

Domínio do Tempo versus Domínio da Frequência

No mundo real, trabalhamos com sinais analógicos, que são funções f ( t ) contínuas no tempo, como no caso da gravação de um solo de guitarra. Para que este sinal contínuo seja processado por um computador, ele deve ser amostrado em um período de T segundos, gerando assim um sinal digital derivado do sinal analógico original.

Digamos que você fez uma captura de sinal com 8 pontos de medição, registrados a cada 0,1   s . Normalmente se começa a amostragem em 0   s , logo, este seria o domínio do tempo para esta medição:

Neste caso, o período é T = 0,1   s .

Lembra láááá das aulas de ondulatória de Física, que a frequência f é o inverso do período? Em outras palavras:

f = 1 T

Podemos dizer então que a frequência de amostragem F s da nossa medição é igual a:

F s = 1 0.1   s = 10   H z

O domínio da frequência normalmente também se inicia em 0 e as frequências seguintes são obtidas somando um Δ f constante a elas, definido por:

Δ f = F s N

Onde F s é a frequência de amostragem e N o número de pontos dos dados originais. Na nossa medição, temos N = 8 .

Para nosso exemplo, tendo F s = 10   H z e N = 8 , o domínio da frequência seria igual a:

O domínio da frequência gerado por f f t corresponde a uma frequência com separação de Δ f = F s / N .

Existe um teorema chamado de teorema de amostragem de Nyquist, que diz que a frequência de amostragem deve ser maior que o dobro da frequência máxima do sinal no domínio do tempo. Desta forma, o sinal digital é mais fiel ao sinal analógico.

Por exemplo, no nosso exemplo, como nossa frequência de amostragem é F s = 10   H z , o ideal é que o sinal medido tenha uma frequência de até 5   H z .

É importante entender bem como se determina o domínio da frequência para poder trabalhar com a saída da função f f t . A função f f t do MATLAB é válida para um intervalo no domínio da frequência que vai de 0 < f < F s 2 . A partir de F s 2 , os resultados da f f t se repetem.

Exemplo no MATLAB

Agora que conhecemos como funciona esse negócio de domínio do tempo e domínio da frequência, vamos ver como usamos a f f t no MATLAB.

Digamos que você registrou uma onda senoidal fazendo N = 2000 medições a cada T = 0.001   s . Essa onda tem uma amplitude A = 1 e uma frequência de f = 20   H z . Ela pode ser descrita pela seguinte expressão:

X = A sin ⁡ 2 π f t

onde t é o tempo de medição do sinal, que pode ser calculado a partir do período T .

Ah, não confunda a frequência da onda senoidal ( f = 20   H z ) com a frequência de amostragem F s ou com o Δ f . Apesar de se tratarem de frequências, elas representam coisas diferentes: usamos F s e Δ f para construir o dommínio da frequência, já a frequência f = 20   H z da onda senoidal representa o número de oscilações dela, por um certo período de tempo.

Vamos construir essa onda senoidal no MATLAB para vermos a carinha dela? Em um script novo, entre as linhas de código:

Com estes comandos, entramos com o número de pontos medidos N , o período T , a amplitude A e a frequência da onda senoidal f .

Para criar a onda senoidal, devemos criar um vetor representando o tempo em segundos. Ele é criada a partir do período T = 0,001   s , com o comando:

Com este comando, cria-se primeiro um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem 2000 elementos, correspondendo aos N = 2000 pontos de medição. Lembra que esses 2000   pontos foram registrados a cada T = 0,001   s ? Por isso, esse vetor é multiplicado por T . Desta forma, é criado o domínio do tempo, que vai de 0 a N - 1 * T = 1999 * 0,001 = 1,999   s .

Após entrar as informações da onda senoidal, vamos entrar com a sua expressão no script:

Ali já pedimos também pro MATLAB plotar esta curva senoidal no domínio do tempo, usando p l o t ( t , X ) . Indicamos que o eixo horizontal do gráfico está no domínio do tempo com o comando x l a b e l ( ' t   [ s ] ' ) . Rodando o código, vemos que ela tem essa carinha:

Vamos ver essa onda no domínio da frequência. Digite no seu código a função f f t :

Ela terá como entrada o vetor X , que corresponde à nossa onda senoidal no domínio do tempo, e retornará um vetor Y da onda senoidal no domínio da frequência.

Como dissemos acima, a saída de f f t é um vetor cujos elementos são números complexos, no formato:

y = y r + i y i

Onde x r é a componente real e y i , a imaginária. A representação de um sinal no domínio da frequência, o vetor Y , carrega a informação da magnitude do sinal em cada frequência.

A magnitude do sinal é dada pela magnitude do número complexo, que á calculada como:

y = y r 2 + y i 2

Vamos aplicar esse conceito na nossa saída Y de f f t . No nosso script, entre a linha de código:

Com esta linha, calculamos a magnitude de cada elemento do vetor Y usando a função a b s do MATLAB. Quando a entrada da função a b s é um número complexo, ela calcula sua magnitude.

É interessante gerarmos o gráfico de m a g n para vermos como ele ficou. Vamos gerar esse gráfico no domínio da frequência. Para criar o eixo horizontal do gráfico, entre com as linhas de código:

Na primeira linha, calculamos a frequência de amostragem F s , que vimos lá em cima.

Na segunda linha, calculamos o Δ f , que também vimos lá em cima. O Δ f é armazenado na variável d e l t a _ f .

Na terceira linha, geramos o domínio da frequência, representado pelo vetor f _ d o m . A lógica da sua criação é igualzinha à lógica que usamos para criar o vetor t , do domínio do tempo.

Primeiramente, cria-se um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem 2000 elementos, correspondendo aos N = 2000 pontos de medição. Em seguida, esse vetor é multiplicado por d e l t a _ f . Desta forma, é criado o domínio da frequência, que vai de 0 a N - 1 * d e l t a _ f .

Tendo criado o domínio da frequência, vamos usar novamente a função p l o t para gerar o gráfico:

Pedimos ao MATLAB para gerar uma segunda figura com o comando f i g u r e ( 2 ) , para termos o gráfico no domínio da frequência em uma janela diferente do gráfico no domínio do tempo.

Em seguida, com o comando p l o t ( f _ d o m ( 1 : N / 2 ) , m a g n ( 1 : N / 2 ) ) , o gráfico da magnitude de Y , no domínio da frequência, é efetivamente gerado. Repare que, para plotar, usamos somente a primeira metade dos vetores com N elementos f _ d o m e m a g n . Isso é indicado pela adição de ( 1 : N / 2 ) à direita do nome do vetor, que diz ao MATLAB que queremos pegar do primeiro elemento ao elemento N / 2 do vetor.

Usamos somente a primeira metade dos vetores f _ d o m e m a g n porque, no domínio da frequência, a partir de F s / 2 , as magnitudes começam a se repetir e não precisamos pôr elas no gráfico para fazermos a análise dos resultados.

Indicamos que o eixo horizontal do gráfico é o domínio da frequência por meio do comando x l a b e l ( ‘ f   [ H z ] ’ ) . Temos no eixo vertical do gráfico a magnitude de Y , indicado por y l a b e l ( ' | Y | ' ) .

Ao rodarmos o programa, geramos este segundo gráfico:

No gráfico, já marquei ali o ponto do pico de magnitude, para ver as coordenadas dele. Veja que ele ocorre em uma frequência igual a 20   H z , exatamente a mesma frequência da onda senoidal. Isso ocorre pois usamos frequência de amostragem maior que o dobro da frequência da onda. Se você olhar a variável F s , representando a frequência amostral, verá que F s = 1000   H z , muito maior que o dobro da frequência de 20   H z da onda senoidal.

Caso usássemos uma frequência de amostragem menor ou igual a 40   H z , não obedeceríamos ao teorema de Nyquist e não veríamos esse comportamento.

Aplicamos o conceito de magnitude no vetor Y dado por f f t para estudarmos o comportamento do sinal. No exemplo da onda senoidal, vemos pelo gráfico da magnitude de Y que o sinal é periódico.

“Tá, mas já dava pra ver isso no domínio do tempo da onda senoidal”, você deve estar pensando. Por se tratar de uma onda simples e bem conhecida, realmente, poderíamos já ver lá. Mas tem casos em que os sinais são bem mais complexos e precisamos fazer essa análise da magnitude no domínio da frequência para identificar algum comportamento. É o caso, por exemplo, da análise de vibrações de um prédio durante um terremoto.

E aí, curtiu a aula? É um assunto bem complexo, por isso é bom praticar bastante. Bora fazer os exercícios ;D

Domínio do Tempo versus Domínio da Frequência

Exemplo no MATLAB