No MATLAB, as saídas das fft
e / ou ifft
funções geralmente requerem processamento adicional antes de serem consideradas para análise.
Eu ouvi muitas opiniões diferentes sobre o que é correto:
Dimensionamento
O Mathworks afirma que as funções
fft
eifft
são baseadas nas seguintes equações:Dimensionamento pelo comprimento do sinal
Meus colegas normalmente escalam os dados em imediatamente após o processamento do arquivo . (Não consideramos os dados brutos antes do dimensionamento.)
fft
fft
%% Realizar fft
X_f = fft (x, n_sample, 1) / n_sample; % fft deve ser normalizado pelo número de amostras nos dados. % Esta convenção foi definida pelo desenvolvedor de software (Mathworks).Isso está correto?
- Se sim, por que a
ifft
função MATLAB espera que ainda não tenhamos escalado ? - Existe uma
ifft
função MATLAB ou uma opção de função que não aumenta automaticamente em ?
Como alternativa, existe uma convenção melhor que devemos usar para colocar o ? Por exemplo, colocando em vez de , ou colocando nas duas equações, em vez de ?
fft
ifft
- Se sim, por que a
Dimensionamento por período de amostragem
Ouvi dizer que as funções
fft
eifft
assumem que o período de amostragem e que, para que as funções sejam verdadeiras, é necessário aplicar o seguinte:
Veja os links:
- Link 1 (ver comentário para Matt Szelistowski do Dr. Seis)
- Link 2 (ver resposta de Rick Rosson vs do Dr. Seis)
- Link 3 (veja o comentário de Matt (Mensagem: 7/16) e o comentário de Poorya (14/16)
- Link 4 (ver pág. 10, slide [1,1])
- Link 5 (veja as pág. 8 + 9) [parece que ele está usando convenção inversa para fft e ifft].
Isso é verdade?
Estou particularmente entusiasmado porque não consigo encontrar nenhuma equação DFT ou DTFT na Wikipedia que inclua o período de amostragem.
Respostas:
A escalabilidade ou não da FFT direta em 1 / N depende de qual resultado você deseja analisar mais: energia (preservando a identidade de Parseval) ou amplitude (medição de altura ou volts, etc.).
Se você deseja medir ou analisar energia, não faça a escala em 1 / N, e um sinusóide mais longo da mesma amplitude produzirá um resultado maior de FFT, proporcional à maior energia de um sinal mais longo.
Um pouco mais comumente, se você deseja medir ou analisar amplitudes, obtenha um sinusóide mais longo (portanto, com mais energia total na mesma amplitude exata) para produzir aproximadamente o mesmo resultado de FFT como um sinal mais curto, será necessário reduzir a Soma de FFT por uma proporção proporcional ao comprimento. A proporção pode ser referência_length / N, que às vezes é 1 / N se o ganho de entrada do sistema for 1,0 para quaisquer dimensões ou unidades, incluindo as dimensões do intervalo de tempo, que você optar por usar em sua análise posterior. Você precisa reduzir proporcionalmente, porque uma DFT é uma soma: quanto mais você soma itens semelhantes, maior o resultado.
Então. Energia ou amplitude. Qual você quer?
Agora, se você reduzir a FFT para frente, não deverá reduzir a inversa para que IFFT (FFT (x)) == x. Ou vice-versa.
Parece-me que o 1 / sqrt (N) para dimensionamento é quando alguém precisa de uma simetria formal para alguma prova ou quando constrói algum tipo de pipeline de hardware em que a latência e / ou número de unidades / portas aritméticas para o DFT e para o IDFT precisa ser idêntico. Mas você não obtém uma boa medida direta de energia ou amplitude para qualquer tipo típico de análise de engenharia.
fonte
A convenção de dimensionamento usada pelo Matlab é comum no DSP. Você também pode usar a DFT unitária na qual a DFT e a IDFT são dimensionadas por um fator de . Você também pode usar o fator para a DFT e o fator para a IDFT. Contanto que você seja consistente, isso realmente não importa (além de considerações numéricas, especialmente ao usar implementações de ponto fixo). Portanto, não existem convenções "melhores", existem apenas "convenções" e você só precisa concordar sobre qual delas usar. 1/N11/N−−√ 1/N 1
O comentário
está errado. Ninguém diz que você deve normalizar o resultado da FFT. Se você quiser, você é livre para fazê-lo.
Além disso, a FFT não assume nada sobre o período de amostragem . Observe que o DFT pode ser usado para dados discretos por natureza, sem nenhuma amostragem envolvida. Dependendo dos seus dados e do que você deseja fazer com o resultado, você deve levar em consideração oPor exemplo, se você deseja usar o DFT (implementado pelo FFT) para aproximar a transformação Fourier em tempo contínuo, você obtém a seguinte expressão:TT T
onde é o período de amostragem, é o comprimento da DFT, é o sinal de tempo contínuo e é sua transformação de Fourier em tempo contínuo. O lado direito de é apenas o DFT de amostras de , dimensionadas por , onde assumimos que a parte relevante de está no intervalo . Mais detalhes sobre o uso da DFT para aproximar a transformada de Fourier em tempo contínuo podem ser encontrados nesta resposta .T N x(t) X(ω) (1) N x(t) T x(t) t∈[0,NT]
fonte
particularmente porque essa é uma pergunta sobre convenção, não reforçarei a convenção ridícula do MATLAB e responderei apenas com a convenção ou convenções corretas e adequadas . ou seja, a indexação do MATLAB para a DFT não é correta e adequada, mas sou bastante independente de qual das três convenções de escala comuns.
Além disso, não estou restringindo nem , eles podem ser quaisquer números inteiros porque sou bastante fascista quanto ao significado fundamental da Transformada Discreta de Fourier: A DFT e a Série Discreta de Fourier são uma e o mesmo. O DFT mapeia uma sequência periódica com o período para outra sequência periódica também com o período e o iDFT mapeia de volta.0 ≤ k < N x [ n ] N X [ k ] N0≤n<N 0≤k<N x[n] N X[k] N
então X [ k + N ] = X [ k ]
Além disso, a convolução circular no "domínio do tempo" ( ) ou no "domínio da frequência" ( ) é definida de forma consistente com todas as convenções:x[n] X[k]
portanto, a única vantagem de uma convenção sobre a outra (assumindo que ambas as convenções são válidas) pode ser a simplicidade de expressão de alguns dos teoremas.
a convenção de dimensionamento mais comum para a DFT:
tem a vantagem da simplicidade em relação à convolução circular no "domínio do tempo"
mas há um fator de escala com o qual você deve se preocupar se estiver convolvendo no "domínio da frequência" :
O teorema de Parseval também tem um fator de escala para se preocupar.
e o teorema da dualidade:
a outra convenção de dimensionamento comum para a DFT:
tem a vantagem de estar um pouco mais próximo, conceitualmente, da série Fourier, onde são as funções Fourier e são os coeficientes de Fourier. portanto, se você estiver analisando dados brutos do domínio do tempo, , e ver um senoide com ciclos no buffer de amostras e com amplitude (de zero a pico) , isso significaria que .ejωkn≜ej(2πk/N)n X[k] x[n] k N A ∣∣X[k]∣∣=∣∣X[−k]∣∣=∣∣X[N−k]∣∣=A2
também tem mais simplicidade em relação à convolução circular no domínio da frequência
mas há um fator de escala com o qual você deve se preocupar se estiver se envolvendo no domínio do tempo :
O teorema de Parseval também tem um fator de escala para se preocupar.
e o teorema da dualidade:
a convenção de escala unitária para a DFT é idêntica na escala com sua inversa e preserva energia através da transformação ou transformação inversa:
A convolução no domínio do tempo ou no domínio da frequência tem o mesmo fator de escala para se preocupar:
mas o teorema de Parseval não tem um fator de escala para se preocupar.
nem o teorema da dualidade:
i D F T { x [ k ] } = X [ - n ]
fonte
max(abs(X))
função para descobrir onde está um pico espectral e se esquece de subtrair1
o índice retornado e faz contas nele. é um problema. e triste por isso. a origem da indexação tem tanto a ver com a " definição da DFT" quanto a escala. tem a ver com o que a contabilidade é necessária ou não.