Estou tentando obter uma amostra de uma onda senoidal e representar graficamente seus componentes de frequência, mas estou tendo problemas para implementá-la .O resultado da obtenção de 65536 amostras de um ciclo de uma onda senoidal com amplitude máxima 1 e uma frequência 100 pode ser visto abaixo. Onde o eixo Y é a magnitude da soma complexa de Fourier, e o eixo x é o número da amostra .Como posso ver qual frequência a onda senoidal tem neste gráfico? Gostaria de ter um gráfico de frequência vs magnitude e não número de amostra vs magnitude.

Eu esperava um grande pico de amplitude 1 ou 2 picos de amplitude 0,5 cada, mas parece que estou obtendo uma grande amplitude, não sei o que posso estar fazendo de errado.

FFT do pecado (2 * pi * f * t)

Código Matlab:

Amp = 1; freq = 100; dt = 2 * pi /65536; index = 1; for t = 0:dt:2*pi sine(index) = Amp * sin(2*pi*freq*t); sampleNumber(index) = index; index = index + 1; end transform = fft(sine); magTransform = abs(transform); plot(sampleNumber,magTransform); 

Comentários

  • Implementações FFT geralmente têm um ganho proporcional a $ N $ ou $ \ sqrt {N} $ nelas. Seu resultado não é ' t irracional.
  • Dividindo a magnitude por $ N $ dá dois picos com magnitudes de cerca de 0,425 cada (que ainda é menor do que 0,5 esperado ) .Como mudo o eixo x para frequência a partir do número de amostra?

Resposta

Parece como se você estivesse confundindo sua frequência em Hertz com em radianos / s, já que você tem o fator de $ 2 \ pi $ em ambos os períodos de amostragem dt e seu sinal. Reescrevi um pouco do seu código para esclarecer o que acho que você realmente deseja.

Amp = 1; freqHz = 12000; fsHz = 65536; dt = 1/fsHz; t = 0:dt:1-dt; sine = Amp * sin(2*pi*freqHz*t); N = 65536; transform = fft(sine,N)/N; magTransform = abs(transform); faxis = linspace(-fsHz/2,fsHz/2,N); plot(faxis/1000,fftshift(magTransform)); axis([-40 40 0 0.6]) xlabel("Frequency (KHz)") 

Se sua frequência de amostragem for 65536 amostras / segundo , e você deseja, por exemplo, um tom a 12 KHz, pode criá-lo conforme mostrado. Portanto, aqui seu período de amostra é de 1/65536 segundos.

Sua expectativa de obter dois picos com amplitude de 0,5 cada era correto – apenas o tom gerado não foi.

Quanto ao escalonamento do eixo x para ser em Hertz, basta criar um vetor com o mesmo número de pontos que seu resultado FFT e com um incremento linear de $ – fs / 2 $ a $ + fs / 2 $ . Observe também o fftshift que usei no enredo. Isso porque a saída da função FFT do Matlab vai linearmente de 0 a fs. Acho mais fácil visualizar tendo o DC centrado, mas de qualquer maneira está bom. Sem o fftshift, o vetor faxis iria de 0 a fs .

FFT de um tom de 12 KHz

Resposta

Alguns FFTs requerem a divisão por 1 / N para representar a magnitude “naturalmente” (que não preserva energia ) Para rotular o eixo X é necessário saber a taxa de amostragem (Fs). Se conhecido, então f_x = bin_index * Fs / N, até N / 2, então espelhado para frequências negativas. Se a frequência de um pico espectral (sua onda senoidal de entrada) não for “t exatamente periódico no comprimento FFT (por exemplo, um número inteiro de ciclos), então a magnitude do bin de resultado FFT mais próximo será menor e você precisará interpolar entre os bins para encontrar uma estimativa mais próxima da magnitude do pico (interpolações parabólicas ou de kernel Sinc em janela são comuns).

Resposta

Para adicionar algumas fórmulas à resposta de hotpaw2:

Com o FFT você calcula uma representação de seu sinal como

$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$

onde $ f_k = \ frac {k} {N} f_s $ para $ k = 0,1, …, N / 2-1 $ e $ f_k = \ frac {kN} {N} f_s $ para $ k = N / 2, …, N-1 $, assumindo $ N $ par.

Agora, o FFT requer que as amostras sejam tomadas com a etapa de amostragem $ \ tau = 1 / f_s $ , $ x_n = x (n \ tau) $, e o FFT da matriz de amostra $ (x_n) _n $ dá a matriz de amplitude em escala $ (N \ hat x_k) _k $, uma vez que $ \ sum_ {k = 0} ^ {N-1} 1 = N $. O reescalonamento i s geralmente deixados de fora das implementações FFT para serem tratados pelo usuário da biblioteca FFT.

Resposta

FFT fornece método de calcular DFT isso você já sabe. agora considere um sinal x (n) e seu DFT X (k). se o seu sinal consistir em N (65536 no seu caso) amostras, então X (k) fornecerá valores em frequências discretas de 2*pi*k/N. Na verdade, o DFT X (k) acima significa X(2*pi*k/N). portanto, se você está encontrando X (1), significa que está encontrando o coeficiente DFT na frequência discreta de 2 * pi * 1 / N e similar, X (2) significa coeficiente para 2 * pi * 2 / N e assim por diante. Cada coeficiente mostra a contribuição dessa frequência naquele sinal, se for grande, significa que a frequência constitui a maior parte do sinal. então, para traçar fft em relação à frequência, substitua o eixo da amostra pelo eixo da frequência com pontos 2*pi*k/N onde k = 0 a 65535.FT nunca fornece qualquer informação sobre o tempo. Ele apenas fornece informações de frequência do sinal.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *