Transformada de Fourier

Ver Todos os Exercícios

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

Exercícios Resolvidos

Exercício Resolvido #1

Trace um sinal senoidal com as propriedades a seguir:

  • Amplitude: 1
  • Frequência: 10   H z
  • Fase inicial: 0
  • Número total de pontos de dados: 100
  • Tempo de duração: 0 - 1 segundo

Verifique se o método FFT dá a mesma frequência 10   H z .

Passo 1

O exercício nos dá algumas propriedades de uma onda senoidal, no domínio do tempo, e nos pede para aplicar a transformada de Fourier nela. Para isto, usaremos a função f f t do MATLAB.

Para verificar se “o método FFT dá a mesma frequência 10   H z ”, geraremos um gráfico da magnitude da onda senoidal no domínio da frequência, após a aplicação da função f f t , e veremos as coordenadas do primeiro pico de magnitude. O pico de magnitude deve ocorrer na frequência da onda senoidal.

Passo 2

Primeiramente, vamos criar a onda senoidal no MATLAB. Em um novo script, vamos entrar as propriedades de amplitude, frequência, fase inicial e número de pontos:

A amplitude da onda senoidal é armazenada na variável A , a frequência em f , a fase inicial em p h i e o número de pontos em N .

Vamos criar agora o vetor t representando o intervalo de 0 a 1   s de duração da onda. Para criar o vetor t , usaremos o comando:

t   =   ( 0 : N - 1 ) * T

Neste comando, cria-se primeiro um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem N = 100 elementos, correspondendo aos N = 100 pontos de dados. Em seguida, esse vetor é multiplicado por T , que é o período, em segundos, da onda senoidal.

O enunciado não nos dá o período, mas sabemos que a onda tem um intervalo de duração de 0 a 1   s . Logo, o vetor t deve começar em 0 e terminar em 1 . O último elemento de t deve ser igual a:

N - 1 * T = 1

Sabemos que N = 100 , logo o período T é igual a:

T = 1 99   s

Vamos entrar essa informação no MATLAB e construir o vetor t :

O vetor t representa o domínio do tempo da onda senoidal.

Temos todos os dados necessários para construir a onda senoidal no domínio do tempo. No MATLAB, digite este comando para gerar a onda:

A onda senoidal é representada pelo vetor X . Vamos ver a carinha dela? Digite as linhas de código abaixo no seu script para plotar o gráfico da onda senoidal no domínio do tempo:

Na primeira linha, pedimos ao MATLAB para gerar uma figura com o comando f i g u r e ( 1 ) , para termos o gráfico no domínio do tempo em uma janela diferente do gráfico no domínio da frequência (que geraremos mais pra frente, no mesmo script).

Em seguida, com o comando p l o t ( t , X ) , o gráfico da onda senoidal, no domínio do tempo, é efetivamente gerado.

Indicamos que o eixo horizontal do gráfico é o domínio do tempo por meio do comando x l a b e l ( ‘ t   [ s ] ’ ) . Temos no eixo vertical do gráfico os valores da onda senoidal, indicados por y l a b e l ( ' X ' ) .

Ao rodarmos o programa, vemos como é a onda senoidal:

Passo 3

Vamos agora calcular a onda senoidal no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB, que tem a seguinte estrutura:

Y = f f t ( X )

A entrada da função f f t ( ) é um vetor X contendo dados no domínio do tempo, representados por numeros reais. Já 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. Os vetores X e Y têm a mesma quantidade de elementos.

Digite no seu script o comando:

Com esta linha de código, o MATLAB passará a onda senoidal, que está no domínio do tempo e é representada pelo vetor X , para o domínio da frequência. A onda senoidal no domínio da frequência é representada pelo vetor Y .

Para verificarmos se o método FFT dá a mesma frequência de 10   H z , precisamos gerar o gráfico da magnitude da onda senoidal no domínio da frequência.

Passo 4

Para construirmos o gráfico da magnitude da onda senoidal no domínio da frequência, vamos calcular a magnitude usando a função a b s ( ) do MATLAB. Digite no MATLAB 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.

Com esse comando, já temos o eixo vertical do gráfico, agora precisamos criar o eixo horizontal, representando o domínio da frequência. Para isto, digite os comandos:

Na primeira linha, calculamos a frequência de amostragem F s , que é o inverso do período T .

Na segunda linha, calculamos o Δ f , que é o passo do domínio da frequência: ele começa em 0 e as frequências seguintes são obtidas pela soma de Δ f à frequência anterior. O Δ f é calculado dividindo a frequência de amostragem F s pelo número de pontos N e é 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 100 elementos, correspondendo aos N = 100 pontos de dados. 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 .

Após criar o domínio da frequência, vamos usar novamente a função p l o t para gerar o gráfico da magnitude da onda senoidal no domínio da frequência:

Na primeira linha, 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, o gráfico da magnitude de Y no domínio da frequência é criado com o comando p l o t ( f _ d o m ( 1 : N / 2 ) , m a g n ( 1 : N / 2 ) ) . 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 encontrar o que o exercício pede.

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 | ' ) .

Passo 5

Vamos rodar o programa para ver o gráfico da magnitude da onda senoidal no domínio da frequência:

Já marquei no gráfico as coordenadas do pico de magnitude da onda senoidal no domínio da frequência. Ele ocorre em uma frequência de 9,9   H z , muito próxima da frequência da onda senoidal, que é de 10   H z . Logo, podemos dizer que o método FFT dá a mesma frequência 10   H z .

Dica: caso aumentássemos o número de pontos N , teríamos uma maior precisão e a frequência onde ocorre o pico de magnitude seria mais próxima de 10   H z .

Resposta

O método FFT dá a mesma frequência 10   H z da onda senoidal, pois o pico de magnitude ocorre em uma frequência de 9,9   H z , muito próxima de 10   H z .

Exercício Resolvido #2

Gere 128 pontos para o seguinte sinal:

g = 2 sin ⁡ 2 π 50 t

Plote o sinal no domínio do tempo. Usando o método da transformada de Fourier, gere e plote o sinal no domínio da freqüência. Use a escala de H z   no eixo X. Assuma a taxa de amostragem de 1   k H z . Verifique se os picos ocorrem onde era esperado para o domínio da freqüência.

Passo 1

O enunciado nos dá uma função representando um sinal no domínio do tempo e nos pede para:

  1. Plotar o sinal no domínio do tempo;
  2. Aplicar a transformada de Fourier no sinal para obtê-lo no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB;
  3. Plotar o sinal do domínio da frequência, tendo as frequências em H z no eixo X do gráfico;
  4. Verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência.

A partir do enunciado e da equação do sinal, que é uma onda senoidal, podemos obter algumas informações para entrarmos no MATLAB e resolvermos o exercício:

  • O número de pontos que o sinal deve ter é N   =   128 ;
  • A taxa de amostragem é de 1   k H z . Isto quer dizer que a frequência de amostragem F s é 1000   H z ;
  • A partir da frequência de amostragem, obtemos o período T em segundos do sinal: T = 1 / F s = 1 / 1000 = 0,001   s ;
  • Uma onda senoidal normalmente tem o formato:
  • S = A sin ⁡ 2 π f t

    Onde A é a amplitude da onda e f , a frequência em H z .

  • Logo, podemos dizer que a amplitude do sinal é de A = 2 ;
  • E que a frequência do sinal é de f = 50   H z .

