MATLAB: i skalowanie

11

W MATLAB wyjścia funkcji ffti / lub ifftfunkcji często wymagają dodatkowego przetwarzania przed rozważeniem ich do analizy.

Słyszałem wiele różnych opinii na temat tego, co jest prawidłowe:

  • skalowanie

    Mathworks stwierdza, że ffti ifftfunkcje są oparte na następujących równaniach:

    X[k]=11n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
  • Skalowanie według długości sygnału

    Moi rówieśnicy zazwyczaj skalują dane według natychmiast po przetworzeniu . (Nie uwzględniamy surowych danych przed skalowaniem).1Nfft
    fft

    %% Wykonaj fft
    X_f = fft (x, n_sample, 1) / n_sample; % fft musi być znormalizowany przez liczbę próbek w danych. % Ta konwencja została ustalona przez programistę (Mathworks).

    Czy to jest poprawne?

    1. Jeśli tak, to dlaczego ifftfunkcja MATLAB oczekuje, że nie skalowaliśmy już o ?1/N
    2. Czy istnieje ifftfunkcja MATLAB lub opcja funkcji, która nie skaluje się automatycznie o ?1/N

    Alternatywnie, czy istnieje lepsza konwencja, której powinniśmy używać przy umieszczaniu ? Na przykład umieszczenie w zamiast zamiast , lub umieszczenie w obu równaniach, zamiast ?1 / N 1 / 1/N1/Nfftifft 1/N1/N1/N

  • Skalowanie według okresu próbkowania

    Słyszałem, że funkcje ffti ifftzakładają, że okres próbkowania , i że aby funkcje były prawdziwe, należy zastosować następujące zasady:Tsampling=1/fsampling=1

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

Zobacz linki:

  • Link 1 (patrz komentarz do dr. Seisa do Matta Szelistowskiego)
  • Link 2 (patrz odpowiedź Ricka Rossona vs. doktora Seisa)
  • Link 3 (patrz komentarz Matta (Wiadomość: 7/16) i komentarz Pooryi (14/16)
  • Link 4 (patrz str. 10, slajd [1,1])
  • Link 5 (patrz str. 8 + 9) [wygląda na to, że używa odwrotnej konwencji dla fft i ifft].

Czy to prawda?

Jestem szczególnie poruszony, ponieważ nie mogę znaleźć w Wikipedii żadnych równań DFT ani DTFT, które obejmowałyby okres próbkowania.

kando
źródło
2
BTW, kando po prostu stwierdza, że ​​tak jest (z MATLAB): ale muszę powiedzieć, że ta sztywna konwencja MATLAB-a umieszczania prądu stałego w bin # 1 (lub amplitudy składowej częstotliwościkw bink+1)doprowadza mnie do cholernego szaleństwa !!!!
X[k]=n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
kk+1
robert bristow-johnson

Odpowiedzi:

6

To, czy przeskalować FFT do przodu o 1 / N, zależy od tego, jaki wynik chcesz do dalszej analizy: energii (zachowanie tożsamości Parseval) lub amplitudy (pomiar wysokości lub woltów itp.).

Jeśli chcesz mierzyć lub analizować energię, nie skaluj o 1 / N, a dłuższy sinusoid o tej samej amplitudzie da większy wynik FFT, proporcjonalny do większej energii dłuższego sygnału.

Nieco częściej, jeśli chcesz zmierzyć lub przeanalizować amplitudy, a następnie uzyskać dłuższą sinusoidę (a więc z większą całkowitą energią przy dokładnie tej samej amplitudzie), aby uzyskać w przybliżeniu ten sam wynik FFT jako krótszy sygnał, musisz zmniejszyć Sumowanie FFT przez stosunek proporcjonalny do długości. Współczynnikiem może być referencyjna długość / N, która czasami wynosi 1 / N, jeśli wzmocnienie wejściowe systemu wynosi 1,0 dla dowolnych wymiarów lub jednostek, w tym wymiarów przedziału czasowego, które wybierzesz do dalszej analizy. Musisz proporcjonalnie zmniejszyć, ponieważ DFT jest sumą: im więcej zsumujesz podobne elementy, tym większy wynik.

Więc. Energia lub amplituda. Które chcesz?

Jeśli teraz przeskalujesz w dół do przodu FFT, nie powinieneś skalować odwrotności, aby IFFT (FFT (x)) == x. Lub odwrotnie.

Wydaje mi się, że 1 / sqrt (N) dla skalowania jest albo w przypadku, gdy potrzebna jest formalna symetria dla jakiegoś dowodu, albo w przypadku budowania jakiegoś potoku sprzętowego, w którym opóźnienie i / lub liczba jednostek / bram arytmetycznych dla DFT i ponieważ IDFT musi być identyczny. Ale nie można uzyskać dobrego bezpośredniego pomiaru energii ani amplitudy dla typowego rodzaju analizy inżynierskiej.

hotpaw2
źródło
Kiedy mówisz „jeśli chcesz mierzyć energię, nie skaluj o ” ... czy nie musiałbym skalować o 1 / 1/N aby transformacja była jednolita i zachowała energię? A może dlatego, że muszę wyrównać cały sygnał, aby uzyskać energię, która dajeefektywnie1/N? Jeśli to prawda, jednak, cojestwidmo skalowane przez1/1/N1/N właściwie mnie wtedy pokazuje? 1/N
LCsa
Dodatkowo, mówiąc „w ten sposób z większą energią przy dokładnie tej samej amplitudzie”… czy nie miałbyś na myśli „częstotliwości”?
LCsa
7

Konwencja skalowania stosowana przez Matlab jest powszechna w DSP. Możesz także użyć jednolitego DFT, w którym zarówno DFT, jak i IDFT są skalowane współczynnik . Możesz również użyć współczynnika1/Ndla DFT i współczynnika1dla IDFT. Tak długo, jak jesteś konsekwentny, tak naprawdę nie ma to znaczenia (oprócz rozważań numerycznych, szczególnie gdy używasz implementacji o stałym punkcie). Nie ma więc „lepszych” konwencji, są po prostu „konwencje” i wystarczy uzgodnić, której z nich używasz.1/N1/N1

Komentarz

% fft musi być znormalizowany przez liczbę próbek w danych.
% Ta konwencja została ustalona przez programistę (Mathworks).

jest źle. Nikt nie mówi, że musisz znormalizować wynik FFT. Jeśli chcesz, możesz to zrobić.

Również FFT nie wie nic o okresie pobierania próbek zakładać . Należy zauważyć, że DFT można stosować do danych, które z natury są dyskretne bez konieczności próbkowania. W zależności od danych i tego, co chcesz zrobić z wynikiem, musisz odpowiednio wziąć pod uwagę T. Na przykład, jeśli chcesz użyć DFT (zaimplementowanej przez FFT) do przybliżenia ciągłej transformacji Fouriera, otrzymasz następujące wyrażenie:TT

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

gdzie jest okresem próbkowania, N jest długością DFT, x ( t ) jest sygnałem ciągłego czasu, a X ( ω ) jest jego ciągłą transformatą Fouriera. Prawa strona ( 1 ) to po prostu DFT z N próbek x ( t ) , skalowanych przez T , gdzie zakładamy, że odpowiednia część x ( t ) mieści się w zakresie t [ 0 , N T ]TNx(t)X(ω)(1)Nx(t)Tx(t)t[0,NT]. Więcej szczegółów na temat używania DFT do aproksymacji ciągłej transformaty Fouriera można znaleźć w tej odpowiedzi .

Matt L.
źródło
2
Po co głosować? Proszę skomentuj.
Matt L.,
1
zazwyczaj głosuję w głosowaniu tajnym, ale tym razem zrobię wyjątek. w zależności od tego, co się robi z DFT, z pewnością istnieją „lepsze” konwencje niż inne. (ale żadna konwencja nie jest lepsza od innych w każdych okolicznościach.)
Robert Bristol-Johnson
5

zwłaszcza, że ​​jest to pytanie o konwencję, nie wzmocnię absurdalnej konwencji MATLAB i odpowiem tylko właściwą i właściwą konwencją lub konwencjami. tzn. indeksowanie MATLAB-a dla DFT nie jest poprawne i właściwe, ale jestem dość agnostyczny co do tego, która z trzech powszechnych konwencji skalowania.

ponadto nie ograniczam ani 0 k < N , mogą to być dowolne liczby całkowite, ponieważ jestem dość fascynujący fundamentalnym znaczeniem dyskretnej transformaty Fouriera: DFT i dyskretna seria Fouriera są jednym i podobnie. DFT odwzorowuje okresową sekwencję x [ n ] z okresem N na inną okresową sekwencję X [ k ] również z okresem N, a iDFT odwzorowuje ją z powrotem.0n<N0k<Nx[n]NX[k]N

więc X [ k + N ] = X [ k ]

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

również splot kołowy w „dziedzinie czasu” ( ) lub „dziedzinie częstotliwości” ( X [ k ] ) jest zdefiniowany zgodnie ze wszystkimi konwencjami:x[n]X[k]

W [ k ] X [ k ] N - 1 i =

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]

