Dlaczego wielkości są znormalizowane podczas syntezy (IDFT), a nie analizy (DFT)?

17

W większości przykładów i kodu FFT, który widziałem, wynik (wielkości częstotliwości) operacji DFT do przodu jest skalowany przez N - tzn. Zamiast dawać ci wielkość każdego przedziału częstotliwości, daje ci N razy wielkość.

Operacyjnie dzieje się tak po prostu dlatego, że DFT oblicza się, biorąc wewnętrzny iloczyn sygnału z każdą sinusoidą podstawową (tj. Korelacja nienormalizowana). Jednak to nie odpowiada filozoficznemu pytaniu, dlaczego nie podzielimy przez N przed zwróceniem wyniku?

Zamiast tego większość algorytmów dzieli się przez N podczas ponownej syntezy.

Wydaje mi się to sprzeczne z intuicją i (chyba że czegoś mi brakuje) sprawia, że ​​wszystkie wyjaśnienia DFT są bardzo mylące.

W każdym scenariuszu, jaki mogę sobie wymarzyć, rzeczywista wielkość (nie wielkość * N) jest wartością, której potrzebuję z operacji DFT, a znormalizowana wielkość jest wartością, którą chcę wprowadzić do operacji IDFT.

Dlaczego DFT nie jest zdefiniowane jako DFT / N, a IDFT jako prosta suma sinusoid o znormalizowanej wielkości?

bryhoyt
źródło
2
Szczerze uważam, że jest to jedno z najfajniejszych pytań, jakie kiedykolwiek tu zadano.
Phonon

Odpowiedzi:

9

Niezależnie od tego, czy skalujesz wyjście DFT, do przodu czy do tyłu, nie ma to nic wspólnego z konwencją ani z tym, co jest matematycznie wygodne. Ma to wszystko związek z danymi wejściowymi do DFT. Pozwólcie, że pokażę kilka przykładów, w których skalowanie jest albo wymagane albo nie jest wymagane zarówno dla transformacji do przodu, jak i odwrotnej.

Musi skalować transformatę do przodu o 1 / N.

Po pierwsze, powinno być jasne, że aby przeanalizować prostą falę sinusoidalną, długość transformacji powinna być nieistotna z matematycznego punktu widzenia. Załóżmy, że N = 1024, Freq = 100, a twój sygnał to:

f (n) = cos (Freq * 2 * Pi * n / N)

Jeśli weźmiesz 1024 punkt DFT f (n), znajdziesz bin [100] = 512. Ale to nie jest znacząca wartość, dopóki nie skalujesz go o N. 512/1024 = 1/2 i oczywiście, druga 1/2 znajduje się w widmie ujemnym w bin [924].

Jeśli podwoisz długość DFT, N = 2048, wartości wyjściowe będą dwa razy większe niż 1024-punktowe DFT, co ponownie sprawia, że ​​wyniki są bez znaczenia, chyba że skalujemy o 1 / N. Długość DFT nie powinna być czynnikiem w tego rodzaju analizach. W tym przykładzie musisz skalować skalę DFT o 1 / N.

Nie wolno skalować transformacji do przodu.

Załóżmy teraz, że masz odpowiedź impulsową filtru FIR z 32 kranami i chcesz poznać jego odpowiedź częstotliwościową. Dla wygody założymy filtr dolnoprzepustowy o wzmocnieniu 1. Wiemy, że dla tego filtra składowa DC DFT musi wynosić 1. I powinno być jasne, że tak będzie bez względu na wielkość DFT, ponieważ składnik DC jest po prostu sumą wartości wejściowych (tj. Sumą współczynników FIR).

Zatem dla tego wejścia DFT nie jest skalowane o 1 / N, aby uzyskać sensowną odpowiedź. Dlatego możesz zerować padającą odpowiedź impulsową tyle, ile chcesz, bez wpływu na wynik transformacji.

Jaka jest podstawowa różnica między tymi dwoma przykładami?

Odpowiedź jest prosta. W pierwszym przypadku dostarczaliśmy energię dla każdej próbki wejściowej. Innymi słowy, fala sinusoidalna była obecna dla wszystkich 1024 próbek, więc musieliśmy skalować moc wyjściową DFT o 1/1024.

W drugim przykładzie z definicji dostarczyliśmy energię tylko dla 1 próbki (impuls przy n = 0). Pobrano 32 próbki, aby impuls przeszedł przez filtr 32 kranów, ale to opóźnienie nie ma znaczenia. Ponieważ dostarczyliśmy energię dla 1 próbki, skalujemy moc wyjściową DFT o 1. Gdyby zdefiniować impuls z 2 jednostkami energii zamiast 1, skalowalibyśmy moc wyjściową o 1/2.