Para verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência, devemos olhar o gráfico do sinal no domínio da frequência e ver se o pico ocorre na mesma frequência do sinal: f = 50   H z .

Passo 2

Primeiramente, vamos entrar no MATLAB as informações fornecidas pelo enunciado, que foram listadas logo acima, no passo 1. Em um script novo, digite:

O número de pontos é armazenado na variável N ; a frequência de amostragem na variável F _ s ; o período é calculado e armazenado na variável T ; a amplitude da onda senoidal é armazenada na variável A ; e, finalmente, a frequência do sinal é armazenada em f .

Para fazermos a primeira coisa que o exercício pede – plotar o sinal no domínio do tempo – devemos criar um vetor t representando o domínio do tempo a partir o comando:

t   =   ( 0 : N - 1 ) * T

Neste comando, cria-se primeiro um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem N = 128 elementos, correspondendo aos N = 128 pontos pedidos pelo enunciado. Em seguida, esse vetor é multiplicado por T , que é o período, em segundos, da onda senoidal.

Vamos acrescentar esse comando para calcular o vetor t   no MATLAB e aproveitar e já gerar o sinal no domínio do tempo:

Tendo os vetores t e g , podemos plotar o sinal da onda senoidal no domínio do tempo, por meio dos comandos:

Na primeira linha, pedimos ao MATLAB para gerar uma figura com o comando f i g u r e ( 1 ) , para termos o gráfico no domínio do tempo em uma janela diferente do gráfico no domínio da frequência (que também foi pedido no exercício e que geraremos mais pra frente, no mesmo script).

Em seguida, com o comando p l o t ( t , g ) , o gráfico do sinal no domínio do tempo é gerado.

Indicamos que o eixo horizontal do gráfico é o domínio do tempo por meio do comando x l a b e l ( ‘ t   [ s ] ’ ) . Temos no eixo vertical do gráfico os valores da onda senoidal, indicado por y l a b e l ( ' g ' ) .

Vamos ver a carinha do sinal no domínio do tempo? Rodando o programa que escrevemos até agora, temos este gráfico:

Pronto! O primeiro item pedido pelo exercício está feito!

Passo 3

A segunda coisa que o exercício pede é usarmos a transformada de Fourier no sinal para obtermos a onda senoidal no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB, incluindo a seguinte linha de código em nosso script:

Para calcular a transformada de Fourier, a função f f t ( ) tem como entrada o vetor g , que contém números reais representando o sinal g = 2 sin ⁡ 2 π 50 t no domínio do tempo. Já a saída é um vetor Y com números complexos: é a conversão de g no domínio do tempo para o domínio da frequência. Os vetores g e Y têm a mesma quantidade de elementos.

O segundo item pedido pelo exercício está feito (esse foi bem diretão XD)

Passo 4

Tendo executado o segundo item pedido pelo exercício, partimos para a terceira coisa que ele nos pede para fazer: plotar o sinal no domínio da frequência. Quando plotamos um sinal no domínio da frequência, normalmente temos no eixo Y do gráfico a magnitude do sinal obtido pela função f f t ( ) . Para calcular a magnitude, usamos a função a b s ( ) do MATLAB. Digite no MATLAB 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.

Agora precisamos criar o eixo horizontal, representando o domínio da frequência. Para isto, digite os comandos:

Na primeira linha, calculamos o Δ f , que é o passo do domínio da frequência: ele começa em 0 e as frequências seguintes são obtidas pela soma de Δ f à frequência anterior. O Δ f é calculado dividindo a frequência de amostragem F _ s pelo número de pontos N e é armazenado na variável d e l t a _ f .

Na segunda 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 128 elementos, correspondendo aos N = 128 pontos exigidos pelo enunciado. 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 .

Após criar o domínio da frequência, vamos usar novamente a função p l o t para gerar o gráfico da magnitude da onda senoidal no domínio da frequência:

Na primeira linha, 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, o gráfico da magnitude de Y no domínio da frequência é criado com o comando p l o t ( f _ d o m ( 1 : N / 2 ) , m a g n ( 1 : N / 2 ) ) . 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 encontrar o que o exercício pede.

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 | ' ) .

Vamos ver a cara do sinal do domínio da frequência? Executando o programa, temos:

Voilà! Terceiro item pedido pelo exercício feito ;D

Passo 5

A última coisa que o exercício pede para fazermos é verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência. Para vermos isso, devemos olhar o gráfico do sinal no domínio da frequência e ver se o pico ocorre na mesma frequência do sinal: f = 50   H z .

Vamos clicar no pico do gráfico gerado para ver suas coordenadas:

O pico ocorre em 46,88   H z , que está bem próximo de 50   H z . Logo, o pico do sinal ocorre onde era esperado.

Se quiser, faça alguns testes aumentando o N , você verá que a frequência onde ocorre o pico ficará mais próxima de 50   H z , até se tornar igual a 50   H z .

Resposta

Gráfico do sinal no domínio do tempo:

Gráfico do sinal do domínio da frequência, tendo as frequências em H z no eixo X:

O pico do sinal ocorre onde era esperado no domínio da frequência: próximo de 50   H z , que é a frequência do sinal g = 2 sin ⁡ 2 π 50 t .

Exercício Resolvido #3

Gere 128 pontos para o seguinte sinal:

h = c o s c o s   250 π t   - s i n s i n   200 π t  

Plote o sinal no domínio do tempo. Usando o método da transformada de Fourier e gere e plote o sinal no domínio da frequência. Use a escala de H z   no eixo X. Assuma a taxa de amostragem de 1   k H z . Verifique se os picos ocorrem onde era esperado para o domínio da frequência.

Passo 1

O enunciado nos dá uma função representando um sinal no domínio do tempo e nos pede para:

  1. Plotar o sinal no domínio do tempo;
  2. Aplicar a transformada de Fourier no sinal para obtê-lo no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB;
  3. Plotar o sinal do domínio da frequência, tendo as frequências em H z no eixo X do gráfico;
  4. Verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência.

A partir do enunciado e da equação do sinal, que é composta por ondas cossenodal e seinodal, podemos obter algumas informações para entrarmos no MATLAB e resolvermos o exercício:

  • O número de pontos que o sinal deve ter é N   =   128 ;
  • A taxa de amostragem é de 1   k H z . Isto quer dizer que a frequência de amostragem F s é 1000   H z ;
  • A partir da frequência de amostragem, obtemos o período T em segundos do sinal: T = 1 F s = 1 / 1000 = 0,001   s ;
  • Chamando de:
  • 250 π t   e h 2 = s i n s i n   200 π t  

    Temos:

    h = h 1 - h 2

  • Uma onda cossenoidal normalmente tem o formato:
  • C = A c o s c o s   2 π f t  

    Onde A é a amplitude da onda e f , a frequência em H z .

  • Logo, podemos dizer que a amplitude de h 1 é de A 1 = 1 ;
  • Já a frequência de h 1 é:
  • 2 π f 1 = 250 π

    f 1 = 125   H z

  • Uma onda senoidal normalmente tem o formato:
  • S = A s i n s i n   2 π f t  

  • Logo, podemos dizer que a amplitude de h 2 é de A 2 = 1 ;
  • E que a frequência de h 2 é:
  • 2 π f 2 = 200 π
  • f 2 = 100   H z

