MATLAB: e escala de


11

No MATLAB, as saídas das ffte / ou ifftfunçõ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 ffte ifftsão baseadas nas seguintes equações:

    X[k]=11n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
  • 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.)1Nfft
    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?

    1. Se sim, por que a ifftfunção MATLAB espera que ainda não tenhamos escalado ?1/N
    2. Existe uma ifftfunção MATLAB ou uma opção de função que não aumenta automaticamente em ?1/N

    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 ?1/N1/Nfftifft1/N1/N

  • Dimensionamento por período de amostragem

    Ouvi dizer que as funções ffte ifftassumem que o período de amostragem e que, para que as funções sejam verdadeiras, é necessário aplicar o seguinte:Tsampling=1/fsampling=1

X[k]=1Tsamplingn=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=TsamplingNk=1NX[k]e+j2π(k1)(n1)N,where1nN

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.


2
BTW, o kando está apenas afirmando como está (com MATLAB): mas eu tenho que dizer que esta convenção do MATLAB para colocar DC no compartimento # 1 (ou a amplitude do componente de frequência no compartimento ) me deixa maluco !!!! kk+1
X[k]=n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
kk+1
22416 Robert Robinson-Johnson

Respostas:


6

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.


Quando você diz "se você deseja medir energia, então não escala em " ... eu não precisaria dimensionar em para que a transformação seja unitária e economize energia? Ou é porque eu preciso ajustar todo o sinal para obter a energia que produz efetivamente? Se isso for verdade, no entanto, qual é o espectro dimensionado por realmente me mostrando então? 1 / 1/N 1/N1/1/N1/N1/N
simples

Além disso, ao dizer "assim com mais energia na mesma amplitude exata" ... você prefere não dizer "frequência"?
precisa saber é o seguinte

7

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/N1/N1

O comentário

% fft deve ser normalizado pelo número de amostras nos dados.
% Esta convenção foi definida pelo desenvolvedor de software (Mathworks).

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:TTT

(1)X(2πkNT)Tn=0N1x(nT)ej2πkn/N,0k<N

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 .TNx(t)X(ω)(1)Nx(t)Tx(t)t[0,NT]


2
Para que serve o voto negativo? Por favor comente.
Matt L.

11
normalmente voto por escrutínio secreto, mas desta vez abrirei uma exceção. dependendo do que se está fazendo com a DFT, certamente existem convenções "melhores" que outras. (mas nenhuma convenção é melhor do que os outros em todas as circunstâncias.)
Robert Bristow-johnson

5

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 ] N0n<N0k<Nx[n]NX[k]N

então X [ k + N ] = X [ k ]

x[n+N]=x[n] nZ
X[k+N]=X[k] kZ

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]

h[n]x[n]i=0N1h[i]x[ni]=i=0N1x[i]h[ni]
W[k]X[k]i=0N1W[i]X[ki]=i=0N1X[i]W[ki]

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:

DFT{x[n]}X[k]n=0N1x[n]ej2πkn/NiDFT{X[k]}x[n]=1Nk=0N1X[k]e+j2πkn/N

tem a vantagem da simplicidade em relação à convolução circular no "domínio do tempo"

DFT{h[n]x[n]}=H[k]X[k]

mas há um fator de escala com o qual você deve se preocupar se estiver convolvendo no "domínio da frequência" :

iDFT{W[k]X[k]}=1Nw[n]x[n]

O teorema de Parseval também tem um fator de escala para se preocupar.

n=0N1|x[n]|2=1Nk=0N1|X[k]|2

e o teorema da dualidade:

DFT{X[n]}=Nx[k]
iDFT{x[k]}=1NX[n]

a outra convenção de dimensionamento comum para a DFT:

iDFT{X[k]}x[n]k=0N1X[k]e+j2πkn/NDFT{x[n]}X[k]=1Nn=0N1x[n]ej2πkn/N

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ωknej(2πk/N)nX[k]x[n]kNA|X[k]|=|X[k]|=|X[Nk]|=A2

também tem mais simplicidade em relação à convolução circular no domínio da frequência

iDFT{W[k]X[k]}=w[n]x[n]

mas há um fator de escala com o qual você deve se preocupar se estiver se envolvendo no domínio do tempo :

DFT{h[n]x[n]}=1NH[k]X[k]

O teorema de Parseval também tem um fator de escala para se preocupar.

1Nn=0N1|x[n]|2=k=0N1|X[k]|2

e o teorema da dualidade:

DFT{X[n]}=1Nx[k]
iDFT{x[k]}=NX[n]

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:

DFT{x[n]}X[k]1Nn=0N1x[n]ej2πkn/NiDFT{X[k]}x[n]=1Nk=0N1X[k]e+j2πkn/N

A convolução no domínio do tempo ou no domínio da frequência tem o mesmo fator de escala para se preocupar:

DFT{h[n]x[n]}=1NH[k]X[k]

iDFT{W[k]X[k]}=1Nw[n]x[n]

mas o teorema de Parseval não tem um fator de escala para se preocupar.

n=0N1|x[n]|2=k=0N1|X[k]|2

nem o teorema da dualidade:

i D F T { x [ k ] } = X [ - n ]

DFT{X[n]}=x[k]
iDFT{x[k]}=X[n]


Ao falar sobre convenções de DFT, geralmente é apenas sobre os fatores de escala, não sobre a não questão da indexação. Se você pensou que eu estava me referindo à indexação quando disse que essa é a convenção comum do DSP, foi um mal-entendido. Claro que me referi à escala; a indexação é totalmente irrelevante, porque não tem nada a ver com a definição da DFT (e a escala tem).
Matt L.

não é um "não-problema" quando, no MATLAB, você usa a max(abs(X))função para descobrir onde está um pico espectral e se esquece de subtrair 1o í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.
22816 Robert Robinson-Johnson

poderia ter sido eu, mas desta vez não é :) Mas ainda assim, não concordo com a importância que você atribui à indexação, mas aprecio que isso seja pessoal. Mais uma vez, não há voto negativo, porque aprecio o tempo que você dedica à resposta.
Matt L.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.