Elementy systemu z przetwarzaniem AC-CA
Transkrypt
Elementy systemu z przetwarzaniem AC-CA
DSP - MATLAB, Ćwiczenie 7 Instrukcja do laboratorium z cyfrowego przetwarzania sygnałów Ćwiczenie 7 Elementy systemu z przetwarzaniem AC-CA; model systemu AC-CA Przemysław Korohoda, KE, AGH Zawartość instrukcji: 1 Opis algorytmów Overlap-Add i Overlap_Save 2 Zadania do wykonania 3 Szczegółowe wskazówki do realizacji zadań 3.1 Pokazanie związku pomiędzy transformatą danego ciągu i transformatą tego samego ciągu po przeprowadzeniu decymacji 3.2 Demonstracja zastosowania twierdzenia o próbkowaniu w wersji dyskretnej - gdy warunki odtworzenia są spełnione (oraz - jako samodzielne zadanie dodatkowe - gdy warunki te nie są spełnione) 3.3 Przykłady widm oraz odpowiedzi impulsowych par filtrów kwadraturowych i komplementarnych energetycznie 3.4 Przykłady systemów odwrotnych 3.5 Korzyści z zastosowania metod Overlap-Add i Overlap-Save 3.6 Model systemu analogowo-cyfrowo-analogowego (A/C - C/A) opartego na Dyskretnej Transformacji Fouriera 1 DSP - MATLAB, Ćwiczenie 7 Na instrukcję składają się następujące części: 1 Opis algorytmów Overlap-Add i Overlap_Save 2 Zadania do wykonania 3 Szczegółowe wskazówki do realizacji zadań Do sprawnego wykonania ćwiczenia nie jest konieczna wcześniejsza praktyczna znajomość nie wprowadzonych w ramach poprzednich ćwiczeń funkcji pakietu MATLAB, jednak niezbędne jest przeanalizowanie tej instrukcji w oparciu o wiedzę z poprzednich ćwiczeń. W razie niejasności należy skonsultować się z prowadzącym przed zajęciami - na przykład w terminie konsultacji - bezpośrednio lub poprzez e-mail: [email protected] 2 DSP - MATLAB, Ćwiczenie 7 1 Opis algorytmów Overlap-Add i Overlap_Save (Filtracja za pomocą filtrów FIR z wykorzystaniem FFT) W dotychczasowych rozważaniach przyjmowano, że przez filtr FIR rozumie się jego odpowiedź impulsową, bezpośrednio stosowaną do wyznaczania splotu liniowego. Charakterystyka widmowa filtru stanowiła jedynie wstępne założenie projektowe. Warto przypomnieć, że dla dostatecznie długiej odpowiedzi impulsowej znacznie szybsze obliczeniowo może się okazać zastosowaniu algorytmu overlap-save (lub overlap-add). Podejście to polega na realizacji splotu liniowego poprzez filtrację w dziedzinie DFT. na rys.1 i rys.2 przedstawiono istotę obu metod. W obu metodach ciąg wejściowy dzielony jest w miarę napływania danych na bieżąco na bloki o długości Lx . Każdy blok, w chwili jego filtracji, jest uzupełniony zerami (algorytm overlap-add) lub początkiem kolejnego bloku (algorytm overlap-save). Długość tego uzupełnienia jest równa długości odpowiedzi impulsowej filtru FIR pomniejszonej o 1, czyli Lh − 1 . W kolejnym kroku blok o łącznej długości Lx + Lh − 1 poddawany jest FFT, po czym przeprowadzana jest filtracja za pomocą mnożenia przez transformatę DFT odpowiedzi impulsowej filtru i wynik filtracji poddawany jest odwrotnej transformacji - czyli IFFT. Filtracja taka odpowiada splotowi kołowemu bloku danych o długości Lx + Lh − 1 . W celu sprowadzenia wyniku do postaci odpowiadającej fragmentowi splotu liniowego o długości się następujące zabiegi: Lx stosuje a) w algorytmie overlap-add: Wynik splotu kołowego, o długości Lx + Lh − 1 , dzielony jest na dwie części - pierwszą, o i drugą, o długości Lh − 1 . Do kolejnych początkowych Lh − 1 długości Lx elementów pierwszej części dodawane są kolejne elementy zapamiętane w buforze, znajdujące się tam w wyniku przetwarzania poprzedniego bloku. Z kolei druga część właśnie o długości Lh − 1 - jest wpisywana jaka nowa zawartość bufora, do wykorzystania przy filtracji kolejnego bloku. Cała, tak zmodyfikowana, pierwsza część o długości Lx stanowi odpowiedni fragment splotu liniowego. b) w algorytmie overlap-save: Wynik splotu kołowego, o długości Lx + Lh − 1 , jest dzielony na dwie części. W tym Lh − 1 i jest po prostu odrzucana, natomiast jako odpowiedni fragment splotu liniowego pozostawia się część drugą, o długości Lx . przypadku pierwsza część ma długość Rys.1. Algorytm overlap-add 3 DSP - MATLAB, Ćwiczenie 7 Rys.2. Algorytm overlap-save W ramach ćwiczenia samodzielnego należy się zastanowić, w jaki sposób, bazując na liniowości splotu oraz DFT, można uzasadnić poprawność obu algorytmów. 2 Zadania do wykonania 1. Pokazać związek pomiędzy transformatą danego ciągu i transformatą tego samego ciągu po przeprowadzeniu decymacji. 2. Zademonstrować zastosowanie twierdzenia o próbkowaniu w wersji dyskretnej - gdy warunki odtworzenia są spełnione (oraz - jako samodzielne zadanie dodatkowe - gdy warunki te nie są spełnione). 3. Pokazać przykłady widm oraz odpowiedzi impulsowych par filtrów kwadraturowych i komplementarnych energetycznie. 4. Podać przykłady systemów odwrotnych. 5. Pokazać korzyści z zastosowania metod Overlap-Add i Overlap-Save. 6. Przeprowadzić analizę modelu systemu analogowo-cyfrowo-analogowego (A/C - C/A) opartego na Dyskretnej Transformacji Fouriera. 4 DSP - MATLAB, Ćwiczenie 7 3 Szczegółowe wskazówki do realizacja zadań 1. Pokazać związek pomiędzy transformatą danego ciągu i transformatą tego samego ciągu po przeprowadzeniu decymacji Należy zamknąć wszystkie okna graficzne oraz usunąć zmienne. (Pod)Próbkowanie sygnału cyfrowego umożliwiające jego późniejsze odtworzenie. Rozpoczynamy od wygenerowania (pseudo)losowego sygnału cyfrowego o długości N: >> N=1024; >> x=rand(1,N); >> x=x-0.9*sum(x)/N; zmniejszamy składową stałą; >> X=fft(x); >> H=zeros(1,N); >> H(1:32)=ones(1,32); >> H(N:-1:N-30)=ones(1,31); >> max(abs(imag(ifft(H)))) sprawdzenie poprawności symetrii dla widma filtru dolnoprzepustowego >> XF=X.*H; filtracja dolnoprzepustowa >> xf=ifft(XF); >> max(abs(real(xf))) sprawdzenie poprawności symetrii >> xf=real(xf); nie kasować tej zmiennej - będzie potrzebna!!! >> samp=zeros(1,N); >> sp=8; okres podpróbkowania - nie kasować tej zmiennej - będzie potrzebna!!! >> samp(1:sp:N)=1; i tak powstaje funkcja grzebieniowa dla sygnałów cyfrowych >> xs=xf.*samp; a tak otrzymuje się sygnał próbkowany >> XS=fft(xs); nie kasować tej zmiennej - będzie potrzebna!!! >> plot(0:N-1,abs(XS),’r’); porównanie widm amplitudowych >> hold on; >> plot(0:N-1,abs(XF)/sp,’b’); >> XF0=fftshift(XF); >> XS0=fftshift(XS); >> figure(2); porównanie widm amplitudowych z punktem DC w środku: >> plot(-512:511,abs(XS0),’r’); >> hold on; >> plot(-512:511,abs(XF0)/sp,’b’); >> max(abs(XF0(513-63:513+64)-XS0(513-63:513+64)*sp)) dokładne sprawdzenie UWAGA - nie usuwać zmiennych !!! 2. Zademonstrować zastosowanie twierdzenia o próbkowaniu w wersji dyskretnej - gdy warunki odtworzenia są spełnione (oraz - jako samodzielne zadanie dodatkowe - gdy warunki te nie są spełnione) Odtwarzanie sygnału pierwotnego: >> M=128; >> HR0=zeros(1,N); >> HR0(513-(M/2-1):513+(M/2-1))=sp; filtr dolnoprzepustowy z punktem DC w środku widma UWAGA - ilość jedynek musi być w tym przypadku nieparzysta!!! >> HR=fftshift(HR0); i korzystamy z poprzedniej demonstracji: >> XR=XS.*HR; filtracja dolnoprzepustowa widma sygnału spróbkowanego nstępnie odtwarzamy przebieg w dziedzinie “czasu” (uwaga - pominięto sprawdzenie, czy nie popełniono “błędu symetrii”): 5 DSP - MATLAB, Ćwiczenie 7 >> xr=real(ifft(XR)); >> max(abs(xr-xf)) >> hr=real(ifft(HR)); >> n=-512:511; >> hr0=fftshift(hr); >> figure(3); >> plot(n,hr0); >> ssinc=sinc(n/sp); >> hold on >> plot(n,ssinc,’r’); >> axis([-64,64,-1,1]); >> plot(-64:sp:64,1,’b+’); >> err=hr0-ssinc; >> figure(4); >> plot(n,err); porównanie sygnału sprzed próbkowania i odtworzonego odpowiedź impulsowa filtru odtwarzającego przebieg odpowiedzi impulsowej z indeksem czasowym “0” w środku funkcja interpolująca według teorii sygnałów ciągłych (próbkowana do postaci ciągu) oznaczenie punktów położenia próbek na osi indeksów czasowych wykres ilorazu obu odpowiedzi impulsowych >> asinc0=sin(pi*n*(M-1)/N)./sin(pi*n/N)/M; >> asinc0(N/2+1)=1; >> asinc=fftshift(asinc0); >> ASINC=fft(asinc); >> figure(5); >> SSINC=fft(ssinc); >> plot(0:N-1,abs(SSINC)); >> hold on >> plot(0:N-1,abs(ASINC),’r’); >> axis([0,120,0,max(abs(SSINC))]); inna propozycja widmo amplitudowe dla ssinc widmo amplitudowe dla asinc 3. Pokazać przykłady widm oraz odpowiedzi impulsowych par filtrów kwadraturowych i komplementarnych energetycznie (należy zamknąć wszystkie okna graficzne MATLAB’a i usunąć wszystkie zmienne) Warto podkreślić, że komplementarność filtrów wiąże się zazwyczaj z równoległym połączeniem filtrów, podczas gdy odwrotność filtrów z połączeniem szeregowym. a) filtry kwadraturowe: >>h1=[rand(1,8),zeros(1,8)]; >>k=0:15; >>h2=h1(16-k).*((-1).^(k)); >>H1=fft(h1); >>H2=fft(h2); >>plot(abs(H1)); >>hold on >>plot(abs(H2),’r’); b) filtry komplementarne energetycznie (Uwaga: aby można było stworzyć filtr komplementarny energetycznie do danego filtru konieczne jest by wartość amplitudy tego filtru nigdzie nie przekraczała wartości 1) : >>h1=[rand(1,8),zeros(1,8)]; >>H1=fft(h1); >>Mmax=max(abs(H1)); >>h1=h1/Mmax; >>H1=fft(h1); 6 DSP - MATLAB, Ćwiczenie 7 >>H=ones(1,16); >>MH2=H-abs(H1).^2; >>H2=sqrt(MH2).*exp(j*rand(1,16)); >>plot(abs(H1)); >>hold on >>plot(abs(H2),’r’); >>plot(abs(H1).^2+abs(H2).^2,’m’); 4. Podać przykłady systemów odwrotnych (należy zamknąć wszystkie okna graficzne MATLAB’a i usunąć wszystkie zmienne) Łatwo jest pokazać analitycznie, że „różnica wstecz” jest systemem odwrotnym do „akumulatora” (akumulator jest systemem IIR natomiast „różnica wstecz” jest systemem FIR). W ogólności możliwe są dwa podejścia: 1) w dziedzinie czasu, 2) w dziedzinie częstotliwości. ad 1) W dziedzinie czasu wystarczy zamienić miejscami współczynniki rownania różnicowego a oraz b. Zatem systemem odwrotnym do systemu o współczynnikach równania różnicowego (b,a) będzie system (a,b) - można to wykazać np. w oparciu o transmitancję “Z” lub też przekształcając odpowiednio równania różnicowe. Odpowiedź impulsowa kaskady filtrów wzajemnie odwrotnych musi być deltą Kroneckera. ad 2) W dziedzinie częstotliwości (DFT) system odwrotny do danego (oznaczymy jego transmitancję jako Hinv(f)) to taki, że iloczyn obu transmitancji daje transmitancję wypadkową w postaci ciągu samych jedynek (lub jedynek podzielonych przez pewien stały współczynnik): Hinv ( f ) = 1 H( f ) (1) Co oznacza, że H(f) nie może być nigdzie równa zero. Zależność (1) wynika z tego, że transmitancja szeregowego połączenia dwóch wzajemnie odwrotnych systemów musi być wszechprzepustowa - bez żadnych zniekształceń. Jednak w tym przypadku filtracja odpowiada splotowi kołowemu. Naturalnie podejście 1) można również zinterpretować za pomocą transmitacji - transmitancja “Z” pozwala łatwo wyjaśnić dlaczego filtr odwrotny otrzymuje się przez zamianę współczynników “a” i “b” - jednak nie powina to być w tym przypadku transmitancja DFT. Poniższe przykłady pokazują, że oba podejścia nie są równoważne. Uwaga - pominięto polecenia powodujące wyświetlanie otrzymanych wyników. zamiana współczynników równania różnicowego: najpierw generowane są wektory „a” oraz „b” opisujące przypadkowy system i następnie: >> a=rand(1,2)-0.5; >> b=rand(1,4)-0.5; >>ai=b; >>bi=a; >>d=zeros(1,128); >>d(65)=1; >>y1=filter(b,a,d); >>y2=filter(bi,ai,y1); >>plot(y2); Czy otrzymano deltę Kroneckera? 7 DSP - MATLAB, Ćwiczenie 7 dzielenie odpowiedzi częstotliwościowych - wersja z zastosowaniem splotu kołowego: rozpoczynamy od opisu systemu w postaci odpowiedzi częstotliwościowej: >>H=rand(1,65).*exp(j*[0,(rand(1,63)-0.5)*2*pi,0]); >>H=[H,conj(H(64:-1:2))]; >>h=real(ifft(H)); dla sprawdzenia i zaspokojenia ciekawości >>Hinv=1./H; >>hinv=real(ifft(Hinv)); warto porównać z wynikiem zastosowania splotu liniowego: >>hszereg=conv(hinv,h); i drugie porównanie: >>d=[zeros(1,64),1,zeros(1,63)]; >>y1=conv(h,d); >>y2=conv(hinv,y1); natomiast test dla sygnału losowego i splotu kołowego jest następujący (choć to przecież oczywiste): >>s=rand(1,128); >>S=fft(s); >>S1=S.*H; >>s1=real(ifft(S1)); nie jest to potrzebne, ale by zaznaczyć istnienie sygnału po filtracji za pomocą H wyliczamy jednak s1 >>S1a=fft(s1); >>S2=S1a.*Hinv; >>s2=real(ifft(S2)); 5. Pokazać korzyści z zastosowania metod Overlap-Add i Overlap-Save (należy zamknąć wszystkie okna graficzne MATLAB’a i usunąć wszystkie zmienne) Należy zbadać dla jakich długości sygnału może się opłacać zastosowanie wspomnianych w tytule metod - przy spełnieniu pewnych warunków oraz dla odpowiedzi impulsowej “h” o długości 64 ( lh = 64 ) algorytmy te mają już niewielką przewagę nad filtracją filter lub conv. Ponieważ obie metody operują na blokach - fragmentach ciągu o stałej długości - więc niekiedy zachodzi konieczność uzupełnienia ciągu wejściowego tak, by możliwe było podzielenie go na całkowitą liczbę odpowiednich bloków. Aby uzupełnianie nie było konieczne powinno być spełnione następujące równanie: ( k − 1) ⋅ lh + 1 = lx B (2) gdzie B to dowolna liczba naturalna. Podany wyżej wynik sumulacji dotyczy k=8, zatem długość bloku ciągu wejściowego powinna wynosić l x = 449 ⋅ B . Dodatkowo powinno być też spełnione równanie: k ⋅ lh = 2 . Ma ono zapewnić, by FFT było wyznaczane w warunkach optymalnych dla zastosowanego algorytmu. W m-plikach długość odpowiedzi impulsowej oznaczono jako M. p Należy określić kiedy wspomniane algorytmy są korzystniejsze obliczeniowo dla innych, wybranych wartości k. W tym celu trzeba skorzystać z gotowych plikow overadd.m i oversave.m oraz splot.m. Ostatni z plików wylicza ilość operacji zmiennoprzecinkowych potrzebnych do wyznaczenia fragmentu splotu liniowego o tej samej długości co ciąg wejściowy. Zadanie należy zrealizować samodzielnie korzystając z załączonych m-plików oraz funkcji Matlab’a. Załączone m-pliki: 8 DSP - MATLAB, Ćwiczenie 7 function [y, ytail,c]=overadd(x,h,k); % [y,ytail,c]=overadd(x,h,k); % Do wyznaczania odpowiedzi filtru FIR na sygnal "x" % w oparciu o odpowiedz impulsowa filtru "h"; % Zamiast splatania stosuje sie metode 'overlap-add' % wykorzystujaca FFT, mnozenie w dziedzinie Fouriera oraz IFFT; % x - ciag wejsciowy; % h - odpowiedz impulsowa filtru; % k - ile razy blok dla FFT ma byc dluzszy od "h"; % y - ciag wyjsciowy (o dlugosci takiej samej co ciag wejsciowy); % ytail - dodatkowy fragment (wyliczany tak czy siak) % dopelniajacy ciag wyjsciowy do dlugosci takiej jak po % poleceniu conv; % c - licznik operacji flops; % % UWAGA - ciag "x" jest wydluzany (zerami) tak by skladal sie z calkowitej ilosci % blokow - stad moze wynikac niezgodnosc dlugosci ciagow wyjsciowych % z przewidywana; % Jezeli nie chcemy by zera byly dodawane nalezy zapewnic, by % "x" zawieralo calkowita ilosc blokow o dlugosci: L=(k-1)*M+1; % FFT liczone jest dla ciagu o dlugosci: k*M; x=x(:)'; h=h(:)'; K1=length(x); M=length(h); L=(k-1)*M+1; bloki=ceil(K1/L); K = bloki*L; if K1~=K disp('UWAGA - przedluzono ciag "x" ciagiem zer'); end; x=[x,zeros(1,K-K1)]; Start = 1; Koniec = K-L+1; N=L+M-1; H = fft(h,N); x2 = zeros(1,M-1); count = 0; for i=Start:L:Koniec, x1=[x(i:i+L-1) zeros(1,M-1)]; flops(0); FX = fft(x1); YM = H.*FX; x1 = real(ifft(YM)); x1(1:M-1) = x1(1:M-1)+x2; count = flops+count; x2 = x1(L+1:N); y1 = x1(1:L); if i==Start, y=y1; else y = [y y1]; end; end; ytail=x2; c = count; end; 9 DSP - MATLAB, Ćwiczenie 7 function [y,c]=oversave(x,h,k); % [y,c]=oversave(x,h,k); % Do wyznaczania odpowiedzi filtru FIR na sygnal "x" % w oparciu o odpowiedz impulsowa filtru "h"; % Zamiast splatania stosuje sie metode 'overlap-save' % wykorzystujaca FFT, mnozenie w dziedzinie Fouriera oraz IFFT; % x - ciag wejsciowy; % h - odpowiedz impulsowa filtru; % k - ile razy blok dla FFT ma byc dluzszy od "h"; % % y - ciag wyjsciowy (o dlugosci takiej samej co ciag wejsciowy); % c - licznik operacji flops; % % UWAGA - ciag "x" jest wydluzany (zerami) tak by skladal sie z calkowitej ilosci % blokow - stad moze wynikac niezgodnosc dlugosci ciagow wyjsciowych % z przewidywana; % Jezeli nie chcemy by zera byly dodawane nalezy zapewnic, by % "x" zawieralo calkowita ilosc blokow o dlugosci: L=(k-1)*M+1; % FFT liczone jest dla ciagu o dlugosci: N=k*M; x=x(:)'; h=h(:)'; K1=length(x); M=length(h); L=(k-1)*M+1; bloki=ceil(K1/L); K = bloki*L; if K1~=K disp('UWAGA - przedluzono ciag "x" ciagiem zer'); end; x=[zeros(1,M-1) x(1:K1) zeros(1,K-K1)]; Start = M; Koniec = K-L+M; N=L+M-1; H = fft(h,N); count=0; for i=Start:L:Koniec, x1=x(i-M+1:i+L-1); flops(0); FX = fft(x1); YM = H.*FX; x1 = real(ifft(YM)); count=flops+count; y1=x1(M:M+L-1); if i==Start, y=y1; else y = [y y1]; end; end; c=count; 10 DSP - MATLAB, Ćwiczenie 7 function [y,c]=splot(x,h); % [y,c]=splot(x,h); % % plik do testowania opisu splatania liniowego % realizuje algorytm splatania "wprost" - czyli “na piechote” % % x,h - dwa ciagi, ktore maja byc splatane liniowo % y - wynik splatania % c - wynik polecenia "flops" (sumowane dla tylu punktow wyniku, % ile jest punktow dluzszego z ciagow), % parametr "c" sluzy do porownan z overlap-add i overlap-save % x=x(:); h=h(:); Nx=length(x); Nh=length(h); count=0; if Nx>=Nh xaux=[zeros(Nh-1,1);x;zeros(Nh-1,1)]; h=h(Nh:-1:1); for k=1:Nx+Nh-1, xaux2=xaux(1+k-1:1+k-1+(Nh-1)); flops(0); y(k)=xaux2'*h; if k<=Nx count=count+flops; end; end; else haux=[zeros(Nx-1,1);h;zeros(Nx-1,1)]; x=x(Nx:-1:1); for k=1:Nx+Nh-1, haux2=haux(1+k-1:1+k-1+(Nx-1)); flops(0); y(k)=haux2'*x; if k<=Nh count=count+flops; end; end; end; c=count; 11 DSP - MATLAB, Ćwiczenie 7 6. Przeprowadzić analizę modelu systemu analogowo-cyfrowo-analogowego (A/C - C/A) opartego na Dyskretnej Transformacji Fouriera (należy zamknąć wszystkie okna graficzne MATLAB’a i usunąć wszystkie zmienne) Model składa się z następujących etapów: • filtracja dolnoprzepustowa • próbkowanie sample-and-hold, czyli przetwornik A/C • jakieś przetwarzanie cyfrowe ( w tym modelu pominięte) • przetwarzanie C/A z szerokim pasmem wyjściowym • filtracja dolnoprzepustowa Sygnał analogowy jest modelowany dużo gęściej próbkowanym. Załóżmy, że sygnał ciągły jest modelowany próbkowaniem 1048,576KHz. Symulacja jest przeprowadzana dla odcinka 131072 próbek (2 do potęgi 17, zatem N=17), czyli okres próbkowania wynosi 1/8 sekundy. Oznacza to, że po DFT próbkowanie osi częstotliwości odbywa się co 8Hz - wartość w Hz wynika z odpowiedniego przeliczenia. W czasie ćwiczenia należy skorzystać z załączonych m-plików typu „script”: acca1.m, acca2.m, acca3.m, acca4.m, acca5.m. Tłustym drukiem podano poniżej te polecenia, które nie zostały umieszczone w wymienionych m-plikach. Uwaga - przeprowadzając symulację na wolniejszych komputerach wskazane jest skrócenie ciągu próbek, na przykład do N=12. Jak wpłynie to na otrzymany wynik ? W m-pliku acca5 skorzystano z funkcji Matlab’a buttord oraz butter. Szczegółowy opis tych funkcji będzie przedmiotem późniejszych ćwiczeń - na tym etapie wystarczy przyjąć, iż funkcje te wyznaczą odpowiedni cyfrowy filtr dolnoprzepustowy. Generowanie sygnału i ograniczanie jego pasma - filtracja antyaliasingowa: uruchamiamy zawartość m-pliku acca1: N=17; tu m-plik zapyta o wartość N S=exp(-(0:2^(N-1)+1)/(2^(N-4))).*exp(j*[0,(rand(1,2^(N-1))-0.5)*2*pi,0]); S=[S,conj(S(2^(N-1)-1:-1:2))]; s=real(ifft(S)); >> plot(abs(S)); Filtracja dolnoprzepustowa ograniczająca pasmo do 8,192kHz: uruchamiamy zawartość m-pliku acca2: F=zeros(1,2^N); F(1:2^(N-7)+1)=ones(1,2^(N-7)+1); F(2^N-2^(N-7)+2:2^N)=ones(1,2^(N-7)-1); S1=S.*F; s1=real(ifft(S1)); przesuwamy w pionie po to, by nie było wartości ujemnych (by minimalna wartość wynosiła zero): Mmin=min(s1); s1=s1-Mmin; >> hold on; >> plot(abs(F),’r’); >> hold off Próbkowanie 32,768kHz typu “sample-and-hold” oraz przetwarzanie A/C do postaci unipolarnej, Bbitowej: uruchamiamy zawartość m-pliku acca3: ssample0=zeros(1,2^N); ssample0(1:32:2^N)=s1(1:32:2^N); M=max(ssample0); B=2; tu m-plik zapyta o ilość bitów ssample=(round(ssample0/(M/(2^B-1))))*(M/(2^B-1)); plot(ssample(1:2^10)); obejrzenie efektu kwantyzacji: >>plot(ssample0(1:32:2^10)); >>hold on; 12 DSP - MATLAB, Ćwiczenie 7 >>plot(ssample(1:32:2^10),’r’); PrzetwarzanieC/A - sygnał cyfrowy jest przetwarzany na schodkowy pseudo-ciągły: uruchamiamy zawartość m-pliku acca4: b=ones(1,32); sca=filter(b,1,ssample); SCA=fft(sca); widmo, przyda się potem plot(sca(1:2^10),’r’); hold on; plot(ssample(1:2^10)); zmiana kolejności wykresów, by delty były widoczne na tle słupków plot(s1(1:2^10),’b’); sygnał pseudo-ciągły warto też obejrzeć widmo filtru: >>H=fft(b,2^17); >>figure(2); >>plot(abs(H(1:2^16+1))); oraz widmo sygnału na wyjściu przetwornika C/A: >>plot(abs(SCA(1:2^16+1))); >>plot(abs(SCA(1:2^10))); >>plot(20*log10(abs(SCA(1:2^16+1)))); >>plot(abs(SCA(1:2^6))); >>axis([1,2^6,0,1000]); >>plot(abs(SCA(2^10:2^10+2^6))); >>axis([1,2^6,0,1000]); całe pasmo tylko połowa pasma (do 8KHz) żeby lepiej było widać całkiem na początku pasma i nieco dalej, w okolicy 8KHz dla wariantu z założonym widmem dobrze jest obejrzeć widmo sygnału, sygnału spróbkowanego i po przetworniku (widać np. spadek amplitudy 32 razy - tyle ile wynosi okres próbkowania - co tłumaczy amplitudę filtru modelującego przetwornik C/A): >>plot(abs(S1(1:2^16))); >>hold on >>SSAMPLE=fft(ssample); >>plot(abs(SSAMPLE(1:2^16)),’r’); >>plot(abs(SCA(1:2^16)),’b’); Filtracja dolnoprzepustowa: przykładowo za pomocą filtru Butterwortha, uruchamiamy zawartość m-pliku acca5: [n,wn]=buttord(1/64,3/64,0.22,40); później [bp,ap]=butter(n,wn); hp=filter(bp,ap,[1,zeros(1,2^N-1)]); HP=fft(hp); SC=SCA.*HP; sc=real(ifft(SC)); znaczenie parametrów będzie wyjaśnione (po filtracji poleceniem filter wychodzi gorzej, bo długa jest odpowiedź impulsowa i długo ciągnie się efekt zerowych warunków początkowych) do wykresów w dziedzinie częstotliwości można dodać kolejny wykres: >>plot(abs(HP(1:2^16)),’m’); Porównanie z sygnałem pierwotnym: >>plot(s1(1:2^10)); >>hold on >>plot(sc(1:2^10),’r’); w celu lepszego porównania sygnał odtworzony można przesunąć w poziomie, żeby zobaczyć, że oprócz pewnych zniekształceń, powstało też przesunięcie. Z czego wynika wartość tego przesunięcia? 13 DSP - MATLAB, Ćwiczenie 7 14