W MATLAB wyjścia funkcji fft
i / lub ifft
funkcji 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
fft
iifft
funkcje są oparte na następujących równaniach: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).
fft
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?
- Jeśli tak, to dlaczego
ifft
funkcja MATLAB oczekuje, że nie skalowaliśmy już o ? - Czy istnieje
ifft
funkcja MATLAB lub opcja funkcji, która nie skaluje się automatycznie o ?
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 / √
fft
ifft
1/N- Jeśli tak, to dlaczego
Skalowanie według okresu próbkowania
Słyszałem, że funkcje
fft
iifft
zakładają, że okres próbkowania , i że aby funkcje były prawdziwe, należy zastosować następujące zasady:
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.
Odpowiedzi:
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.
źródło
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/N−−√ 1/N 1
Komentarz
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:T T
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 ]T N x(t) X(ω) (1) N x(t) T x(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 .
źródło
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.0≤n<N 0≤k<N x[n] N X[k] N
więc X [ k + N ] = X [ k ]
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 =
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:
has the advantage of simplicity regarding circular convolution in the "time domain"
but there is a scaling factor you have to worry about if you're convolving in the "frequency domain":
Parseval's theorem has a scaling factor to worry about too.
and the Duality theorem:
the other common scaling convention for the DFT:
has the advantage of being a tiny bit closer, conceptually, to the Fourier series, whereejωkn≜ej(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[N−k]∣∣=A2 .
it also has more simplicity regarding circular convolution in the frequency domain
but there is a scaling factor you have to worry about if you're convolving in the time domain:
Parseval's theorem has a scaling factor to worry about too.
and the Duality theorem:
the unitary scaling convention for the DFT is identical in scaling with its inverse and preserves energy across the transform or inverse transform:
convolution in either time domain or frequency domain has the same scaling factor to worry about:
but Parseval's theorem has no scaling factor to worry about.
nor does the Duality theorem:
źródło
max(abs(X))
function to find where a spectral peak is and you forget to subtract1
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.