Gaál József Dgtáls jelfeldolgozás eszköze II. kötet A jelfeldolgozás szoftver eszköze Matlab gyakorlatok KHVM - BMGE HT (2001.) 3. kadás Budapest, 2006.
2/40 Bevezetés 1. Gyakorlat: ARMA jelek dő- és operátortartomány reprezentácónak grafkus vzsgálatára 2. Gyakorlat: Idő- és frekvencatartomány reprezentácók grafkus vzsgálatára 3. Gyakorlat: Sávhatárolt KF jel alul-mntavételezés frekvencájának meghatározása 4. Gyakorlat: Egyenletes és logartmkus kvantálók vzsgálata 5. Gyakorlat: Dfferencáls kódolók vzsgálata
3/40 Bevezetés A dgtáls jelfeldolgozás dszkrét dejű jelenek és rendszerenek analízsét és szntézsét gen hatékonyan támogató lehetőségeket nyújt (a korábban már más tárgyak során megsmert) MATLAB. Ezen tárgy keretében, néhány számítógépterm gyakorlat során pár jellegzetes példa-feladat elkészítésére és működtetésére kerül sor. A gyakorlatok fő célja, hogy kdogozott esetek kapcsán, mntegy példát mutatva segítsen kalakítan azt a készséget, mellyel a későbbekben a mndenkor problémakörhöz lleszkedve mndenk elkészíthet majd a saját feladat-orentált eszközet. Néhány általános tanács: javasolt az on-lne help ntenzív használata a szerszámankat.m fle-ba írjuk folyamatos tesztelés MATLAB command wndow-ban használjuk az autohelp konvencót összetettebb esetben herarchkusan szervezett, egyszerű szerszámokból építsük fel a kísérletenket jól átgondolt nterfésszel (paraméter lstával) szeparáljuk az algortmkus és a megjelenítő, grafkus funkcókat kerüljük a for cklusok használatát, amkor lehet tömb műveleteket és ndex-tömböket alkalmazzunk
4/40 1. Gyakorlat: ARMA jelek dő- és operátortartomány reprezentácónak grafkus vzsgálatára A dszkrét dejű jelek (és rendszerek) dő- és operátortartománybel leírása között közlekedés eszköz a Z-transzformácó és az nverz Z-transzformácó. A dszkrét dejű jeleket az dőtartományban x(n) számsorozatokkal írjuk le (reprezentáljuk), az operátor tartományban pedg valamely körgyűrű felett analtkus X(z), r1< z <r2 komplex függvényekkel. Az ARMA jelek - defnícó szernt - azok a jelek, melyek Z-transzformáltja raconáls törtfüggvény. Ebben az esetben az operátor(z)-tartomány teljes leírást megkapjuk a z változó raconáls törtje nevező és számláló polnomjanak a gyökevel. Tehát az operátor tartományban a grafkus leírás a pólus-zérus ábra. Első lépésként készítsük el a sorozatokat ll. a raconálstörtek pólus-zérus ábrát megjelenítő MATLAB függvényeket. Az xnplot.m fle: functon xnplot(n,x); % xnplot(n,x) % n: ndexek vektora % x: mntak vektora for = 1:3*length(n) nn() = n(1+floor((-1)/3)); end; xx = zeros(sze(nn)); for = 1:length(n) xx(3*-1) = x(); end; plot(nn,xx,'-',n,x,'o'); Egy példa az dősor rajzoló függvény hívására:» n=[-2:10]; x=0.8.^n; xnplot(n,x); A pzabra.m fle:
5/40 functon pzabra(a,b); % pzabra(a,b); pólus-zérus ábra rajzolása % a a számláló (z)polnom együttható (csökkenő hatvány sorrendben) % b a nevező (z)polnom együttható (csökkenő hatvány sorrendben) zk = roots(a); pk = roots(b); m = max([abs(zk);abs(pk);1]); kx = [-m,0,0,0,0,m]; ky = [0,0,m,-m,0,0]; korx = cos([0:2*p/200:2*p]); kory = sn([0:2*p/200:2*p]); plot(korx,kory, -',kx,ky,'-',... real(zk),mag(zk),'o',real(pk),mag(pk),'x'); m = 1.2*m; axs([-m,m,-m,m]); axs('square'); A pzabra.m hívása:» pzabra([1,-1,1],conv([1,0.7,0.49],[1,-1.5])); és az eredménye: A továbbakan készítsük el raconáls tört alakú Z-transzformáltak nverz Z-transzformáltját számító MATLAB függvényt. Feltételezzük, hogy X(z)-nek adott az A(z) számláló, és B(z) nevező polnomja, továbbá adott a ρ konvergenca sugár, melyet tartalmazó körgyűrűhöz, mnt konvergenca tartományhoz tartozó nverz z-transzformáltat akarjuk kszámítan. A továbbakban még feltételezzük, hogy X(z)-nek csak egyszeres pólusa vannak, így alkalmazhatjuk a parcáls törtekre bontás egyszerű esetét.
6/40 X(z) = A(z) B(z) = = = a z b z M j j j N 0 0 ( ) ( ) = = = N j j N M M p z b z z a 1 1, ahol a z -k X(z) zérusa és p j -k X(z) pólusa. Egyszeres pólusok esetén X(z) parcáls törtek összegeként s felírható: = = + = N N M z k p z r 1 0 B(z) A(z) = X(z), ahol { } r z p = = = res X(z) A(p B'(p ) ) továbbá k az (M-N)-ed fokú egészrész polnom együttható, melyek nullák, ha X(z) valód tört. Az r p k számok vektora a MATLAB-ban a resdue utasítással határozhatóak meg. Mvel a z-transzformácó lneárs művelet, a fent összeg tagjanak külön-külön vehetjük az nverz z-transzformáltját, és az így kapott részsorozatokat a végén összegezhetjük. Ezeket a részsorozatokat a geometra sorok összegére vonatkozó tétel segítségével határozzuk meg: { } { } < + + + = > + + + = = = p z p z p p r p z p r p z p z p z p r z p z r z p z r ρ ρ ρ,... 1 1 1,... 1 1, 2 3 1 2 1 1 1 3 2 2 1 1 0 1 1 1 1 Z Z Z Z Z azaz, < < > > < > = = ha 1,, 0, n 0, ha 1, n 0, 0,,, 1 1 1 n n p n p r p n p r z p z r ρ ρ ρ Z
7/40 A fent meggondolások alapján megírhatjuk az alább nvzp függvényt. (A függvény neve végén levő p betűvel azt hangsúlyozzuk, hogy az a és b nput polnomok z poztív hatványahoz tartoznak.) functon x=nvzp(a,b,ro,nl,nu); %functon x=nvz(a,b,ro,nl,nu); % nverz Z transzformaco (z poztv hatvanya szernt tortre) % a: szamlalo a(1)*z^m + a(2)*z^(m-1)+...+a(m+1) % b: nevezo b(1)*z^n + b(2)*z^(n-1)+...+b(n+1) % ro:konvergenca tartomanybel sugar % nl, nu : a kszamtando dotengely felett ndex-ntervallum % x : eredmeny: az nl...nu ndexekhez tartozo domntak sorozata [res,pol,k]=resdue(a,b); f length(pol) == 0 k=a/b(1); end; t=[nl:nu]; % do ndex tomb mask1=sgn(max(zeros(sze(t)),t)); % ro-n belul polus nemnulla mntanak ndexe mask2=-(ones(sze(t))-mask1); % ro-n kvul polus nemnulla mntanak ndexe x=0*t; for =1:length(pol) x=pol()*ones(sze(t)); x=x.^(t-1); f abs(pol()) <= ro x=mask1.*x; else x=mask2.*x; end; x=x+res()*x; end % for nk=length(k); f nk>0 % nem valod tort eseten tovabb kegesztes [w,xw]=add(t,x,[-(nk-1):0],k); [w,x]=mult(w,xw,t,ones(sze(t))); end A fent megoldásban, az egészrészhez tartozó FIR szűrő mpulzusválasz sorozatának meghatározásánál, felhasználtuk az alább két segédfüggvényt, melyet ndekszelt vektorok összeadását és szorzását végzk:
8/40 functon [3,x3]=add(1,x1,2,x2); %functon [3,x3]=add(1,x1,2,x2); % ndexelt vektorok ndex-helyes osszeadasa % 1, 2, 3: ndexek folyamatosan felsorolt vektora % x1, x2, x3: ndexekhez tartozo mntak vektora % ndextartomanyon kvul nulla mntak feltetelezettek % 3: 1 es 2 unoja 3=[mn(1(1),2(1)):max(1(length(1)),2(length(2)))]; x3=zeros(sze(3)); x3(1-3(1)+1)=x3(1-3(1)+1)+x1; x3(2-3(1)+1)=x3(2-3(1)+1)+x2; functon [3,x3]=mult(1,x1,2,x2); %functon [3,x3]=mult(1,x1,2,x2); % ndexelt vektorok ndex-helyes osszeszorzasa % 1, 2, 3: ndexek folyamatosan felsorolt vektora % x1, x2, x3: ndexekhez tartozo mntak vektora % ndextartomanyon kvul nulla mntak feltetelezettek % 3: 1 es 2 metszete l=max(1(1),2(1)); u=mn(1(length(1)),2(length(2))); f u >= l 3=[l:u]; 3s=[1:length(3)]; x3=x1(3(1)-1(1)+3s).*x2(3(1)-2(1)+3s); end; Az eddg eszközenk kényelmes használatát támogatandó, írjuk meg a grafkát vezérlő gnvzp.m fle-t.
9/40 functon x=gnvzp(a,b,r,nl,nu,ny,nx,n) %functon x=gnvzp(a,b,r,nl,nu,ny,nx,n); % nverz Z transzformaco grafkus outputtal % a: szamlalo a(1)*z^m + a(2)*z^(m-1)+...+a(m+1) % b: nevezo b(1)*z^n + b(2)*z^(n-1)+...+b(n+1) % r: konvergenca tartomanybel sugar % nl, nu : a kszamtando dontervallum % ny,nx,n: subplot(ny,nx,n) vezerlo adatok subplot(ny,nx,n); pzabra(a,b); %szoveg=['konvergenca tartomanybel kontursugar: ',num2str(r)]; szoveg=['ro=',num2str(r)]; xlabel(szoveg); ttle('polus-zerus kep'); t=[nl:nu]; x=nvzp(a,b,r,nl,nu); subplot(ny,nx,n+nx); xnplot(t,x); xlabel('idosor'); subplot(111); Ellenőrző és llusztratív példaként vzsgáljuk meg az 2z - 2.5 1 1 X(z) = = + (z - 0.5)(z - 2.0) z - 0.5 z 2.0 esetét ρ = 0.2, 1.0 és 5.0 konvergenca sugarak esetére.
10/40 A három különböző konvergenca gyürűvel kapott eredmények: gnvzp([2,-2.5],conv([1,-0.5],[1,-2]),0.2,-10,10,2,3,1); gnvzp([2,-2.5],conv([1,-0.5],[1,-2]),1.0,-10,10,2,3,2); gnvzp([2,-2.5],conv([1,-0.5],[1,-2]),5.0,-10,10,2,3,3);
11/40 Tanulságos összehasonlításként tt vannak az eredmények a csak egy (az egységsugarú körön belül vagy kívül) pólus esetére s, különböző konvergenca sugarak mellett: gnvzp([1],conv([1,-0.5],[1]),0.2,-10,10,2,4,1); gnvzp([1],conv([1,-0.5],[1]),1.0,-10,10,2,4,2); gnvzp([1],conv([1,-2.0],[1]),1.0,-10,10,2,4,3); gnvzp([1],conv([1,-2.0],[1]),5.0,-10,10,2,4,4);
12/40 2. Gyakorlat: Idő- és frekvencatartomány reprezentácók grafkus vzsgálatára Készítsük el azt a t2f.m nevű szerszámot, mellyel egy fc órajelű, nt vektorban levő dőndexek sorozatához tartozó xt mntavektorok komplex sx Fourer transzformáltját számítjuk k a frekvencatengelyen tetszőlegesen előírható fa-ff ntervallum felett. Az fft eljáráson alapuló számítás frekvenca tengely felett f = fc/nfft felbontását az xt mntavektor hossza határozza meg! t2f.m: functon [ft,sx]=t2f(fc,nt,xt,fa,ff); % Tme to Frequency %[ft,sx]=t2f(fc,nt,xt,fa,ff); % fc: orajel % nt, xt: do-ndex vektor es mnta vektor % fa, ff : a szamtando frekvenca sav % sx-ben a komplex spektrum mntak az ft bel frekvencak szernt % FFT pontszam meghatarozasa nfft = 2^cel(log(length(xt))/log(2)); sx = fft(xt,nfft); % a szamtando frekvenca-ndex ntervallum nf = [round(nfft*fa/fc):round(nfft*ff/fc)]; ft = nf*fc/nfft; % a perodkus spektrum nf felett resze sx = sx(mod(nf,nfft)+1); % az xt mntak dobel helyzetenek megfelelo fazs korrekco sx = sx.* exp(-j*2*p*nt(1)*ft/fc); A fent eljáráshoz felhasználtuk az alább moduló függvényt: mod.m: functon y = mod(x,a); % y = mod(x,a) y = x - a * floor(x/a); Az egyébként sokszor használandó moduló függvényünk tesztelése, llusztrálása az alábbak szernt történhet:» plot([-6:0.01:6],mod([-6:0.01:6],4),'.'); grd;» xlabel('x'); ylabel('y'); ttle('y = mod (x,4)');
13/40 Elkészített eszközünket használjuk fel az dőtartomány ablakolás frekvenca-tartomány következményenek vzsgálatára. pelda21.m naa=-2; naf=2; %ablak ndex hatarok % a jel adata fc=10000; T=1/fc; % orajel na=-200; nf=200; nt=[na:nf]; tt=t*nt; %do tengely xat=sgn(nt-(naa-0.1)); xft=sgn((naf+0.1)-nt); xt=(xat+xft)/2; fgure(1); subplot(211); plot(tt,xt,'-'); xlabel('do'); [ft,sx]=t2f(fc,nt,xt,-fc/2,fc/2); subplot(111); fgure(2); subplot(221); plot(ft,real(sx),'-'); xlabel('frekvenca'); ylabel('real'); subplot(223); plot(ft,mag(sx),'-'); xlabel('frekvenca'); ylabel('mag'); subplot(222); plot(ft,abs(sx),'-'); xlabel('frekvenca'); ylabel('abs'); subplot(224); semlogy(ft,abs(sx),'-'); xlabel('frekvenca'); ylabel('log abs'); subplot(111);
14/40
15/40 Szélesebb ablak: naa=-20; naf=20; %ablak ndex hatarok
16/40 201 mnta szélességű ablak esete: naa=-100; naf=100; %ablak ndex hatarok Megjegyzések: - A képzetes részre kapott eredmény a numerkus pontosságra vonatkozó tájékoztatásként értelmezhető - Tovább ksérletek végezhetőek nem páros függvényű ablakkal - Tovább vzsgálatok: fazs, futás dő karaktersztkák - Tovább vzsgálat: ablakolt sznusz spektruma, rövd dejű burst hullam vzsgálata
17/40 3. Gyakorlat: Sávhatárolt KF jel alul-mntavételezés frekvencájának meghatározása A rádótechnkában gyakran előforduló eset, hogy távközlő csatorna jelét valamely középfrekvencás (KF) sávban dolgozzák fel. A feladatunk, hogy meghatározzuk, melyek az adott csatornaszűrő által meghatározott lehetséges mntavétel frekvencák. Példaként tekntsük az alább sávszűrő karaktersztkát: 10kHz ± 1,5dB 60dB df=20 khz 60dB f0=455 khz df=20khz 445 450 455 460 465 khz Fa=f0-df/2 f0 Ff=f0+df/2 Készítsünk Matlab programot, mely az f0, df paraméterekből a frekvencatengely fsa... fsf ntervalluma felett krajzolja a lehetséges mntavétel frekvencák ndkátor függvényét (1 az érték lehetséges frekvenca felett, nulla egyébként) A program megírása előtt tekntsük át a vonatkozó összefüggéseket: A sávszűrő után maradó spektrum, tehát csak az Fa Ff = df ntervallumban tartalmaz komponenseket: -Ff -Fa Fa Ff Az Fs frekvencájú mntavételezés után spektrum: Fs δ 2 δ 1 δ 1 δ 2 k Fs (k+1)fs f -Ff -Fa Fa Ff
18/40 A mntavett jel perodkus spektrumának átlapolódás mentességéhez szükséges az alább egyenlőtlenség rendszer teljesülése: δ 1, δ 2 > 0 ; k egész ; -Fa + k Fs + δ 1 = Fa -Ff + (k+1) Fs - δ 2 = Ff Fs > 2 (Ff - Fa)=2 df k < 2 Fa/Fs, k > (2 Ff Fs)/Fs, kmax = floor(2 Fa / Fs) kmn =cel((2 Ff Fs)/Fs) = cel (2Fa / Fs (1-2 df /Fs)) Adott Fa, Ff értékek mellett a fent egyenlőtlenségrendszernek csak olyan Fs mntavétel frekvenca értékeknél van egész megoldása k-ra, ahol kmn(fs) >= kmax(fs). Mvel 0 < (1-2 df /Fs) < 1, ezért kmn vagy egyenlő kmax-szal, vagy eggyel nagyobb, tehát a keresett ndkátor függvény: 1+ kmax(fs)-kmn(fs) Ezek után a Matlab program: functon subsamp(f0,df,fsa,fsf); fa=f0-df/2; ff=f0+df/2; f fsa < 2*df fsa=2*df; end; fs=[fsa:(fsf-fsa)/1000:fsf]; kmax=floor(2*fa./fs); kmn=cel(2*ff./fs-1); ke=1+ kmax-kmn; % k engedelyezett ndkatora fgure(1) subplot(211) plot(fs,ke,fs,kmax,fs,kmn); grd; ttle(['f0=',num2str(f0),' Hz df=',num2str(df),' Hz']); xlabel('mntavetel frekvenca (Hz)'); %ylabel('kmax(kek), knm(zold)'); delta1=ke.*(2*fa-kmn.*fs); delta2=-ke.*(2*ff-(kmn+1).*fs); subplot(212) plot(fs, delta1, fs, delta2); grd; xlabel('mntavetel frekvenca (Hz)'); ylabel('delta 1,2 (Hz)'); subplot(111);
19/40 Futtatás eredmények: clear; subsamp(455000,22000,44000); Knagyítva a lehetséges legksebb frekvenca környezete: subsamp(455000,22000,44200,44600);
20/40 A továbbakban vzsgáljuk meg, hogyan kell módosítan a számítást, ha fgyelembe akarjuk venn, hogy nem folytonos dejű (analog) jel mntavételezés frekvencáját kell meghatároznunk, hanem már egy fc előzetes mtavétel frekvencáról (nagyfrekvencán dgtalzált jel) akarunk áttérn egy ksebb alul-mntavételezés frekvencára. Ebben az esetben a lehetséges Fs mntavétel frekvencák, nem a folytonos értékek felett értelmezett ntervallumokban lehetségesek, hanem csak a dszkrét Fs = fc/n szubharmónkus frekvencák közül azok, melyek a korábban megsmert egyenlőtlenség rendszert kelégítk. A módosított MATLAB program: functon subsamp(f0,df,fsa,fsf, fc); fa=f0-df/2; ff=f0+df/2; f fsa < 2*df fsa=2*df; end; fs=[fsa:(fsf-fsa)/1000:fsf]; kmax=floor(2*fa./fs); kmn=cel(2*ff./fs-1); ke=1+ kmax-kmn; % k engedelyezett ndkatora cm=['f0=',num2str(f0),' Hz df=',num2str(df),' Hz']; fgure(1) subplot(211) f nargn > 4 % dszkret frekvencak esete nmax=floor(fc/fsa); nmn=cel(fc/fsf); fsd=fc./[nmax:-1:nmn]; kmaxd=floor(2*fa./fsd); kmnd=cel(2*ff./fsd-1); ked=(1+kmaxd-kmnd); % k engedelyezett dszkret ndkatora plot(fs,ke,fs,kmax,fs,kmn,fsd,2*ked,'x'); grd; ttle([cm, fc=',num2str(fc),' Hz']); else plot(fs,ke,fs,kmax,fs,kmn); grd; ttle(cm); end; xlabel('mntavetel frekvenca (Hz)'); delta1=ke.*(2*fa-kmn.*fs); delta2=-ke.*(2*ff-(kmn+1).*fs); subplot(212) f nargn > 4 delta1d=ked.*(2*fa-kmnd.*fsd); delta2d=-ked.*(2*ff-(kmnd+1).*fsd); plot(fs,delta1,fs,delta2,fsd,delta1d,'x',fsd,delta2d,'x'); grd; else plot(fs, delta1, fs, delta2); grd; end xlabel('mntavetel frekvenca (Hz)'); ylabel('delta 1,2 (Hz)'); subplot(111);
21/40 A kapott eredmények, a KF-jel előzetes 1MHz mntavételezés frekvencán történt dgtalzálása esetén: subsamp(455000,22000,44000,100000,1000000); subsamp(455000,22000,57000,60000,1000000);
22/40 4. Gyakorlat: Egyenletes és logartmkus kvantálók vzsgálata Egyenletes, szmmetrkus, r btes kvantálás karaktersztkát az alább függvénnyel valósíthatunk meg: kvant_e.m functon y = kvant_e(x,r,xmn,xmax); % y = kvant_e(x,r,xmn,xmax); % Egyenletes kvantalo % x: bemenet mntak % r: r btes kvantalas % xmn-xmax: felett egyenletes kvantalo, hba < q/2 % y: kvantalt kmenet mntak l = 2^r; % dontes ntervallumok, szntek szama q = (xmax-xmn)/l; % a kvantalas lepcso % nagy jelu mukodes y = mn(x,(xmax-q/2)*ones(sze(x))); % ks jelu mukodes y = max(y,(xmn+q/2)*ones(sze(y))); % kerektes y = xmn+q/2+q*round((y-(xmn+q/2))/q); 4 btes kvantáló esetére a lépcsős kvantálás karaktersztka és a fűrész alakú hba karaktersztkák az alábbak szernt jeleníthető meg: pelda41.m % Egyenletes kvantalo kvantalas es hba karaktersztkaja; fgure(1); r=4; d=1; x=1.5*[-d:d/300:d]; y=kvant_e(x,r,-d,d); e=y-x; plot(x,y,'-',x,e,'-'); grd; axs('equal');
23/40 Kvantálók mérésére gyakran használunk szélessávú, véletlen jelet. 1000 darab, [-1...+1] ntervallum felett egyenletes eloszlású független véletlen szám x vektorát és a hsztogramját az alábbak szernt álthatjuk elő: pelda41.m (folytatás) % mérő jel x=2*(rand(1,1000)-0.5); fgure(2); hst(x,10); v=axs; axs(1.5*v); A kvantálás torzítás mértékének számítására az alább függvényt használhatjuk: snrdb.m: functon s=snrdb(x,y,d); %s=snrdb(x,y,d); %Az x es az y mntak kozott totorztas jelzajvszonya db-ben. %Az osszetartozo mntak y-ban d-utemmel kesnek lx=length(x); ly=length(y); l=mn(lx,ly-d); e=y(1+d:l+d)-x(1:l); s=(sum(x.*x)/lx)/(sum(e.*e)/l); s=10*log10(s);
24/40 A különböző felbontású (különböző btszámú) egyenletes kvantálók kvantálás torzításának a bemenet jelsznttől való függését az alábbak szernt vzsgálhatjuk meg: pelda41.m (folytatás) ns=40; % a bemenet jelszntek szama szgma=logspace(-4,1,ns); % a bemenet jelszntek erteke % a vzsgalando kvantalo-felbontasok:2,4,6,8,10,12,14,16 bt bts=[4:2:16]; for j=1:length(bts), for =1:ns, xs=szgma()*x; ys=kvant_e(xs,bts(j),-1,1); snr(j,)=snrdb(xs,ys,0); end; %for end; %j % jel/zaj meghatarozasa fgure(3); semlogx(szgma.*szgma,snr,'-'); grd, ylabel('snr(db)'); xlabel('nput level'); for j=1:length(bts), text(szgma(27)*szgma(27),snr(j,27),[num2str(bts(j)),' bt']); end;
25/40 Adott kvantálás dnamkatartomány felett sznt független jel-zaj vszonyt logartmkus kvantálóval érhetünk el. kvant_l.m functon y = kvant_l(x,r,d,ddb); % y = kvant_l(x,r,d,ddb); % logartmkus kvantalo % x: bemenet mntak % r: r btes kvantalas % d: +-d felett logartmkus kvantalas % ddb: a logartmkus kvantalo dnamkatartomanya db-ben % y: kvantalt kmenet mntak l = 2^(r-1); % dontes ntervallumok, szntek szama xmn=10^(-ddb/20); ql = (0-log(xmn))/(l-1); % a kvantalas lepcso y = mn(abs(x/d),ones(sze(x))); y = max( y, xmn*ones(sze(x))); yl=log(y); y = (round((yl)/ql))*ql; % nagy jelu mukodes % ks jelu mukodes % kerektes y = d* sgn(x).*exp(y); Természetesen a logartmkus karaktersztka szernt kvantálást s vsszavezethetjük egyenletes kvantálásra a log() kompander- és exp() expander-karaktersztkák használatával: functon y = kvant_le(x,r,d,ddb); % y = kvant_le(x,r,d,ddb); % szmmetrkus, logartmkus kvantalo % x: bemenet mntak % r: r btes kvantalas % d: +-d felett logartmkus kvantalas % ddb: a logartmkus kvantalo dnamkatartomanya db-ben % y: kvantalt kmenet mntak xmax=d; xmn=d*10^(-ddb/20); lxmax=log(xmax); lxmn=log(xmn); ly=kvant_e(log(abs(x)),r-1,lxmn, lxmax); y=sgn(x).*exp(ly);
26/40 A logartmkus kvantáló kvantálás- és torzítás karaktersztkájának megjenítése: r=4; d=1; ddb=r*6; x=2*[-d:d/500:d]; y=kvant_l(x,r,d,ddb); e=y-x; plot(x,y,'w-',x,e,'w-'); grd; axs('equal'); A jel-zaj vszony sznt-függésének szmulácós vzsgálata: % mérő jel x=2*(rand(1,1000)-0.5); ns=40; xmax=logspace(-4,1,ns); % a bemenet jelszntek erteke bts=[4:2:16]; ddb=100; %nput dnamkatartomany db-ben for j=1:length(bts), for =1:ns, xs=xmax()*x; ys=kvant_le(xs,bts(j),d,ddb); snr(j,)=snrdb(xs,ys,0); end; %for end; %j % a bemenet jelszntek szama fgure(6); semlogx(xmax,max(snr,zeros(sze(snr))),'-'); grd; ylabel('snr(db)'); xlabel('nput level'); for j=1:length(bts), text(szgma(27)*szgma(27),snr(j,27),[num2str(bts(j)),' bt']); end;
27/40
28/40 5. Gyakorlat: Dfferencáls kódolók vzsgálata A MATLAB segítségével végezzük el az alább három hullámforma kódoló-dekódoló (jeldgtalzáló és rekonstruáló) rendszer összehasonlító elemzését. Az első rendszer pusztán egy llesztett kvantáló (a kvantáló dnamka tartománya a kvantálandó jel szórásának a háromszorosa): KÓDOLÓ 1 jel generálás x kvantáló y1 mnősítés: SNR1 A másodk esetben a jel és a predkáltja különbségeként előálló dfferencáls jelet kvantáljuk: KÓDOLÓ 2 jel generálás x predktor d2 - kvantáló d2q predktor y2 mnősítés: SNR2 A harmadk esetben a dfferencáls-predktív kódoló körbe hurkolja a kvantálót: KÓDOLÓ 3 jel generálás x xk d3 - kvantáló predktor w d3q predktor y3 mnősítés: SNR3 Vzsgáló jelként állítsuk elő két sznusz és fehé zaj összegét. A kezdet vzsgálódásanknál zaj mentes esettel foglalkozunk:
29/40 pelda5.m clear; %jeleloalltas fc=8000; dt=1/fc; xn=400; nt=[0:xn]; tt=nt*dt; f1=447; f2=1017; a1=1; a2=1; az=0.0; x=a1*sn(2*p*f1*tt)+a2*sn(2*p*f2*tt)+az*randn(sze(tt)); fgure(1); [ft,sx]=t2f(fc,nt,x,0,fc/2); subplot(211); plot(ft,abs(sx),'-'); xlabel('frekvenca'); ylabel('abs'); subplot(212); semlogy(ft,abs(sx),'-'); xlabel('frekvenca'); ylabel('log abs'); A vzsgáló jel spektruma:
30/40 Az első kódoló vzsgálatához használjuk fel a korábban készített kvant_e.m és snrdb.m eszközenket. pelda5.m (folytatás) % KÓDOLÓ 1 qbt=8; qd=3*std(x); y1=kvant_e(x,qbt,-qd, qd); % mnostes snr1=snrdb(x,y1,0); fgure(2); subplot(211); plot(nt,x,'-',nt,y1,'-'); xlabel('a bemenet es kmenet jelek: x, y1'); subplot(212); plot(nt,y1-x,'-'); xlabel('a hbajel: y1-x'); A kapott jelalakok: és a kapott jel-zaj vszony: SNR1 = 43.29 db.
31/40 A másodk rendszerben a dfferencáls jel előállításához szükséges (negyed fokúnak választott) predktort (a jelet a korább mntából optmálsan megbecslő szűrőt) a MATLAB lpc függvényével határozzuk meg a kódolandó x jelből. Egyúttal krajzoltatjuk az így kapott kódoló P-Z ábráját s. pelda5.m (folytatás) % KODOLO 2 npred=4; pn=real(lpc(x,npred)); fgure(3); subplot(111); pzabra(pn,1); xlabel('lpc kodolo transzferfuggvenye'); % 4-ed foku predktor tervezes Fgyeljuk meg, hogy a kódoló zérusa közel vannak a predkálandó jelben lévő sznuszok frekvencájához.» (447/8000)*360 = 20.1150 fok és» (1017/8000)*360 = 45.7650 fok
32/40 A másodk kódoló analízse: pelda5.m (folytatás) d2=flter(pn,[1],x); %dfferenca kepzes qd=3*std(d2); % az llesztett kvantalo dnamtartomanya d2q=kvant_e(d2,qbt,-qd,qd); %kvantalas y2=flter([1],pn,d2q); %dfferencals jelbol vsszalltas %mnostes ndex=[100:length(x)]; snr2=snrdb(x(ndex),y2(ndex),0); gp=10*log10((sum(x.*x)/length(x))/(sum(d2.*d2)/length(d2))); fgure(4); subplot(221); plot(nt,x,'-'); xlabel('a bemenet jel: x'); subplot(222); plot(nt,y2,'-'); xlabel('a kmenet jel: y2'); subplot(223); plot(nt,d2,'-'); xlabel('a dfferencals jel: d2'); subplot(224); plot(nt,y2-x,'-'); xlabel('a hbajel: y2-x'); A kapott jelalakok: A rendszert mnősítő SNR2 érték számításánál a tranzens mntákat fgyelmen kívül hagytuk. A kapott SNR2 = 43.44dB
33/40 érték lényegében ugyan anny, mnt az előző egyszerű esetben, pedg a dfferencáls kódolótól várható predkcós nyereség számított értéke (az eredet x jel és a kvantálandó d2 jel teljesítményenek hányadosa): Gp = 19.72 db, azaz ezzel az értékkel megnővelt SNR lenne elérhető. Természetesen ez az elv lehetőség csak akkor realzálható, ha a predktv hurok közrefogja a kvantálót. Ezen meggondolások szernt épül fel a harmadk kódoló. pelda5.m (folytatás) % KODOLO 3 w=zeros(1,npred); % predktor allapotvaltozonak ncalzalasa % rekurzv rendszer for 1=npred:length(x), xk=-pn(2:npred+1)*w(1:npred)'; % predkco d3(1)=x(1)-xk; % dfferenca kepzes d3q(1)=kvant_e(d3(1),qbt,-qd,qd); % kvantalas w=[d3q(1)+xk,w(1:(npred-1))]; % predktor allapot update end; y3=flter([1],pn,d3q); %dfferencals jelbol vsszalltas %mnostes ndex=[100:length(x)]; snr3=snrdb(x(ndex),y3(ndex),0); fgure(5); subplot(221); plot(nt,x,'-'); xlabel('a bemenet jel: x'); subplot(222); plot(nt,y3,'-'); xlabel('a kmenet jel: y3'); subplot(223); plot(nt,d3,'-'); xlabel('a dfferencals jel: d3'); subplot(224); plot(nt,y3-x,'-'); xlabel('a hbajel: y3-x'); Összegező adatok, hsztogrammok kírása: pelda5.m (folytatás) dsp(['snr1=',num2str(snr1),'db ','snr2=',num2str(snr2),'db ',... 'snr3=',num2str(snr3),'db ','Gp=',num2str(gp),'dB ' ]); fgure(6); subplot(221); [nn,hh]=hst(x); bar(hh,nn,'-');xlabel('x hsztogram'); subplot(223); [nn,hh]=hst(d2); bar(hh,nn,'-'); xlabel('d2 hsztogram'); subplot(224); [nn,hh]=hst(d3); bar(hh,nn,'-'); xlabel('d3 hsztogram'); A kapott eredmények és ábrák: SNR1=43.29dB SNR2=43.44dB SNR3=-14.78dB Gp=19.72dB
34/40
35/40 Mnt több jelből látható, valam nagy baj van, a rendszer "gerjed": SNR3=-14.78dB! értelmetlenség a dfferencáls- (d3) és a hbajel (y3-x) "felcseng", sokkal nagyobb mnt maga az eredet jel A helytelen működés oka, a kvantáló nagyjelű nemlneartásában (lmter karaktersztka) keresendő. Ennek bzonyítására, deglenesen módosítsuk a kvant_e.m függvényünket úgy, hogy a nagyjelű lmtálást "kkapcsoljuk", azza mnden bemenetre csak kerekítést végez a kvantáló: kvant_e.m (deglenesen módosítva) functon y = kvant_e(x,r,xmn,xmax); % y = kvant_e(x,r,xmn,xmax); % Egyenletes kvantalo % x: bemenet mntak % r: r btes kvantalas % xmn-xmax: felett egyenletes kvantalo, hba < q/2 % y: kvantalt kmenet mntak l = 2^r; % dontes ntervallumok, szntek szama q = (xmax-xmn)/l; % a kvantalas lepcso % nagy jelu mukodes %%%% y = mn(x,(xmax-q/2)*ones(sze(x))); % ks jelu mukodes %%%% y = max(y,(xmn+q/2)*ones(sze(y))); % kerektes y = xmn+q/2+q*round((y-(xmn+q/2))/q); Ezek után újrafuttatva a pelda5.m programot, az alábbak szernt eredményeket kapjuk: SNR1=43.29dB SNR2=43.51dB SNR3=62.87dB Gp=19.72dB Most már SNR3 értelmes (a Gp predkcós nyereséggel megnövelt) értéket ért el. A kapott ábrák:
36/40 Tehát, am a jeleket llet, most már mnden az elvárások szernt alakult. Ez a ksérlet, természetesen nem megoldása a predkcós kódoló müködésének, csupán azt bzonyítottuk, hogy a fxen a d2 dfferencáls jelhez (,mely a fnom kvantálástól eltekntve ugyan az, mnt a d3 dfferencáls jel és staconer esetben gen ks jel) llesztett ks dnamka tartományú kvantáló a bekapcsoláskor (és a tranzens elején) olyan nagy túlvezérlést kap, hogy az ekkor keletkező jelekre a nemlnárs, vsszacsatolt rendszer nagyjelű, határcklusos gerjedést produkál. A valód megoldás skálázófaktor-adaptv kvantáló alkalmazása a vsszacsatolt hurkon belül. Ennek az elgondolásnak a MATLAB-bel mplementácóját a korább pelda5.m program megfelelő helyének az alább módosításával készíthetjük el:
37/40 pelda5.m (kegészítve adaptív kvantálóval) % KODOLO 3. w=zeros(1,npred); powd3=1; alfa=2^(-5); % adaptalas ncalzalasa % rekurzv rendszer for 1=npred:length(x), xk=-pn(2:npred+1)*w(1:npred)'; % predkco d3(1)=x(1)-xk; % dfferenca kepzes % Adaptv kvantalo powd3=(1-alfa)*powd3 + alfa*d3(1)*d3(1); qd=3*sqrt(powd3); d3q(1)=kvant_e(d3(1),qbt,-qd, qd); % kvantalas w=[d3q(1)+xk,w(1:(npred-1))]; % predktor allapot update end; y3=flter([1],pn,d3q); %dfferencals jelbol vsszalltas A ksérlet újra futtatásánál ne felejtsük el kvant_e.m eredet működését vsszaállítan! A kapott eredmények: SNR1=43.29dB SNR2=43.51dB SNR3=63.4dB Gp=19.72dB Az edg vzsgálatoknál a kódólandó jelnek csak keskenysávú (sznuszos) összetevő voltak.
38/40 Az alábbak szernt módosítva pelda5.m flet futtassuk újra a MATLAB programunkat. pelda5.m (adat módsításs) %a1=1; a2=1; az=0.0; a1=1; a2=1; az=0.2; A keskeny és szélessávú (feher zaj) összetevőt s tartalmazó bemenő jel spektruma: A következő oldalon a KODOLÓ 1. kmenő jelét és hba jelét látjuk.
39/40 A dfferencáls kódolók predktoranak zérusa a zaj öszetevő megjelenésének hatására az ábrán látható módon változtak. A KÓDOLÓ3 jele:
40/40 Hsztogrammok: Végezetül a jel/zaj értékek: SNR1=43.32dB SNR2=42.4dB SNR3=50.92dB Gp=7.374dB