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