Para verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência, devemos olhar o gráfico do sinal no domínio da frequência e ver se os picos ocorrem na mesma frequência das ondas que compõem o sinal: f 1 = 125   H z e f 2 = 100   H z .

Passo 2

Primeiramente, vamos entrar no MATLAB as informações fornecidas pelo enunciado, que foram listadas logo acima, no passo 1. Em um script novo, digite:

O número de pontos é armazenado na variável N ; a frequência de amostragem na variável F _ s ; o período é calculado e armazenado na variável T ; a amplitude da onda 250 π t   é armazenada na variável A 1 e amplitude da onda h 2 = s i n s i n   200 π t   , na variável A 2 ; e, finalmente, a frequência de h 1 em H z é armazenada em f 1 e a frequência de h 2 , em f 2 .

Para fazermos a primeira coisa que o exercício pede – plotar o sinal no domínio do tempo – devemos criar um vetor t representando o domínio do tempo a partir o comando:

t   =   ( 0 : N - 1 ) * T

Neste comando, cria-se primeiro um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem N = 128 elementos, correspondendo aos N = 128 pontos pedidos pelo enunciado. Em seguida, esse vetor é multiplicado por T , que é o período, em segundos, do sinal h .

Vamos acrescentar esse comando para calcular o vetor t   no MATLAB e aproveitar e já gerar o sinal no domínio do tempo:

Nos comandos acima, após criar o vetor t , criamos um vetor chamado h 1 representando a onda cosseinodal h 1 e outro vetor chamado h 2 representando a onda senoidal h 2 .

O sinal h é criado em seguida, fazendo h 1 - h 2 .

Tendo os vetores t e h , podemos plotar o sinal h no domínio do tempo, por meio dos comandos:

Na primeira linha, pedimos ao MATLAB para gerar uma figura com o comando f i g u r e ( 1 ) , para termos o gráfico no domínio do tempo em uma janela diferente do gráfico no domínio da frequência (que também foi pedido no exercício e que geraremos mais pra frente, no mesmo script).

Em seguida, com o comando p l o t ( t , h ) , o gráfico do sinal no domínio do tempo é gerado.

Indicamos que o eixo horizontal do gráfico é o domínio do tempo por meio do comando x l a b e l ( ‘ t   [ s ] ’ ) . Temos no eixo vertical do gráfico o sinal h , indicado por y l a b e l ( ' h ' ) .

Vamos ver a carinha do sinal no domínio do tempo? Rodando o programa que escrevemos até agora, temos este gráfico:

Pronto! O primeiro item pedido pelo exercício está feito!

Passo 3

A segunda coisa que o exercício pede é usarmos a transformada de Fourier no sinal para obtermos a onda h no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB, incluindo a seguinte linha de código em nosso script:

Para calcular a transformada de Fourier, a função f f t ( ) tem como entrada o vetor h , que contém números reais representando o sinal h = c o s c o s   250 π t   - s i n s i n   200 π t   no domínio do tempo. Já a saída é um vetor Y com números complexos: é a conversão de h no domínio do tempo para o domínio da frequência. Os vetores h e Y têm a mesma quantidade de elementos.

Ao incluirmos esse comando no nosso código, o segundo item pedido pelo enunciado está feito (sim, esse passo foi bem curto XD)

Passo 4

Tendo executado o segundo item pedido pelo exercício, partimos para a terceira coisa que ele nos pede para fazer: plotar o sinal no domínio da frequência. Quando plotamos um sinal no domínio da frequência, normalmente temos no eixo Y do gráfico a magnitude do sinal obtido pela função f f t ( ) . Para calcular a magnitude, usamos a função a b s ( ) do MATLAB. Digite no MATLAB 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.

Agora precisamos criar o eixo horizontal, representando o domínio da frequência. Para isto, digite os comandos:

Na primeira linha, calculamos o Δ f , que é o passo do domínio da frequência: ele começa em 0 e as frequências seguintes são obtidas pela soma de Δ f à frequência anterior. O Δ f é calculado dividindo a frequência de amostragem F _ s pelo número de pontos N e é armazenado na variável d e l t a _ f .

Na segunda 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 128 elementos, correspondendo aos N = 128 pontos exigidos pelo enunciado. 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 .

Após criar o domínio da frequência, vamos usar novamente a função p l o t para gerar o gráfico da magnitude da onda h no domínio da frequência:

Na primeira linha, 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, o gráfico da magnitude de Y no domínio da frequência é criado com o comando p l o t ( f _ d o m ( 1 : N / 2 ) , m a g n ( 1 : N / 2 ) ) . 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 encontrar o que o exercício pede.

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 | ' ) .

Vamos ver a cara do sinal do domínio da frequência? Executando o programa, temos:

Voilà! Terceiro item pedido pelo exercício feito ;D

Passo 5

A última coisa que o exercício pede para fazermos é verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência. Para vermos isso, devemos olhar o gráfico do sinal no domínio da frequência e ver se os picos ocorrem na mesma frequência das duas ondas que compõem o sinal: f 1 = 125   H z e f 2 = 100   H z .

Vamos clicar em cima dos picos no gráfico gerado do MATLAB, para vermos suas coordenadas. Vamos clicar no primeiro pico, mais à esquerda:

Viu que ele ocorre em 101,6   H z ? Bem próximo da frequência de h 2 = s i n s i n   200 π t   , que é f 2 = 100   H z .

Clicando no segundo pico, mais à direita:

Ele ocorre exatamente em 125   H z , mesma frequência de 250 π t   .

Portanto, os picos do sinal no domínio da frequência ocorrem onde eram esperados.

Se quiser, faça alguns testes aumentando o N , você verá que as frequências onde ocorrem os picos ficarão mais próximas de f 1 e f 2 , até se tornarem iguais a 100   H z e 125   H z .

Resposta

Gráfico do sinal no domínio do tempo:

Gráfico do sinal do domínio da frequência, tendo as frequências em H z no eixo X:

Os picos do sinal no domínio da frequência ocorrem onde eram esperados: nas frequências de 100   H z e 125   H z , correspondendo às frequências das ondas que compõem o sinal h .

Exercício Resolvido #4

Gere 128 pontos para o seguinte sinal:

k = 5 - cos ⁡ 1000 t

Plote o sinal no domínio do tempo. Usando o método da transformada de Fourier e gere e plote o sinal no domínio da freqüência. Use a escala de H z   no eixo X. Assuma a taxa de amostragem de 1   k H z . Verifique se os picos ocorrem onde era esperado para o domínio da freqüência.

Passo 1

O enunciado nos dá uma função representando um sinal no domínio do tempo e nos pede para:

  1. Plotar o sinal no domínio do tempo;
  2. Aplicar a transformada de Fourier no sinal para obtê-lo no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB;
  3. Plotar o sinal do domínio da frequência, tendo as frequências em H z no eixo X do gráfico;
  4. Verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência.

