pobierz instrukcję - Politechnika Wrocławska

Transkrypt

pobierz instrukcję - Politechnika Wrocławska
Politechnika Wrocławska
Wydział Elektroniki Mikrosystemów i Fotoniki
Przetwarzanie sygnałów – laboratorium
ETD5067L
Ćwiczenie 2.
Dyskretna Transformacja Fouriera
1. Liczby zespolone
Liczby zespolone są uogólnieniem liczb rzeczywistych. Liczba zespolona jest sumą liczby
rzeczywistej i liczby rzeczywistej przemnożonej przez jednostkę urojoną j ( a+ jb ). Jednostka
urojona j spełnia równość j 2 = –1. Zatem liczbę zespoloną można podzielić na dwie części:
część rzeczywistą a i część urojoną b. Liczba zespolona, której część urojona jest równa zero,
jest po prostu liczbą rzeczywistą. Zbiór liczb zespolonych oznacza się zwykle dużą literą ℂ,
podobnie jak zbiór liczb rzeczywistych oznacza się dużą literą ℝ. Liczby zespolone można
przedstawić na płaszczyźnie zespolonej jako punkty. Oś odciętych (pozioma) informuje o
wartościach części rzeczywistej liczb zespolonych, natomiast oś rzędnych (pionowa) – o
wartościach części urojonej.
Zatem oś odciętych można traktować jako oś liczb rzeczywistych, które stanowią podzbiór
liczb zespolonych. Dla liczb zespolonych zdefiniowane są operacje algebraiczne, takie jak:
● dodawanie a+jb+c+jd=(a+c)+j(b+d),
● odejmowanie (a+jb) – (c +jd)=(a – c)+j(b – d),
● mnożenie (a+jb)(c+jd)=(ac-bd)+j(bc+ad),
a  jb a  jb c  jd  ac  bd   j bc  ad  ac  bd
bc  ad
● dzielenie


 2
j 2
2
2
2
2
2
c  jd
c d
c d
c d
c d2
Płaszczyznę liczb zespolonych można przedstawić również w układzie biegunowym. W
układzie tym położenie punktu definiuje się za pomocą długości wektora i kąta jaki tworzy on
z dodatnią półosią odciętych (poziomą).
Położenie punktu w układzie biegunowym można łatwo wyznaczyć, przechodząc z
algebraicznej
postaci
liczby
zespolonej
do
postaci
trygonometrycznej
a  jb  r cos   j sin   lub wykładniczej a  jb  re j . Aby takiego przejścia dokonać,
b
należy obliczyć r i  , korzystając z zależności r  a 2  b 2 ,   arctg   . Aby przejść z
a
postaci wykładniczej na algebraiczną wykorzystuje się postać trygonometryczną oraz oblicza
wartości r sin  i r cos , co daje nam wartości odpowiednio części urojonej i rzeczywistej.
Reprezentacja liczb zespolonych w układzie biegunowym wiąże się z pewnymi
niedogodnościami. Pierwsza z nich wynika z okresowości funkcji trygonometrycznych
sin()=sin(2n+) i cos()=cos(2n+) dla n∈ℤ . Dlatego re j  re j 2n   dla n∈ℤ (zbiór
liczb całkowitych). Drugą niedogodnością jest konieczność rozpatrzenia przypadku, w którym
część rzeczywista liczby zespolonej jest równa 0. Należy też pamiętać, że funkcja arcus
 
tangens (arctg) przyjmuje wartości z przedziału  ,  , podczas gdy kąt  powinien
2 2
przyjmować wartości od 〈−, ). Aby zatem obliczyć poprawny kąt fazowy  należy
odpowiednio skorygować wynik funkcji arctg dla przypadków, kiedy część rzeczywista
liczby zespolonej jest ujemna. Wówczas – w zależności od tego, czy część urojona jest
dodatnia czy ujemna – należy do wyniku funkcji arctg dodać lub od tego wyniku odjąć
liczbę .
2. Dyskretna Transformacja Fouriera (ang. Discrete Fourier Transform –DFT)
W dziedzinie przetwarzania sygnałów operacja rozkładu na zbiór funkcji bazowych
(składowych) polega na obliczeniu współczynników skalujących amplitudę tych funkcji.
Obliczony zbiór współczynników nazywa się widmem sygnału. Zbiór funkcji bazowych
zwykle powstaje przez parametryzację pewnej funkcji. W przypadku DFT jest to funkcja
zespolona w postaci:
exp j 2kn / N   cos2kn / N   j sin 2kn / N  ,
w której N jest ilością próbek jednego okresu rozkładanego dyskretnego sygnału
okresowego, a k jest parametrem generującym zbiór funkcji dla operacji rozkładu. Dla DFT
k=0..N-1. Oznacza to, że zbiór funkcji jest dyskretny i skończony (stanowi go N funkcji
bazowych). Indeks k jest związany z okresem (lub odwrotnością okresu czyli częstotliwością)
funkcji sinus i kosinus. Indeks ten mówi ile okresów funkcji sinus lub kosinus znajduje się w
ciągu N próbek.
Jeżeli ciąg próbek jest wynikiem operacji próbkowania z okresem próbkowania równym Ts
(częstotliwość próbkowania fs=1/Ts), to ciągłe rekonstrukcje funkcji bazowych DFT miałyby
równanie
  cos 2kt
  j sin  2kt
