Algorytmy:
FFT
Cooley, Lewis i Welch
(1969) przedstawili bardzo prostą i dość efektywną realizacje
algorytmu FFT do wyliczenia DFT ( The Fast Fourier Transform and Its
Applications, IEEE
Transactions on Education,
vol.12, no.1,pp.27-34 )
Procedurę
tą przytoczono też w dziele
„Theory and Application of Digital Signal Processing ”, L.Rabiner
– Bell Laboratories, B.Gold – MIT Lincol Laboratory, Prentice
Hall , 1975.
Adaptowanie
tekstu Fortranu na inny język programowania jest proste. Zaleta
Fortranu jest dostępność typu zespolonego COMPLEX.
W innych językach operacje na liczbach zespolonych musimy wykonywać
na piechote. Zamiast zespolonego wektora A() dajemy dwa wektory Ar()
i Ai(), jak r-real oraz i-image.
Bardzo
ważne jest przetestowanie algorytmu aby nabrac pewności ze daje
zawsze dobre wyniki i jest przewidywalny ( czas dzialania w funkcji
rozmiaru danych wejsciowych ) oraz stabilny. Do tego celu potrzebne
są dane testowe. Możemy je sporzadzić samodzielnie lub lepiej
skorzystać z danych testowych udostępnianych przez choćby IBM. Z
systemu IBM 360/370 nie ma prostego sposobu przeniesienia plików do
mikrokomputera.
Przed
przystąpieniem do testu musimy znać wynik. W psychike ludzką
wbudowany jest efekt racjonalizowania. I tak wyniki błednie
dzialającej procedury zracjonalizujemy jako dobre.
Fortranowska
procedura ponizej jest nierekurencyjna i działa „w miejscu” ( in
place ) bez rezerwacji dodatkowego miejsca. Ma więc zalety. Kod DO 7
do etykiety 7 służy do inversyjno - dwójkowego przestawienia
elementów wejściowego wektora A(N). Zauważmy ze brak instrukcji
contunue obniża czytelność kodu.
Rysunki
w powołanym dziele „Theory and Application...” pokazują efekt
przestawień wektora. Aby zobaczyć czy przestawianie działa jak
należy wpisujemy do A() kolejne liczby naturalne i drukujemy A() po
etykiecie 7 nie wykonujac reszty procedury. Dla wartośći N=8 i N=32
przestawianie działa jak należy. W praktyce wektory są dużo
większe.
Dla
M=10, N wynosi 1024 a ilośc przestawień wynosi 496. Za instrukcją
A(I) = T umieścmy wstepnie
wyzerowaną inkrementowa zmienną licznika aby policzyć ilosc
przestawień. Wykonywana ilość przestawień jest poprawna.
Dla
M=10, N=1024 ilość „motylków” wynosi ( M/2 ) x N = 5120.
Licznik umieszczamy za instrukcja „10 A(I) = A(I)+T”. Wynik
testu jest znów poprawny.
SUBROUTINE
FFT(A,M,N)
COMPLEX
A(N),U,W,T
N
= 2**M
NV2
= N/2
NM1
= N-1
J=1
DO
7 I=1,NM1
IF(I.GE.J)
GO TO 5
T
= A(J)
A(J)
= A(I)
A(I)
= T
5
K=NV2
6
IF(K.GE.J) GO TO 7
J
= J-K
K=K/2
GO
TO 6
7
J = J+K
PI
= 3.141592653589793
DO
20 L=1,M
LE
= 2**L
LE1
= LE/2
U
= (1.0,0.)
W
= CMPLX(COS(PI/LE1),SIN(PI/LE1))
DO
20 J=1,LE1
DO
10 I=J,N,LE
IP
= I+LE1
T
= A(IP)*U
A(IP)
= A(I)-T
10
A(I) = A(I)+T
20
U=U*W
RETURN
END
Potrzebna
jest mala dygresja. Koncern IBM bardzo szybko dostrzegł że nakład
pracy na wykonanie programu może być bardzo duży. Stąd pomysł na
prymitywny translator Fortran ( = Formula Translation ), który
pierwszy powstał już w połowie lat pięćdziesiątych. Konstruktorzy
mieli świadomość ze kod generowany przez translator musi być
efektywny to znaczy i w miare mały i szybki bowiem inaczej
uzytkownicy go nie zaakceptuja !
Prawie każdy translator Fotranu
optymalizuje kod. Instrukcja K=K/2 zostanie pewnie przetłumaczona
jako ASR czyli Artmetic Shift Right czyli artmetyczne przesunięcie w
prawo, równoważna dzieleniu przez 2 bowiem zmienna K jest
calkowitoliczbowa. Dzielenie liczb stałoprzecinkowych bywa
zdumiewajaco wolne.
Fortran
nadaje się wyłącznie do obliczeń naukowo-technicznych. Z reguły
program wynikowy jest istotnie szybszy niż z innych kompilatorów.
W
Fortranie macierze pamiętane sa kolumnami a nie wierszami jak w
pozostałych językach programowania. Bywa to zaleta i były powody
aby zastosować taką organizacje.
Irytująca
instrukcja „
GO
TO” sluzy do
poruszania się po programie. Wydaje się że taka instrukcja we
wpolczesnych jezykach powinna być zabroniona. Logika programu
Fortranowskiego jest jednak bardzo trudna do zrozumienia i to jest
poważna wada. Pożniejsze wersje Fortranu maja już instrukcje
IF..THEN … ELSE...END IF.
Zewnętrzne
instrukcje z sekwencji
6
IF(K.GE.J) GO TO 7
J
= J-K
K=K/2
GO
TO 6
to
przecież pętla While. Wiedząc jaka sekwencja instrukcji
fortranowskich odpowiada instrukcjom strukturalnym można sobie w
myslach czy na papierze przetłumaczyc program i probować go
analizować.
Kontynujmy
testowanie procedury. Niech pierwszy element A będzie liczbą
rzeczywistą a pozostale zerowe. Transformata Fouriera impulsu Diraca
jest rzeczywista i wszystkie elementy stransformowanego wektora A
powinny mieć ta sama wartośc co wstawiliśmy do A. I tak jest .
Jesli tą wartosc wstawimy na kolejne miejsce to moduły dalej bedą
mialy ta wartosc ale pojawią się przesunięcia fazy.
Przeksztalcenie
FFT jest liniowe i przeksztalcenie z wazonej sumy dwóch dowolnych
wektorów jest ważoną sumą przekształceń wektorow.
W
procedurze U nie jest wektorem i wyliczane jest na bieżąco. Autorzy
podają ze spowalnia to program o mniej niż 15%. Wyliczenia U są
bardzo mało dokładne i to jest spora wada tej procedury. Koztem
niewielkiej rozbudowy można wade usunąc.
W
praktyce wektor A(N) jest rzeczywisty a nie zepolony. Aby
zaoszczędzic czasu i miejsca w pamięci stosuje się odpowiednie
prosciutkie podstawienia - transformacje.
Są
one podane na stronie 225 w „Przetwarzanie sygnałow metodami
analogowymi i cyfrowymi, K.G.Beauchamp, WNT 1978. Podano tam też ich
ciekawe wyprowadzenie.
W
najprostszym razie transformacje FFT stosuje się do wyliczania widma
sygnałów. Z uwagi na zjawisko przecieku spektralnego ( leakage )
wpierw zebrane próbki sygnału mnożymy przez odpowiednie okno:
Kaiser, Hamming, Hann, Blackmann-Harris, Gauss, Trójkątne -
Bartlett, Trapezoidalne, Welch, itd. Wyliczenie okien jest
trywialne. Różne cechy okna mają kompromisowe własności.
Rabiner i Gold dają wystarczająco dużo informacji pozwalajacych
wybrać własciwe do zastosowania okno. Transformata FFT już ma
bardzo szerokie zastosowania profesjonalne ( radary, echosondy,
medycyna, geofizyka, badania kosmosu, badania maszyn ) i w
miare popularyzacji komputerow obszar będzie wzrastał.
Komputerek
Spectrum nadaje się tylko do transformacji malych wektorów ( zalezy
od tego ile mamy ciepliwosci w oczekiwaniu na wyniki ) ale wyniki są
jak najbardziej poprawne.
Bardzo wartościowy materiał. Przydatne będzie rozwinięcie "zastosowania profesjonalne ( radary, echosondy, medycyna, geofizyka, badania kosmosu, badania maszyn ) "
OdpowiedzUsuńWitam. Doszły kolejne zastosowania dla FFT i DCT.
Usuń