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(2n+) i cos()=cos(2n+) dla n∈ℤ . Dlatego re j re j 2n 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 2kn / N cos2kn / N j sin 2kn / 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 2kt j sin 2kt , exp j 2kt 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 2kt / T - dla sygnałów ciągłych okresowych, exp j 2ft - dla sygnałów ciągłych nieokresowych, exp j 2fn - 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 xne j 2kn 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 xn X k e j 2kn 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 Rek N N 1 2 2kn xn cos , Imk N N n 0 N 1 2kn , N xnsin 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. Rek 1 N N 1 1 2kn xn cos , Imk N N n 0 N 1 2kn , dla k {0, N / 2} N xnsin 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 2kn 2kn xn Rek cos Imk 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.