,
exp j 2kt





NT
NT
NT
s
s
s



w
którym
wyrażenie
kf
k
 s ma sens częstotliwości k-tej funkcji bazowej. Związek parametru k dla funkcji
NTs
N
dyskretnych z częstotliwością ich ciągłych odpowiedników pozwala na wykorzystanie DFT
do analizy sygnałów ciągłych.
Istnieją inne bazy Fouriera:
exp j 2kt / T  - dla sygnałów ciągłych okresowych,
exp  j 2ft  - dla sygnałów ciągłych nieokresowych,
exp  j 2fn  - dla sygnałów dyskretnych nieokresowych.
Każda z nich ma tę cechę, że jej funkcje są tzw. funkcjami analitycznymi, których każda
pochodna jest ciągła. Dzięki temu mogą być wykorzystywane do analizy układów liniowych,
które są opisywane za pomocą równań różniczkowych.
Najważniejszą zaletą DFT jest to, że można ją obliczyć numerycznie. Fakt ten stał się
szczególnie istotny w momencie pojawienia się układów mikroprocesorowych. Najprostszym
algorytmem umożliwiającym obliczenie współczynników (parametrów skalujących
amplitudę– nie mylić z parametrem k i częstotliwością) poszczególnych funkcji bazowych
dla sygnałów zespolonych jest bezpośrednia implementacja równania:
1
X k  
N
N 1
 xne
j
2kn
N
.
(1)
n 0
W równaniu tym wykorzystuje się z ortogonalność bazy. Wówczas współczynniki można
obliczyć za pomocą prostego iloczynu skalarnego.
Należy pamiętać, że współczynniki X[k] są liczbami zespolonymi, dla których można
wyznaczyć moduł i argument. Znając współczynniki X[k] DFT, możemy z powrotem
zsyntezować (wyznaczyć, obliczyć) sygnał x[n] korzystając z równania syntezy:
N 1
xn   X k e
j
2kn
N
.
(2)
k 0
W przypadku sygnałów rzeczywistych możemy obliczyć ich DFT w sposób bardziej
efektywny. Wykorzystuje się tu fakt, że dla sygnałów rzeczywistych współczynniki funkcji
bazowych o indeksie k =N/2+m równe są współczynnikom funkcji o indeksie k=N/2-m, dla
wszystkich m=1..N/2-1 z dokładnością do znaku części urojonej. Znak ten jest zawsze
przeciwny
(Im{X[k=N/2-m]}= -Im {X[k=N/2+m]}). Dzięki temu współczynniki Re[k] i Im[k] można
wyznaczyć z równania
2
Rek  
N
N 1
2
 2kn 
xn cos
, Imk   

N
 N 
n 0
N 1
 2kn 
,
N 
 xnsin
n 0
(3)
przy czym k=1.. N/2-1. Odnoszą się one odpowiednio do części rzeczywistej i urojonej
współczynników X[k] dla sygnałów zespolonych. Ich amplituda jest dwa razy większa,
ponieważ reprezentują połowę współczynników obliczanych dla sygnałów zespolonych (
zamiast dwóch zespolonych X[N/2-m] i X[N/2+m], mamy jedną parę współczynników Re[N/2
–m] i Im[N/2-m] o podwojonej wartości). Zależność ta nie dotyczy współczynników dla k=0 i
k=N/2, które nie mają pary i w związku z tym ich amplituda nie powinna być podwajana.
Rek  
1
N
N 1
1
 2kn 
xn cos
, Imk   

N
 N 
n 0
N 1
 2kn 
, dla k  {0, N / 2}
N 
 xnsin
n 0
Współczynniki Re[k] i Im[k] dla sygnałów rzeczywistych pozwalają syntetyzować sygnał
x[n] i operację tę można opisać następującym równaniem:
N /2
 2kn 
 2kn 
xn   Rek cos
  Imk sin 
.
 N 
 N 