Nie wolno skalować odwrotnej transformacji.

Rozważmy teraz odwrotny DFT. Podobnie jak w przypadku DFT typu forward, musimy wziąć pod uwagę liczbę próbek, do których dostarczamy energię. Oczywiście musimy tu być nieco bardziej ostrożni, ponieważ musimy odpowiednio wypełnić zarówno dodatnie, jak i ujemne przedziały częstotliwości. Jeśli jednak umieścimy impuls (tj. 1) w dwóch odpowiednich przedziałach, to wynikiem wyjściowym odwrotnego DFT będzie fala kosinusowa o amplitudzie 2 bez względu na to, ile punktów użyjemy w odwrotnym DFT.

Tak więc, podobnie jak w przypadku DFT do przodu, nie skalujemy wyjścia odwrotnego DFT, jeśli wejście jest impulsem.

Musi skalować odwrotną transformację.

Rozważmy teraz przypadek, w którym znasz odpowiedź częstotliwościową filtra dolnoprzepustowego i chcesz wykonać odwrotny DFT, aby uzyskać odpowiedź impulsową. W tym przypadku, ponieważ dostarczamy energię we wszystkich punktach, musimy skalować moc wyjściową DFT o 1 / N, aby uzyskać sensowną odpowiedź. Nie jest to tak oczywiste, ponieważ wartości wejściowe będą złożone, ale jeśli przejrzysz przykład, zobaczysz, że to prawda. Jeśli nie skalujesz się o 1 / N, uzyskasz szczytowe wartości odpowiedzi impulsowej rzędu N, co nie może mieć miejsca, jeśli wzmocnienie wynosi 1.

Cztery szczegółowo opisane przeze mnie sytuacje to przykłady punktów końcowych, w których jasne jest, jak skalować wyniki DFT. Jednak między punktami końcowymi jest dużo szarego obszaru. Rozważmy więc kolejny prosty przykład.

Załóżmy, że mamy następujący sygnał, przy N = 1024, Freq = 100:

f(n) = 6 * cos(1*Freq * 2*Pi * n/N)  n = 0 - 127
f(n) = 1 * cos(2*Freq * 2*Pi * n/N)  n = 128 - 895
f(n) = 6 * cos(4*Freq * 2*Pi * n/N)  n = 896 - 1023

Domena czasu

Zwróć uwagę na różnice amplitudy, częstotliwości i czasu trwania dla trzech składników. Niestety DFT tego sygnału pokaże wszystkie trzy komponenty na tym samym poziomie mocy, mimo że drugi komponent ma 1/36 poziomu mocy pozostałych dwóch.

Domena bez okien

Fakt, że wszystkie trzy elementy dostarczają taką samą ilość energii, jest oczywisty, co tłumaczy wyniki DFT, ale należy tu zwrócić uwagę na ważną kwestię.

Jeśli znamy czas trwania różnych składników częstotliwości, możemy odpowiednio skalować różne przedziały częstotliwości. W tym przypadku zrobilibyśmy to, aby dokładnie skalować dane wyjściowe DFT: bin [100] / = 128; bin [200] / = 768; bin [400] / = 128;

Co prowadzi mnie do mojej ostatniej kwestii; generalnie nie mamy pojęcia, jak długo dany składnik częstotliwości jest obecny na wejściu do naszego DFT, więc nie jesteśmy w stanie wykonać tego rodzaju skalowania. Zasadniczo jednak dostarczamy energię dla każdego punktu próbkowania, dlatego podczas analizy sygnału powinniśmy przeskalować do przodu DFT o 1 / N.

Aby skomplikować sprawę, prawie na pewno zastosowalibyśmy okno do tego sygnału, aby poprawić rozdzielczość spektralną DFT. Ponieważ pierwsza i trzecia składowa częstotliwości znajdują się na początku i na końcu sygnału, są tłumione o 27 dB, podczas gdy środkowa część jest tłumiona tylko o 4 dB (okno Hanninga).

Widmowe Widmo

Dla jasności, wyjście DFT może być dość słabą reprezentacją wejścia, skalowane lub nie.

W przypadku odwrotnego DFT, który jest zwykle czystym problemem matematycznym, w przeciwieństwie do analizy nieznanego sygnału, wejście do DFT jest jasno określone, więc wiesz, jak skalować wyjście.

Podczas analizy sygnału za pomocą analizatora widma, analogowego lub FFT, problemy są podobne. Nie znasz mocy wyświetlanego sygnału, chyba że znasz jego cykl pracy. Ale nawet wtedy okienkowanie, rozpiętość, prędkości zamiatania, filtrowanie, typ detektora i inne czynniki działają na korzyść wyniku.