A partir do enunciado e da equação do sinal, que é uma onda cossenoidal, podemos obter algumas informações para entrarmos no MATLAB e resolvermos o exercício:

  • O número de pontos que o sinal deve ter é N   =   128 ;
  • A taxa de amostragem é de 1   k H z . Isto quer dizer que a frequência de amostragem F s é 1000   H z ;
  • A partir da frequência de amostragem, obtemos o período T em segundos do sinal: T = 1 / F s = 1 / 1000 = 0,001   s ;
  • Uma onda cossenoidal normalmente tem o formato:
  • C = A cos ⁡ 2 π f t

    Onde A é a amplitude da onda e f , a frequência em H z .

  • Logo, podemos dizer que a amplitude do sinal é de A = 1 ;
  • E que a frequência do sinal é:

2 π f = 1000

f = 1000 2 π ≈ 1 59   H z

Para verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência, devemos olhar o gráfico do sinal no domínio da frequência e ver se o pico ocorre na mesma frequência do sinal: f ≈ 1 59   H z .

Passo 2

Primeiramente, vamos entrar no MATLAB as informações fornecidas pelo enunciado, que foram listadas logo acima, no passo 1. Em um script novo, digite:

O número de pontos é armazenado na variável N ; a frequência de amostragem na variável F _ s ; o período é calculado e armazenado na variável T ; e a amplitude da onda cossenoidal é armazenada na variável A .

Para fazermos a primeira coisa que o exercício pede – plotar o sinal no domínio do tempo – devemos criar um vetor t representando o domínio do tempo a partir o comando:

t   =   ( 0 : N - 1 ) * T

Neste comando, cria-se primeiro um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem N = 128 elementos, correspondendo aos N = 128 pontos pedidos pelo enunciado. Em seguida, esse vetor é multiplicado por T , que é o período, em segundos, da onda senoidal.

Vamos acrescentar esse comando para calcular o vetor t   no MATLAB e aproveitar e já gerar o sinal no domínio do tempo:

Tendo os vetores t e k , podemos plotar o sinal da onda cossenoidal no domínio do tempo, por meio dos comandos:

Na primeira linha, pedimos ao MATLAB para gerar uma figura com o comando f i g u r e ( 1 ) , para termos o gráfico no domínio do tempo em uma janela diferente do gráfico no domínio da frequência (que também foi pedido no exercício e que geraremos mais pra frente, no mesmo script).

Em seguida, com o comando p l o t ( t , k ) , o gráfico do sinal no domínio do tempo é gerado.

Indicamos que o eixo horizontal do gráfico é o domínio do tempo por meio do comando x l a b e l ( ‘ t   [ s ] ’ ) . Temos no eixo vertical do gráfico os valores da onda cossenoidal, indicado por y l a b e l ( ' k ' ) .

Vamos ver a carinha do sinal no domínio do tempo? Rodando o programa que escrevemos até agora, temos este gráfico:

Tcharam! Primeiro ponto pedido pelo exercício resolvido.

Passo 3

A segunda coisa que o exercício pede é usarmos a transformada de Fourier no sinal para obtermos a onda cossenoidal no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB, incluindo a seguinte linha de código em nosso script:

Para calcular a transformada de Fourier, a função f f t ( ) tem como entrada o vetor k , que contém números reais representando o sinal k = 5 - cos ⁡ 1000 t no domínio do tempo. Já a saída é um vetor Y com números complexos: é a conversão de k no domínio do tempo para o domínio da frequência. Os vetores k e Y têm a mesma quantidade de elementos.

Pronto! Segundo pedido do exercício atendido ;D

Passo 4

Tendo executado o segundo item pedido pelo exercício, partimos para a terceira coisa que ele nos pede para fazer: plotar o sinal no domínio da frequência. Quando plotamos um sinal no domínio da frequência, normalmente temos no eixo Y do gráfico a magnitude do sinal obtido pela função f f t ( ) . Para calcular a magnitude, usamos a função a b s ( ) do MATLAB. Digite no MATLAB 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.

Agora precisamos criar o eixo horizontal, representando o domínio da frequência. Para isto, digite os comandos:

Na primeira linha, calculamos o Δ f , que é o passo do domínio da frequência: ele começa em 0 e as frequências seguintes são obtidas pela soma de Δ f à frequência anterior. O Δ f é calculado dividindo a frequência de amostragem F _ s pelo número de pontos N e é armazenado na variável d e l t a _ f .

Na segunda 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 128 elementos, correspondendo aos N = 128 pontos exigidos pelo enunciado. 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 .

Após criar o domínio da frequência, vamos usar novamente a função p l o t para gerar o gráfico da magnitude da onda cossenoidal no domínio da frequência:

Na primeira linha, 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, o gráfico da magnitude de Y no domínio da frequência é criado com o comando p l o t ( f _ d o m ( 1 : N / 2 ) , m a g n ( 1 : N / 2 ) ) . 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 encontrar o que o exercício pede.

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 | ' ) .

Vamos ver como o sinal k ficou no domínio da frequência? Ao rodar o programa, temos o seguinte gráfico:

Terceiro item do exercício feito ;) Bora encerrar respondendo à última coisa pedida pelo exercício.

Passo 5

A última coisa que o exercício pede para fazermos é verificar se os picos do sinal ocorrem onde era esperado no domínio da frequência. Para vermos isso, devemos olhar o gráfico do sinal no domínio da frequência e ver se o pico ocorre na mesma frequência do sinal, que é aproximadamente f ≈ 1 59   H z .

“Ué, mas o gráfico tem dois picos”, você deve ter reparado. Vamos ver as coordenadas dos dois, clicando neles no gráfico:

Vamos analisar primeiro o pico mais à direita, que ocorre a uma frequência de 156,3   H z , muito próxima dos 159   H z da função cosseno do sinal k . Logo, este pico ocorre onde era esperado.

Se quiser, faça alguns testes aumentando o N , você verá que a frequência onde ocorre o pico mais à direita ficará mais próxima de 159   H z .

Você deve estar estranhando o primeiro pico, que ocorre a uma frequência de 0   H z . Vamos rever o sinal k :

k = 5 - cos ⁡ 1000 t

Podemos reescrever o sinal da seguinte forma:

k = 5 cos ⁡ 0 t - cos ⁡ 1000 t

A constante 5 do sinal k pode ser interpretada como uma onda cossenoidal de frequência 0   H z . Como o sinal k é composto de duas ondas cossenoidais, há dois picos em k no domínio da frequência, cada um ocorrendo na frequência de cada onda. Como uma das duas ondas tem frequência de 0   H z , há um pico em 0   H z . Legal, né?

Portanto, os picos no domínio da frequência ocorrem onde eram esperados.

Resposta

Gráfico do sinal no domínio do tempo:

Gráfico do sinal do domínio da frequência, tendo as frequências em H z no eixo X:

Os picos do sinal k = 5 - cos ⁡ 1000 t   ocorrem onde eram esperados no domínio da frequência:

  • O primeiro ocorre em 0   H z , correspondendo à frequência da primeira componente do sinal ( 5 );
  • O segundo ocorre em 156,3   H z , correspondendo à frequência da segunda componente do sinal ( cos ⁡ 1000 t ).

Exercício Resolvido #5