więc jedyną przewagą jednej konwencji nad drugą (przy założeniu, że obie konwencje są ważne) może być prostota wyrażania niektórych twierdzeń.


najczęstsza konwencja skalowania dla DFT:

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

has the advantage of simplicity regarding circular convolution in the "time domain"

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

but there is a scaling factor you have to worry about if you're convolving in the "frequency domain":

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

Parseval's theorem has a scaling factor to worry about too.

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

and the Duality theorem:

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

the other common scaling convention for the DFT:

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

has the advantage of being a tiny bit closer, conceptually, to the Fourier series, where ejωknej(2πk/N)n are the Fourier basis functions and X[k] are the Fourier coefficients. so if you're looking at raw time-domain data, x[n], and see a sinusoid with k cycles in the buffer of N samples and with (zero-to-peak) amplitude A, that would mean that |X[k]|=|X[k]|=|X[Nk]|=A2.

it also has more simplicity regarding circular convolution in the frequency domain

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

but there is a scaling factor you have to worry about if you're convolving in the time domain:

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

Parseval's theorem has a scaling factor to worry about too.

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

and the Duality theorem:

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

the unitary scaling convention for the DFT is identical in scaling with its inverse and preserves energy across the transform or inverse transform:

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

convolution in either time domain or frequency domain has the same scaling factor to worry about:

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

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

but Parseval's theorem has no scaling factor to worry about.

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

nor does the Duality theorem:

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

robert bristow-johnson
źródło
When talking about DFT conventions, it's usually only about the scaling factors, not about the non-issue of indexing. If you thought that I was referring to the indexing when I said that that's the common DSP convention, then it was a misunderstanding. Of course I referred to the scaling; the indexing is totally irrelevant, because it has nothing to do with the definition of the DFT (and the scaling has).
Matt L.
it's not a fucking "non-issue" when, in MATLAB, you use the max(abs(X)) function to find where a spectral peak is and you forget to subtract 1 from the returned index and you're gonna do math on it. it's an issue. and a sad one at that. the indexing origin has as much to do with the "definition of the DFT" as does scaling. it has to do with what bookkeeping is required or not.
robert bristow-johnson
could've been me, but this time it ain't :) But still, I don't agree with the importance you attach to the indexing, but I appreciate that that's personal. Again, no downvote because I appreciate the time you put into the answer.
Matt L.