Ostatecznie musisz być bardzo ostrożny podczas przechodzenia między domenami czasu i częstotliwości. Pytanie, które zadałeś na temat skalowania, jest ważne, więc mam nadzieję, że wyjaśniłem, że musisz zrozumieć dane wejściowe do DFT, aby wiedzieć, jak skalować dane wyjściowe. Jeśli dane wejściowe nie są jasno określone, wyniki DFT należy rozpatrywać z dużą dozą sceptycyzmu, niezależnie od tego, czy skalujesz je, czy nie.

user5108_Dan
źródło
Wybrałem tę odpowiedź ze względu na kompleksowość i wiele szczegółowych informacji, ale zobacz także doskonałą odpowiedź firmy Phonon, aby uzyskać intuicyjny przegląd.
bryhoyt
9

Mogę wymyślić kilka powodów związanych z problemami z precyzją obliczeniową, ale to prawdopodobnie nie byłoby sprawiedliwe, ponieważ matematycznie definiujemy to w ten sam sposób, bez względu na wszystko, a matematyka nie zna problemów z precyzją.

Oto moje zdanie na ten temat. Zastanówmy się koncepcyjnie, co oznacza DFT w sensie przetwarzania sygnału, a nie tylko jako transformacja. W tym przypadku wydaje mi się, że zastosowanie DFT do sygnału i systemu powoduje, że chcemy widzieć różne wyniki.

Na przykład zastosujmy DFT do stałego sygnału o wartości 1. Załóżmy również, że ten sygnał ma skończoną długość i długość 16 uderzeń. Czego w tym przypadku chcemy od DFT? Oczywiście chcemy, aby powiedział nam, jaką amplitudę ma każda składowa częstotliwościowa sygnału. Oczywiście nasz sygnał ma jeden składnik o częstotliwości 0 i amplitudzie 1. Ale DFT daje nam pojedynczy pik przy bin 0 i wysokości 16! W takim przypadku frustracja definicją DFT ma sens. Powinniśmy skalować współczynniki analizy, a nie współczynniki syntezy.

Dobra, przeanalizujmy teraz tę samą tablicę liczb, mianowicie nasz ciąg 16, ale w tym przypadku jako system. Co koncepcyjnie chcemy mieć na myśli odpowiedź częstotliwościowa systemu? Większość ludzi powie, że jest to amplituda wyjścia w porównaniu do amplitudy wejścia, tj. Funkcji przenoszenia. W tym przypadku załóżmy, że wprowadzamy do naszego układu sygnał DC o amplitudzie jedności i patrzymy na amplitudę odpowiedzi w stanie ustalonym. Cóż, splot dwa stałe sygnały 16-tap razem, a otrzymasz przejściową rampę, a następnie wyjście w stanie ustalonym, które jest sygnałem DC o amplitudzie (sprawdź to!) 16! W tym przypadku nasza definicja nieskalowanej transformacji analizy ma większy sens niż w innym przypadku.

Ostatecznie chodzi o to, co próbujesz reprezentować. Istnieje wiele powodów, dla których warto rozważyć tę skoncentrowaną na systemie definicję DFT.

Jeśli jednak spojrzymy na transformacji z perspektywy czysto matematycznym, żadna z nich jak najwięcej sensu, ponieważ możemy to przekształcić ortonormalne i jednolita przez skalowanie zarówno analizy i syntezy przemian przez1(N.). Pozwoli to również zachować moc reprezentacji czasu i częstotliwości, tak że twierdzenie Parsevala zawsze obowiązuje.

Phonon
źródło
Świetna odpowiedź, dzięki! Wybrałem odpowiedź user5108_Dan na kompleksowość, ale Twoja odpowiedź zdecydowanie pomogła zapewnić najlepszą intuicję.
bryhoyt
7

W rzeczywistości 3 różne sposoby umieszczania współczynników skali są powszechne w różnych i różnych implementacjach FFT / IFFT: 1.0 do przodu i 1.0 / N wstecz, 1.0 / N do przodu i 1.0 wstecz oraz 1.0 / sqrt (N) zarówno do przodu, jak i do tyłu.

Wszystkie te 3 warianty skalowania pozwalają na przemieszczenie w obie strony IFFT (FFT (x)) przy użyciu ogólnych nieskalowanych funkcji sin () i cos () dla czynników pośrednich, które są transformacją tożsamości.

Zauważ, że zachowanie wielkości sinusoidalnej na przednim FFT nie zachowuje całkowitej energii (jak w twierdzeniu Parsevala). Wybierz ten, który wolisz.

hotpaw2
źródło