Neste exercício, você encontrará o conteúdo de espectro e frequência do seu próprio sinal de voz.

  1. Vá ao site https://online-voice-recorder.com/pt/ e grave uma fala sua. Você pode dizer o que quiser ou ler a frase abaixo:
  2. “No Responde Aí, é como se você estivesse estudando do lado daquele amigo que sabe tudo.”

  3. Escute ao sinal do seu áudio e então leia-o no MATLAB usando a função a u d i o r e a d ( ) .
  4. Determine o espectro de frequência do sinal de voz.
  5. Plote o sinal no domínio do tempo e no domínio da frequência no mesmo gráfico, como na figura abaixo:

Passo 1

O exercício pede para gravarmos nossa própria voz e entrarmos com o arquivo de áudio no MATLAB (por meio de uma função que vamos conhecer no exercício de hoje, a u d i o r e a d ( ) ) para vermos o sinal da nossa voz no domínio do tempo e no domínio da frequência.

Nossa voz, quando gravada, está no domínio do tempo. Para convertê-la para o domínio da frequência, usaremos a função f f t ( ) .

Passo 2

Vamos começar pela letra a. Vamos no site recomendado pelo enunciado para gravarmos nossa voz. Ao abrir o site no navegador, você verá que tem um botão vermelho (indicado pela seta na figura abaixo), no qual você deve clicar para iniciar a gravação:

Ao iniciar a gravação, fale a frase que desejar ou a sugerida pelo enunciado. Para encerrar a gravação, aperte o botão de “Stop” no site (destacado abaixo).

Você pode escutar sua gravação antes de salvar o áudio em formato mp3, clicando no botão destacado abaixo.

Salve o áudio na pasta onde você salvará o script do MATLAB onde você escreverá o código deste exercício.

Passo 3

Feita a letra a, vamos fazer a letra b. Primeiro, escute o áudio que você gravou. Não se preocupe, eu te espero.

Em seguida, crie um script novo no MATLAB, salve-o na pasta onde você salvou a gravação da sua voz e digite o comando:

Esta é a função a u d i o r e a d ( ) do MATLAB. Ela lê arquivos de áudio e tem como entrada um string do nome do arquivo de áudio a ser lido. No meu caso, eu salvei a gravação da minha voz como minha_voz.mp3, por isso a entrada do comando acima é ' m i n h a _ v o z . m p 3 ' . Lembre-se de alterar para o nome do seu arquivo de áudio.

A função a u d i o r e a d ( ) retorna duas saídas: o vetor y , que é o sinal do áudio do arquivo de entrada no domínio do tempo, e a frequência de amostragem F s do sinal.

Tendo concluído a letra b, vamos para a letra c.

Passo 4

Na letra c , temos que determinar o espectro de frequência do sinal de voz, isto é, analisá-la no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB no vetor y , obtido no passo 3, que converte sinais no domínio do tempo para o domínio da frequência.

Digite em seu script o comando:

A função f f t ( ) tem como entrada o vetor y , que contém números reais representando o sinal da gravação da nossa voz no domínio do tempo. Já a saída é um vetor Y com números complexos: é a conversão de y no domínio do tempo para o domínio da frequência. Os vetores y e Y têm a mesma quantidade de elementos.

O vetor Y é o espectro de frequência do sinal de voz, logo, a letra c está concluída.

Passo 5

Vamos resolver a letra d, que pede pra plotarmos, em um mesmo gráfico, o sinal da nossa voz no domínio do tempo e no domínio da frequência.

Vamos começar gerando as informações para plotar o sinal no domínio do tempo. Precisamos criar um vetor t que representará o domínio do tempo, em segundos, e será o eixo X do gráfico do sinal no domínio do tempo. O vetor t será criado a partir do comando:

t   =   ( 0 : N - 1 ) * T

Neste comando, cria-se primeiro um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem N   elementos, correspondendo aos N pontos medidos na nossa gravação de voz. Em seguida, esse vetor é multiplicado por T , que é o período, em segundos, do sinal.

Precisamos, então, primeiro determinar N e T antes de calcular o vetor t .

Como N é o número de pontos medidos, ele corresponde ao número de elementos do vetor y , que é o sinal de áudio no domínio do tempo. Logo, para obter, podemos fazer N = l e n g t h ( y ) , pois a função l e n g t h ( ) retorna a quantidade de elementos de um vetor.

O período T do sinal é o inverso da frequência de amostragem F s , isto é, T   =   1 / F s . A frequência de amostragem foi obtida no passo 3, com o a u d i o r e a d ( ) .

Logo, adicione em seu script os seguintes comandos para criar o vetor t representando o domínio do tempo:

Por curiosidade: se você rodar o programa que digitou até agora e pedir ao MATLAB para ver o último elemento do vetor t , com o comando t ( e n d ) , no Command Window, você verá que ele corresponde à duração da gravação do seu áudio, em segundos. No meu caso, minha gravação tinha um pouco mais de 8 segundos:

Com os vetores t e y , conseguimos plotar o sinal da nossa voz no domínio do tempo.

Passo 6

Agora, vamos gerar as informações para plotar o espectro de frequência da gravação da nossa voz, isto é, o sinal de nossa voz no domínio da frequência.

Quando plotamos um sinal no domínio da frequência, normalmente temos no eixo vertical do gráfico a magnitude do sinal obtido pela função f f t ( ) . Para calcular a magnitude, usamos a função a b s ( ) do MATLAB. Digite no MATLAB 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.

Agora precisamos criar o eixo horizontal do gráfico, representando o domínio da frequência. Para isto, digite os comandos:

Na primeira linha, calculamos o Δ f , que é o passo do domínio da frequência: ele começa em 0 e as frequências seguintes são obtidas pela soma de Δ f à frequência anterior. O Δ f é calculado dividindo a frequência de amostragem F s pelo número de pontos N e é armazenado na variável d e l t a _ f .

Na segunda 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 N elementos, correspondendo aos N pontos capturados do sinal da nossa gravaçã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 .

Com os vetores f _ d o m e m a g n , conseguimos plotar o sinal da nossa voz no domínio da frequência.

Passo 7

Pra gerar o gráfico pedido na letra d, usaremos o comando s u b p l o t do MATLAB.

Digite em seu script as seguintes linhas de código para gerar o gráfico:

Na primeira linha, com o comando s u b p l o t ( ) , pedimos ao MATLAB para dividir a janela onde serão gerados os gráficos em uma “tabela” de duas linhas e uma coluna. Em seguida, indicamos que vamos plotar o gráfico da primeira linha da “tabela”.

Na segunda linha, com o comando p l o t ( t , y ) , o gráfico do sinal da nossa voz no domínio do tempo é gerado.

Na terceira linha, indicamos que o eixo horizontal do gráfico é o domínio do tempo por meio do comando x l a b e l ( ‘ t   [ s ] ’ ) .

Na quarta linha, indicamos que vamos plotar o segundo gráfico, na segunda linha da “tabela” criada pelo s u b p l o t .

Em seguida, na quinta linha, o gráfico da magnitude de Y no domínio da frequência é criado com o comando p l o t ( f _ d o m ( 1 : N / 2 ) , m a g n ( 1 : N / 2 ) ) . 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.

Finalmente, na última linha, 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 ] ’ ) .

Ao executar o programa, teremos o gráfico pedido na letra d.

Resposta