k 0
(4)
Możemy zauważyć, że do zsyntetyzowania sygnału x[n], wykorzystujemy teraz mniejszą
liczbę współczynników (N/2+1) niż w przypadku sygnałów zespolonych.
Zadania do realizacji
Na zajęciach laboratoryjnych należy rozwiązać 5 podanych poniżej zadań. Każde z zadań
polega na usunięciu błędów w podanych definicjach funkcji. Każda z definicji wykonuje
operacje, które zostały teoretycznie omówione w poprzednich rozdziałach niniejszej
instrukcji. Za każde zadanie można otrzymać jeden punkt pod warunkiem, że zostanie ono w
całości poprawnie zrealizowane.
Zadanie nr 1
W zadaniu pierwszym należy poprawić funkcje do obliczania modułu (gj_mag) i wartości
kąta fazowego (gj_arg) dla tablicy liczb zespolonych zaimplementowanej w postaci dwóch
tablic liczb rzeczywistych re i im (re dla części rzeczywistej i im dla części urojonej).
Wszystkie te funkcje zwracają tablicę liczb rzeczywistych. Ponadto, należy usunąć błędy w
funkcji do obliczania częstotliwości poszczególnych składowych widma Fouriera (gj_freq).
Funkcje te przyjmują jako parametry liczbę punktów DFT N i częstotliwość próbkowania fs .
Ostatnimi funkcjami do poprawienia w zadaniu pierwszym są funkcje dodawania (gj_cadd) i
mnożenia (gj_cmul) dwóch liczb zespolonych. Parametrami tych funkcji są części rzeczywiste
i urojone dwóch liczb zespolonych. Zwracane wartości to odpowiednio część rzeczywista i
urojona wyniku operacji dodawania lub mnożenia.
Działanie funkcji powinno być zaprezentowane w taki sposób, aby jednoznacznie
udowodnić, że funkcje działają poprawnie. Na przykład dla funkcji obliczającej argument
należy przetestować wszystkie możliwe przypadki kątów. Poprawne działanie funkcji należy
w trakcie prezentacji jej działania, udowodnić.
function fi=gj_arg(re,im)
N=length(re);
for i=1:N
if (re(i)>0 && im(i)>0)
fi(i)=atan(im(i)/re(i));
elseif (re(i)>0 && im(i)>=0)
fi(i)=pi+atan(im(i)/re(i));
elseif (re(i)==0 && im(i)>0)
fi(i)=-pi+atan(re(i)/im(i));
elseif (re(i)=<0 && im(i)<0)
fi(i)=-pi;
elseif (re(i)>0 && im(i)<=0)
fi(i)=atan(im(i)/re(i));
else
fi(i)=pi/2;
endif
endfor
endfunction
function mag=gj_mag(re,im)
N=length(re);mag=zeros(1,N);
for i=1:N
mag(i-1)=sqrt(re(i)*re(i)-im(i)*im(i));
endfor
endfunction
function [Cr,Ci]=gj_cmul(Ar,Ai,Br,Bi)
Cr=Ar*Bi-Ai*Bi;
Ci=Ar*Bi+Ai*Bi;
endfunction
function [Cr,Ci]=gj_cadd(Ar,Ai,Br,Bi)
Cr=Ar+Br;
Ci=Ai+Bi;
endfunction
function f=gj_freq(N,fs)
f=zeros(1,N);
for i=1:N
f(i)=i*fs/N/2;
endfor
endfunction
Zadanie nr 2
Zadanie drugie polega na usunięciu błędów z funkcji obliczającej DFT sygnału
rzeczywistego. Funkcja jako parametr przyjmuje tablicę liczb rzeczywistych, a w wyniku
zwraca dwie tablice, odpowiednio dla części rzeczywistej i urojonej wyniku.
Działanie funkcji należy przetestować dla sygnału, dla którego znamy prawidłowy wynik
DFT. Prezentując działanie funkcji należy wyjaśnić, dlaczego uważa się, że funkcja działa
prawidłowo.
function [Re,Im]=gj_rdft(x)
N=length(x); Re=zeros(1,N/2+1); Im=zeros(1,N/2+1);
for k=0:N/2
Tr=0;
Ti=0;
for n=0:N-1
Tr+=2*x(n)*cos(2*pi*k*n/N)/N;
Ti+=-2*x(n)*sin(2*pi*k*n/N)/N;
endfor
Re(k)=Tr;
Re(k)=Ti;
endfor
endfunction
Zadanie nr 3
Zadanie trzecie polega na usunięciu błędów z funkcji obliczającej odwrotną DFT sygnału
rzeczywistego. Funkcja jako parametr przyjmuje dwie tablice liczb rzeczywistych (jedna dla
części rzeczywistej, a druga dla części urojonej widma DFT). W wyniku natomiast zwraca
tablicę liczb rzeczywistych odpowiadających kolejnym próbkom sygnału.
Działanie funkcji należy przetestować dla widma sygnału, dla którego znamy prawidłowy
wynik odwrotnej DFT. Prezentując działanie funkcji należy wyjaśnić, dlaczego uważa się, że
funkcja działa prawidłowo.
function x=gj_irdft(Re,Im)
N=(length(Re)-1)*2; Re(1)/=2; Im(1)/=2;
Re(N/2+1)/=2; Im(N/2+1)/=2; x=zeros(1,N);
for n=0:N-1
T=0;
for k=1:N/2
T+=Re(k)*cos(2*pi*n*k/N)-Im(k)*sin(2*pi*n*k/N);
endfor
x(n)=T;
endfor
endfunction
Zadanie nr 4
Zadanie czwarte polega na usunięciu błędów z funkcji obliczającej DFT sygnału zespolonego.
Funkcja jako parametr przyjmuje dwie tablice liczb rzeczywistych (jedna dla części
rzeczywistej sygnału, druga dla części urojonej sygnału), a w wyniku zwraca dwie tablice
odpowiednio dla części rzeczywistej wyniku i urojonej widma DFT.
Działanie funkcji należy przetestować dla sygnału zespolonego, dla którego znamy
prawidłowy wynik DFT. Prezentując działanie funkcji należy wyjaśnić, dlaczego uważa się,
że funkcja działa prawidłowo.
function [Yr,Yi]=gj_cdft(Xr,Xi)
N=length(Xr);
for i=1:N
Tr=0;Ti=0;
for j=1:N
Er=cos(2*pi*(i)*(j)/N);
Ei=sin(2*pi*(i)*(j)/N);
[Er,Ei]=gj_cmul(Xr(j),Xi(j),Er,Ei);
[Tr,Ti]=gj_cadd(Tr,Ti,Er,Ei);
endfor
Yr(i)=Tr;Yi(i)=Ti;
endfor
endfunction
Zadanie nr 5
Zadanie piąte polega na usunięciu błędów z funkcji obliczającej odwrotną DFT sygnału
zespolonego. Funkcja jako parametr przyjmuje dwie tablice liczb rzeczywistych (jedna dla
części rzeczywistej, a druga dla części urojonej widma DFT). W wyniku również zwraca dwie
tablice liczb rzeczywistych (jedna dla części rzeczywistej, a druga dla części urojonej
sygnału).
Działanie funkcji należy przetestować dla widma sygnału zespolonego, dla którego znamy
prawidłowy wynik odwrotnej DFT. Prezentując działanie funkcji należy wyjaśnić, dlaczego
uważa się, że funkcja działa prawidłowo.
function [Yr,Yi]=gj_icdft(Xr,Xi)
N=length(Xr);
for i=1:N
Tr=0;Ti=0;
for j=1:N
Er=cos(2*pi*(i)*(j)/N);
Ei=sin(2*pi*(i)*(j)/N);
[Er,Ei]=gj_cmul(Xr(j),Xi(j),Er,Ei);
[Tr,Ti]=gj_cadd(Tr,Ti,Er,Ei);
endfor
Yr(i)=Tr;Yi(i)=Ti;
endfor
endfunction
Pytania i zadania na kartkówkę
1.
2.
3.
4.
b
Co trzeba zrobić z wynikiem funkcji   arctg   dla liczby zespolonej -2+j, aby
a
prawidłowo obliczyć argument tej liczby?
b
Co trzeba zrobić z wynikiem funkcji   arctg   dla liczby zespolonej -2-j, aby
a
prawidłowo obliczyć argument tej liczby?
Podaj przykład liczb zespolonej, dla której można w pamięci obliczyć moduł?
Jaką częstotliwość będzie miała 5 składowa DFT sygnału o liczbie próbek równiej 100 i
okresie próbkowania równym 0.1s?
5.
Ile współczynników DFT trzeba obliczyć dla sygnału zespolonego o liczbie próbek 100,
aby potem go odtworzyć?
6. Ile współczynników DFT trzeba obliczyć dla sygnału rzeczywistego o liczbie próbek
100, aby potem go odtworzyć?
7. Czy obliczając DFT dla sygnałów rzeczywistych możemy używać równania (1)?
8. Jak będzie się różniła amplituda współczynników DFT obliczanych równaniem (1) i (3)
dla sygnałów rzeczywistych.
9. Jak będzie się różniła amplituda współczynników DFT o indeksie 0 i N/2 obliczanych
równaniem (1) i (3) dla sygnałów rzeczywistych o liczbie próbek sygnału N.
10. Podaj przykład równań sygnału rzeczywistego i jego widma DFT.
11. Podaj przykład równań sygnału zespolonego i jego widma DFT.