Professional Documents
Culture Documents
Krystian Stański Sprawozdanie FFT
Krystian Stański Sprawozdanie FFT
Nr indeksu: 210941
Linia 3: Tworzy wektor próbek sygnału od 0 do N-1 (x=0:N-1). Jest to podstawowy sygnał, na którym
zostanie przeprowadzona transformacja Fouriera.
Linia 4: Określa, czy algorytm ma używać wolnej czy szybkiej metody przestawiania próbek. Bit-
reversal jest używany do odpowiedniego ułożenia próbek przed wykonaniem FFT
(typBitReverse=1).
Linia 5: Określa, czy algorytm ma używać wolnej czy szybkiej pętli FFT. Szybkie pętle FFT
wykorzystują fakt, że DFT sygnałów o określonych właściwościach można obliczyć szybciej niż
tradycyjnymi metodami (typFFT=1).
Linia 6: Tworzy kopię wektora próbek sygnału. Wartości te zostaną zmienione w trakcie obliczeń
FFT, dlatego oryginalny sygnał jest kopiowany (xc = x). Ta kopia będzie używana do
przeprowadzenia transformacji Fouriera, zachowując oryginalne wartości sygnału.
Takim sposobem przygotujemy się do generacji sygnału i będziemy mieli możliwość wyboru
pomiędzy szybką, a wolną wersją algorytmu.
% PRZESTAWIENIE KOLEJNOŚCI PRÓBEK: wersja 1 wolna ---------------------------
------------------------
if (typBitReverse==1)
MSB=log2(N); % liczba bitów numerów próbek %
for n=0:N-1; % kolejne próbki %
ncopy=n; % stary numer próbki (kopia) %
nr=0; % nowy numer próbki (inicjalizacja) %
for m=1:MSB % po wszystkich bitach %
if (rem(n,2)==0) % czy jedynka na LSB %
n=n/2; % jeśli nie, przesuń w prawo %
else
nr=nr+2^(MSB-m); % dodaj 2^(MSB-m) %
n=(n-1)/2; % odejmij jedynkę, przesuń w prawo %
end
end
y(nr+1)=x(ncopy+1); % skopiuj we właściwe miejsce %
end
x = y; % podstaw wynik pod x %
end
if (typFFT==1)
for e = 1 : log2(N) % KOLEJNE ETAPY
SM = 2^(e-1); % szerokoĞü motylka
LB = N/(2^e); % liczba bloków
LMB = 2^(e-1); % liczba motylków w bloku
OMB = 2^e; % odlegáoĞü miĊdzy blokami
W = exp(-j*2*pi/2^e); % podstawa bazy Fouriera
for b = 1 : LB % KOLEJNE BLOKI
for m = 1 : LMB % KOLEJNE MOTYLKI
g = (b-1)*OMB + m; % indeks górnej próbki motylka
d = g + SM; % indeks dolnej próbki motylka
xgora = x(g); % skopiowanie górnej próbki
xdol = x(d)*W^(m-1); % korekta dolnej próbki
x(g) = xgora + xdol; % nowa górna próbka: górna plus dolna po
korekcie
x(d) = xgora - xdol; % nowa dolna próbka: górna minus dolna po
korekcie
end % koniec pętli motylków
end % koniec pętli bloków
end % koniec pętli etapów
end
1. Iteracja po Etapach FFT (for e = 1 : log2(N))
• Obliczenie Szerokości Motylka (SM = 2^(e-1)): Szerokość motylka w każdym etapie FFT
wynosi połowę szerokości motylka z poprzedniego etapu.
• Obliczenie Liczby Bloków (LB = N/(2^e)): Podział sygnału na odpowiednią liczbę bloków na
tym etapie FFT.
• Obliczenie Liczby Motylków w Bloku (LMB = 2^(e-1)): Liczba motylków (par próbek do
przekształcenia) w każdym bloku.
• Obliczenie Odległości Między Blokami (OMB = 2^e): Odległość między początkami kolejnych
bloków.
• Obliczenie Podstawy Bazy Fouriera (W = exp(-j*2*pi/2^e)): Wartość rotacji używanej do
obliczenia motylków na tym etapie FFT.
if (typFFT==2)
for e = 1 : log2(N) % KOLEJNE ETAPY
L = 2^e; % dáugoĞü bloków DFT, przesuniĊcie bloków
M = 2^(e-1); % liczba motylków w bloku, szerokoĞü kaĪdego motylka
Wi = 1;
W = cos(2*pi/L)-j*sin(2*pi/L); % mnoĪnik bazy Fouriera 1
for m = 1 : M % KOLEJNE MOTYLKI
for g = m : L : N % W KOLEJNYCH BLOKACH
d = g+M; % g „górny”, d „dolny” indeks próbki motylka
T = x(d)*Wi; % „serce” FFT
x(d) = x(g)-T; % nowa dolna próbka: górna minus „serce”
x(g) = x(g)+T; % nowa górna próbka: górna plus „serce”
end % koniec pętli bloków
Wi=Wi*W; % kolejna wartoĞü bazy Fouriera l l WL W k
end % koniec pętli motylków
end % koniec pętli etapów
end
1. Iteracja po Etapach FFT (for e = 1 : log2(N))
• Obliczenie Długości Bloków DFT (L = 2^e): Długość bloków przekształcenia Fouriera
na tym etapie. Każdy blok jest przesunięciem innych bloków.
• Obliczenie Liczby Motylków w Bloku (M = 2^(e-1)): Każdy blok jest podzielony na M
motylków, które są przekształcane niezależnie.
• Inicjalizacja Wartości Mnożnika Bazy Fouriera (Wi = 1)
• Obliczenie Mnożnika Bazy Fouriera (W = cos(2*pi/L) - j*sin(2*pi/L)): Mnożnik bazy
Fouriera, który jest używany do obrotu próbek na każdym etapie FFT.
2. Iteracja po Motylkach (for m = 1 : M)
• Iteracja po Próbki w Blokach (for g = m : L : N)
o Obliczenie Dolnego Indeksu Motylka (d = g + M)
o Obliczenie "Serca" FFT (T = x(d)*Wi): Próbka, która zostanie przemnożona przez
wartość rotacji Fouriera.
o Aktualizacja Górnej i Dolnej Próbki Motylka:
▪ Aktualizacja Dolnej Próbki (x(d) = x(g) - T): Nowa dolna próbka to różnica
między górną próbką a wartością "serca" FFT.
▪ Aktualizacja Górnej Próbki (x(g) = x(g) + T): Nowa górna próbka to suma
starej górnej próbki i wartości "serca" FFT
o Aktualizacja Wartości Mnożnika Bazy Fouriera (Wi = Wi * W): Przesunięcie
mnożnika bazy Fouriera do następnej wartości dla kolejnego motylka.
3. Zakończenie Pętli Motylków
4. Zakończenie Pętli Bloków
5. Zakończenie Pętli Etapów