A figura abaixo contém o gráfico do sinal da gravação de áudio no domínio do tempo (gráfico acima) e o gráfico do sinal no domínio da frequência (gráfico abaixo)

Exercício Resolvido #6

O sinal x t = cos ⁡ ( 200 t ) foi amostrado a uma taxa de F s = 500 amostras por segundo durante 0,3 segundos.

  1. Plote o sinal
  2. Estime o espectro desse sinal usando f f t . Plote a magnitude do sinal no domínio da frequência
  3. Estime de novo o espectro do sinal. Desta vez, adicione zeros no final do sinal de forma que seu comprimento seja igual ao dobro do comprimento original. Plote sua magnitude no domínio da frequência
  4. Considerando as letras [b.] e [c.], por que existem dois picos principais?
  5. Considerando a letra [b.], quais são as frequências (em H z ) dos dois picos? Por que estes picos estão nessas frequências?
  6. Considerando a letra [c.], quais são as frequências (em H z ) dos dois picos? Por que estes picos estão nessas frequências?
  7. Por que a frequência onde ocorre o primeiro pico das letras [e.] e [f.] é diferente? Qual letra ([e.] ou [f.]) tem a estimativa mais precisa? Como este resultado poderia ser melhorado?

Passo 1

Neste exercício, vamos calcular a transformada de Fourier de x ( t ) considerando duas quantidades diferentes de pontos de medição. Desta forma, vamos poder ver o impacto do númeto de pontos medidos sobre a precisão dos resultados no espectro da frequência.

Quando a questão pede para “estimar o espectro” do sinal, na prática ele pede para aplicarmos f f t em x t e plotar o gráfico da magnitude do sinal no domínio da frequência.

Passo 2

A letra a do exercício pede para plotarmos x ( t ) . Para fazermos isso, precisamos criar um vetor t representando o intervalo de tempo da medição, que vai de 0 a 0,3 segundos. Para construir esse vetor, precisamos do período T da amostra, que é definido como o inverso da frequência de amostragem, isto é, T = 1 F s . O enunciado diz que F s   =   500   H z , por isso, em um script novo do MATLAB, defina o período T com as linhas de código:

Com T calculado, podemos criar o vetor t representando o intervalo de 0 a 0,3   s . Para criar o vetor t , usaremos o comando:

t   =   ( 0 : N - 1 ) * T

Neste comando, cria-se primeiro um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem N elementos, correspondendo aos N pontos de dados. Em seguida, esse vetor é multiplicado por T , que é o período, em segundos, do sinal.

O enunciado não nos dá o número de pontos N , mas podemos calculá-lo sabendo a medição durou 0,3   s . Isto quer dizer que o vetor t deve começar em 0 e terminar em 0,3 . Logo, o último elemento de t deve ser igual a:

N - 1 * T = 0,3

Como conhecemos T , podemos obter N a partir da equação acima. Temos que N é igual a:

N = 0,3 + T T

No seu script, entre com essa equação para calcular N , construa o vetor t e entre com x ( t ) :

Com isso, temos tudo o que precisamos para plotar x ( t ) . Digite as linhas de código abaixo no seu script para plotar x ( t ) no domínio do tempo:

Na primeira linha, pedimos ao MATLAB para gerar uma figura com o comando f i g u r e ( 1 ) , para termos o gráfico no domínio do tempo em uma janela diferente dos gráficos no domínio da frequência (que geraremos mais pra frente, pra resolver as letras b e c, no mesmo script).

Em seguida, com o comando p l o t ( t , x ) , o gráfico de x ( t ) , no domínio do tempo, é efetivamente gerado.

Indicamos que o eixo horizontal do gráfico é o domínio do tempo por meio do comando x l a b e l ( ‘ t   [ s ] ’ ) . Temos no eixo vertical do gráfico os valores de x ( t ) , indicados por y l a b e l ( ' x ( t ) ' ) .

Ao rodarmos o programa, temos a solução da letra a:

Passo 3

A letra b pede para estimar o espectro do sinal usando f f t , em outras palavras, para calcular o sinal no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB, que tem a seguinte estrutura:

Y = f f t ( X )

A entrada da função f f t ( ) é um vetor X contendo dados no domínio do tempo, representados por números reais. Já 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. Os vetores X e Y têm a mesma quantidade de elementos.

Digite no seu script o comando:

Com esta linha de código, o MATLAB passará o sinal x ( t ) , que está no domínio do tempo e é representada pelo vetor x , para o domínio da frequência. O sinal no domínio da frequência é representada pelo vetor y .

A letra b também pede para plotar a magnitude do sinal no domínio da frequência. Vamos calcular a magnitude usando a função a b s ( ) do MATLAB. Digite no MATLAB a linha de código:

Com esta linha, calculamos a magnitude de cada elemento do vetor y .

Já temos o eixo vertical do gráfico, agora precisamos criar o eixo horizontal, representando o domínio da frequência. Para isto, digite os comandos:

Na primeira linha, calculamos o Δ f , que é o passo do domínio da frequência: ele começa em 0 e as frequências seguintes são obtidas pela soma de Δ f à frequência anterior. O Δ f é calculado dividindo a frequência de amostragem F s pelo número de pontos N e é armazenado na variável d e l t a _ f .

Na segunda 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 ), com N elementos. 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 .

Após criar o domínio da frequência, vamos usar novamente a função p l o t para gerar o gráfico da magnitude do sinal no domínio da frequência:

Na primeira linha, 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, o gráfico da magnitude de y no domínio da frequência é criado com o comando p l o t ( f _ d o m , m a g n ) .   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 | ' ) .

Execute o programa para ter a solução da letra b:

Passo 4

A letra c pede para calcular novamente o sinal no domínio da frequência, mas adicionando zeros no final do sinal para dobrar o comprimento original. Para adicionar os zeros no sinal, vamos concatenar o vetor x , que representa o sinal x ( t ) , com um vetor de zeros que tenha o mesmo comprimento de x , adicionando ao nosso script a linha de código:

Nesta linha, criamos um vetor de zeros com a função z e r o s do MATLAB, que cria uma matriz de zeros com uma linha e l e n g t h ( x ) colunas. O comando l e n g t h ( x ) retorna o número de elementos do vetor x . Portanto, z e r o s ( 1 , l e n g t h ( x ) ) vai nos dar um vetor de zeros de mesmo tamanho de x .

A concatenação dos vetores é feita colocando-os dentro de colchetes. Isto cria um vetor x 2 cuja primeira metade dos elementos é igual a x e a segunda metade, um monte de zeros.

Vamos calcular o sinal novo no domínio da frequência, usando f f t :

O novo sinal no domínio da frequência é representada pelo vetor y 2 .

A letra c também pede para plotar a magnitude do sinal novo no domínio da frequência. Novamente, vamos usar a função a b s ( ) para calcular a magnitude y 2 :

O resultado é armazenado no vetor m a g n 2 , que será o eixo vertical do gráfico.

Precisamos recriar o eixo horizontal representando o domínio da frequência, pois a adição dos zeros alterou o número de pontos da medição. O novo número de pontos N 2 é igual à quantidade de elementos de x 2 , dada pela função l e n g t h :

Com o novo número de pontos, precisamos recalcular o passo do domínio da frequência e atualizar o domínio da frequência, com os comandos:

O novo passo é d e l t a _ f 2 e o novo domínio é o vetor f _ d o m 2 .

vamos usar novamente a função p l o t para plotar a magnitude do novo sinal no domínio da frequência:

Na primeira linha, pedimos ao MATLAB para gerar uma terceira figura com o comando f i g u r e ( 3 ) . Em seguida, o gráfico da magnitude de y 2 no domínio da frequência é criado com o comando p l o t ( f _ d o m 2 , m a g n 2 ) .  

Execute o programa para ter a solução da letra c:

Passo 5

A letra d pergunta por que os dois gráficos no domínio da frequência tem dois picos principais. Isso ocorre porque 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, de forma espelhada. Na prática, poderíamos só plotar a primeira metade do gráfico.

Passo 6

A letra e pergunta em quais frequências ocorrem os dois picos no gráfico gerado na letra b e por que os picos ocorrem nessas frequências.

No print abaixo temos o gráfico da letra b com as coordenadas dos dois picos:

O primeiro pico ocorre a uma frequência de 33,11   H z e o segundo, a 466,9   H z (que é exatamente igual a 500   H z - 33,11   H z , reforçando a resposta da letra d).

O gráfico acima é o sinal x t = cos ⁡ ( 200 t ) no domínio da frequência. A frequência de x ( t ) é igual a:

f = 200 2 π ≅ 31 , 831   H z

Os picos de sinais periódicos no domínio da frequência ocorrem na frequência máxima do sinal quando a frequência de amostragem ( F s   =   500   H z ) é pelo menos o dobro da frequência da onda ( f ≅ 31 , 831   H z ). Este é o teorema de amostragem de Nyquist. No gráfico acima, o primeiro pico ocorre a 33,11   H z , uma frequência muito próxima de f . Isso ocorre porque o teorema de amostragem de Nyquist foi respeitado.

Passo 7

A letra f pergunta em quais frequências ocorrem os dois picos no gráfico gerado na letra c e por que os picos ocorrem nessas frequências.

No print abaixo temos o gráfico da letra c com as coordenadas dos dois picos:

O primeiro pico ocorre a uma frequência de 3 1 , 46   H z e o segundo, a 46 8 , 5   H z (que é exatamente igual a 500   H z - 3 1 , 46     H z ).

O gráfico acima é o sinal x t = cos ⁡ ( 200 t ) com o dobro de pontos no domínio da frequência. Como vimos no passo anterior, a frequência de x ( t ) é igual a f ≅ 31 , 831   H z . Como neste caso o teorema de amostragem de Nyquist também foi respeitado, temos que o primeiro pico ocorre a uma frequência muito próxima de f , até mais próxima do que o caso original.

Passo 8

A letra g pergunta por que a frequência onde ocorre o primeiro pico das letras e e g é diferente, qual das duas tem a estimativa mais precisa e como podemos melhorar o resultado.

A frequência onde ocorrem os picos é diferente porque o número de pontos da amostra é diferente ( N ≠ N 2 ). A letra g, que tem o espectro de x ( t ) com o dobro de pontos, é a estimativa mais precisa, exatamente por ter mais pontos. Isso é evidenciado pelo fato de o primeiro pico da letra g ocorre em uma frequência ( 3 1 , 46   H z ) mais próxima à frequência de x t ( f ≅ 31 , 831   H z ). Para melhorar o resultado, podemos diminuir o período T de amostragem, ou seja, podemos aumentar a frequência de amostragem F s . Isso faz com que tenhamos mais pontos na amostra, deixando o resultado mais preciso.

Resposta

  1. 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, de forma espelhada.
  2. O primeiro pico ocorre a uma frequência de 33,11   H z e o segundo, a 466,9   H z . Segundo o teorema de amostragem de Nyquist, os picos de sinais periódicos no domínio da frequência ocorrem na frequência máxima do sinal no domínio do tempo quando a frequência de amostragem é pelo menos o dobro da frequência da onda.
  3. O primeiro pico ocorre a uma frequência de 3 1 , 46   H z e o segundo, a 46 8 , 5   H z . Os picos ocorrem nessa frequência por causa do teorema de amostragem de Nyquist.
  4. A frequência onde ocorrem os picos é diferente porque o número de pontos da amostra é diferente. A letra g, que tem o espectro de x ( t ) com o dobro de pontos, é a estimativa mais precisa. Isso é evidenciado pelo fato de o primeiro pico da letra g ocorre em uma frequência ( 31,46   H z ) mais próxima à frequência de x t ( f ≅ 31,831   H z ). Para melhorar o resultado, podemos diminuir o período T de amostragem, ou seja, podemos aumentar a frequência de amostragem F s . Isso faz com que tenhamos mais pontos de medição, deixando o resultado mais preciso.

Exercício Resolvido #7

Uma propriedade da Transformada de Fourier é que a transformada da convolução de duas funções equivale à multiplicação das duas no domínio da freqüência. Portanto, para calcular a convolução de uma função levamos os dois sinais para o domínio da freqüência, os multiplicamos e voltamos para o domínio do tempo.

Digamos que você queira calcular a convolução c ( t ) das funções x t e h ( t ) . Você pode fazer isso da seguinte maneira:

c t = x t * h t = i f f t { f f t [ x ( t ) ] ∙ f f t [ h ( t ) ] }

Considerando essa propriedade, calcule a convolução das formas de onda:

x t = e - 5 t e h t = cos ⁡ ( 2,5 t ) - t

Passo 1

Neste exercício, vamos usar o comando f f t e i f f t (comando novo que vamos aprender aqui!) para calcular x t * h t . No nosso programa, vamos primeiramente entrar com x ( t ) e h ( t ) no domínio do tempo. Em seguida, aplicaremos em x ( t ) e h ( t ) a função do MATLAB f f t para calcular as funções no domínio da frequência e então multiplicaremos os resultados entre si.

No resultado da multiplicação, vamos usar a função do MATLAB i f f t , que calcula a inversa da transformada de Fourier, para voltar ao domínio do tempo. A saída de i f f t é a convolução de x ( t ) e h ( t ) e a solução do exercício.

Passo 2

Em um script novo, vamos criar um vetor t representando o domínio do tempo e, em seguida, entrar com x ( t ) e h ( t ) :

Na primeira linha, criamos o vetor t , que vai de 0 a 5 , com um passo de 0,01 .

Na segunda e na terceira linha, calculamos x ( t ) e h ( t ) para cada elemento do vetor t . Os resultados são armazenados nos vetores x e h , respectivamente. Portanto, os vetores x e h representam x ( t ) e h ( t ) em um domínio de tempo 0 ≤ t ≤ 5 .

Para ver a cara de x ( t ) e h ( t ) plotando suas curvas em um mesmo gráfico, digite os comandos abaixo:

Na primeira linha, pedimos ao MATLAB para gerar uma figura com o comando f i g u r e ( 1 ) , para termos o gráfico de x ( t ) e h ( t ) em uma janela diferente do gráfico do resultado da convolução (que será gerado mais pra frente). Em seguida, com o comando p l o t ( t , x ,   t , h ) , as curvas de x em função de t e h em função de t são geradas.

O comando l e g e n d fará com que o gráfico tenha uma legenda, indicando quem é x e quem é h . As legendas dentro de l e g e n d devem estar na mesma ordem das curvas em p l o t .

Execute o programa para ver o gráfico de x ( t ) e h ( t ) :

Passo 3

Após definir x ( t ) e h ( t ) , vamos aplicar a transformada de Fourier neles para calculá-los no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB, que tem a sintaxe:

Y = f f t ( X )

A entrada da função f f t ( ) é um vetor X contendo dados no domínio do tempo, representados por números reais. Já 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. Os vetores X e Y têm a mesma quantidade de elementos.

Logo, digite em seu programa as duas linhas de código:

Na primeira linha, calculamos a transformada de Fourier de x ( t ) e armazenamos o resultado em f f t x . Na segunda linha, fazemos a mesma coisa pata h ( t ) , cuja transformada é armazenada em f f t h .

O próximo passo é multiplicar as funções no domínio da frequência uma pela outra. Para isto, multiplicaremos o vetor f f t x por f f t h , elemento a elemento, entrando com a seguinte linha de código:

Usando o operador . * , multiplicamos cada elemento de f f t x pelo elemento de   f f t h que está na mesma posição. O resultado dessa operação é armazenado em f f t c , que representa a convolução no domínio da frequência.

Passo 4

O vetor f f t c está no domínio da frequência e teremos o resultado da convolução x t * h ( t ) ao passá-lo para o domínio do tempo. Para isto, usaremos a função i f f t ( ) do MATLAB, que tem a sintaxe:

X = i f f t ( Y )

A entrada da função i f f t ( ) é um vetor Y contendo dados no domínio da frequência, representados por números complexos. Já a saída é um vetor X com números reais: é a conversão de Y no domínio da frequência para o domínio do tempo. Os vetores X e Y têm a mesma quantidade de elementos.

Resumindo, i f f t faz o inverso de f f t , calculando a transformada de Fourier inversa de uma função no domínio da frequência.

Portanto, inclua em seu código o comando:

Para ver o resultado da convolução, plote c em função de t (o domínio do tempo) com as linhas de código:

Na primeira linha, pedimos ao MATLAB para gerar uma segunda figura com o comando f i g u r e ( 2 ) , para termos o gráfico do resultado da convolução em uma janela separada do primeiro gráfico. Em seguida, usamos o comando p l o t para plotar a curva da solução da convolução x t * h ( t ) . Execute o programa para ver o gráfico.

Resposta

Exercício Resolvido #8

O sinal de uma onda quadrada com frequência de f = 3   H z tem N = 1024 pontos e foi amostrado a uma taxa de F s = 150 amostras por segundo. Plote a onda quadrada no domínio do tempo e use o método da transformada de Fourier para plotar a magnitude do sinal no domínio da freqüência.

Passo 1

O exercício pede para plotarmos uma onda quadrada no domínio do tempo e sua magnitude no domínio da frequência. Para criar a onda quadrada no domínio do tempo, vamos aprender uma função nova do MATLAB: s q u a r e .

Tendo criado a onda com s q u a r e , aplicaremos a função f f t na onda para termos a transformada de Fourier dela e plotar sua magnitude no domínio da frequência.

Passo 2

Primeiramente, vamos entrar no MATLAB as informações fornecidas pelo enunciado: a frequência f da onda quadrada, a taxa de amostragem F s e o número de pontos N :

Em seguida, podemos calcular o período de amostragem T (que é o inverso de F s ) e criar um vetor t representando o domínio do tempo:

Para construir o vetor t , cria-se primeiro um vetor que vai de 0 a N - 1 , com passo de 1 ( 0 : N - 1 ). Este vetor tem N = 1024 elementos, correspondendo aos N = 1024 pontos do sinal. Em seguida, esse vetor é multiplicado por T .

Tendo definido o domínio do tempo, podemos construir a onda quadrada, por meio do comando s q u a r e , que tem a sintaxe:

x = s q u a r e ( w ∙ t )

Ela retorna uma onda quadrada de amplitude 1 com frequência w   r a d / s para um vetor t representando o tempo. A onda quadrada é armazenada no vetor x .

Em seu programa, adicione o comando:

Este comando gerará a onda quadrada de frequência f = 5   H z com vetor t que criamos acima. Note que a frequência foi convertida de H z para r a d / s , fazendo w = 2 π f .

Passo 3

Para plotar a onda quadrada no domínio do tempo, entre com as linhas de código:

Na primeira linha, pedimos ao MATLAB para gerar uma figura com o comando f i g u r e ( 1 ) , para termos o gráfico no domínio do tempo em uma janela diferente do gráfico no domínio da frequência. Em seguida, com o comando p l o t ( t , x ) , o gráfico da onda quadrada no domínio do tempo é efetivamente gerado.

Indicamos que o eixo horizontal do gráfico é o domínio do tempo por meio do comando x l a b e l ( ‘ t   [ s ] ’ ) . Temos no eixo vertical do gráfico os valores de x ( t ) , indicados por y l a b e l ( ' x ( t ) ' ) .

Rodando o programa, temos o gráfico da onda quadrada:

Passo 4

Vamos aplicar o método da transformada de Fourier para plotar a magnitude do sinal no domínio da frequência. Para isto, usaremos a função f f t ( ) do MATLAB, que tem a seguinte estrutura:

Y = f f t ( X )

A entrada da função f f t ( ) é um vetor X contendo dados no domínio do tempo, representados por números reais. Já 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. Os vetores X e Y têm a mesma quantidade de elementos.

Digite no seu script o comando:

Com esta linha de código, o MATLAB passará o sinal da onda quadrada no domínio do tempo, representada pelo vetor x , para o domínio da frequência. O sinal no domínio da frequência é representada pelo vetor y .

Passo 5

Após aplicar a transformada de Fourier, vamos calcular a magnitude do sinal no domínio da frequência. Para isto, usaremos a função a b s ( ) do MATLAB. Digite no MATLAB a linha de código:

Com esta linha, calculamos a magnitude de cada elemento do vetor y .

Já temos o eixo vertical do gráfico da onda quadrada no domínio da frequência, agora precisamos criar o eixo horizontal, representando o domínio da frequência. Para isto, digite os comandos:

Na primeira linha, calculamos o Δ f , que é o passo do domínio da frequência: ele começa em 0 e as frequências seguintes são obtidas pela soma de Δ f à frequência anterior. O Δ f é calculado dividindo a frequência de amostragem F s pelo número de pontos N e é armazenado na variável d e l t a _ f .

Na segunda 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 ), com N elementos. 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 .

Passo 6

Após criar o domínio da frequência, vamos usar novamente a função p l o t para gerar o gráfico da magnitude do sinal no domínio da frequência:

Na primeira linha, 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, o gráfico da magnitude de y no domínio da frequência é criado com o comando p l o t ( f _ d o m ( 1 : N / 2 ) , m a g n ( 1 : N / 2 ) ) . 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. Fazemos isso pois, no domínio da frequência, a partir de F _ s / 2 , as magnitudes começam a se repetir e seria redundante plotá-las.

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 | ' ) .

Execute o programa e você terá a magnitude da onda quadrada no domínio da frequência:

Resposta

Onda quadrada no domínio do tempo

Magnitude da onda quadrada no domínio da frequência