Przetworniki analogowo-cyfrowe i cyfrowo-analogowe
Autorzy: Wojciech Półchłopek, Roman Rumian
Pliki: rozdzial_09.zip
Przykład 9.1
Przykład (plik przyklad_9_1.m) kwantyzacji sygnału sinusoidalnego przez obcięcie i zaokrąglenie (próg odpowiednio na granicy i w środku przedziału Q).% Przykład 9.1:
% m-plik: przyklad_9_1.m
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 9: Przetworniki analogowo-cyfrowe i cyfrowo-analogowe.
% Autorzy rozdziału: Wojciech Półchłopek, Roman Rumian.
%
% Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl
%
% Opracowanie przykładu: marzec 2014 r.
clc; clear; close all;
b=3; q=2^(-(b-1)); % b - liczba bitów przetwornika A/C, q - krok kwantyzacji;
N=2^8; fo=440; % dlugość ciągu x[n] oraz założona częstotliwość sygnału w Hz;
fpr=11025; % częstotliwość próbkowania w Hz;
Fo=fo/fpr; n=0:N-1; % częstotliowość unormowana i numery próbek;
x=cos(2*pi*Fo*n); % tworzymy ciąg próbek o założonych parametrach;
x1=x;
x1(x+eps>1-q)=1-q; % korekta ze względu na asymetrię zakresów dla wartości dodatnich i ujemnych;
xqr=floor((x1/q)+0.5)*q; % kwantyzacja z zaokrąglaniem (r=rounding);
xqt=floor(x1/q)*q; % kwantyzacja z obcięciem (t=truncation);
eqr=xqr-x; % błąd kwantyzacji z zaokrągleniem;
eqt=xqt-x; % błąd kwantyzacji z obcięciem;
w=hamming(N)';
X=fft(x.*w)/(N/2); AX_dB=20*log10(abs(X)+eps); % widmo amplitudowe DFT, w dB;
X1=fft(xqt.*w)/(N/2); AX1_dB=20*log10(abs(X1)+eps); % widmo amplitudowe DFT, w dB;
X2=fft(xqr.*w)/(N/2); AX2_dB=20*log10(abs(X2)+eps); % widmo amplitudowe DFT, w dB;
% test funkcji przejścia dla obu sposobów kwantyzacji:
x_test=-1:0.0001:1;
x1_test=x_test;
x1_test(x_test+eps>1-q)=1-q; % korekta ze względu na asymetrię zakresów dla wartości dodatnich i ujemnych;
xqr_test=floor((x1_test/q)+0.5)*q; eqr_test=xqr_test-x_test;
xqt_test=floor((x1_test/q))*q; eqt_test=xqt_test-x_test;
F=(0:(N-1))/(N); % opis osi dla wykresów widm w częstotliwości unormowanej [Hz/Hz];
figure(1);
subplot(2,1,1);
plot(x_test,x_test,'k.-'); grid on; hold on;
plot(x_test,xqr_test,'ro-','markersize',5,'markerface','r');
plot(x_test,xqt_test,'b.-');
title('Porównanie funkcji przejscia dla dwóch metod kwantyzacji');
legend('bez zmian','kwantyzacja z zaokraglaniem','kwantyzacja z obcieciem',4);
subplot(2,1,2);
plot(x_test,eqr_test,'ro-','markersize',5,'markerface','r'); grid on; hold on;
plot(x_test,eqt_test,'b.-');
title('Porównanie bledu kwantyzacji');
legend('z zaokraglaniem','z obcieciem',1);
figure(2); n=0:64; ms=5;
plot(n, x(n+1),'bo-','markersize',ms); grid on; hold on;
plot(n, xqr(n+1),'rs-','markersize',ms);
plot(n, eqr(n+1),'kv-','markersize',ms);
title('Kwantyzacja z zaokraglaniem');
xlabel('n'); ylabel('x[n], x_q[n], e_q[n]');
legend('sygnal x[n]','sygnal skwantowany','wartosci bledu kwantyzacji',0);
xlim([0,max(n)]);
figure(3);
plot(n, x(n+1),'bo-','markersize',ms); grid on; hold on;
plot(n, xqt(n+1),'rs-','markersize',ms);
plot(n, eqt(n+1),'kv-','markersize',ms);
title('Kwantyzacja z obcieciem');
xlabel('n'); ylabel('x[n], x_q[n], e_q[n]');
legend('sygnal x[n]','sygnal skwantowany','wartosci bledu kwantyzacji',0);
xlim([0,max(n)]);
figure(4);
plot(F,AX_dB,'bo-','markersize',4); grid on; hold on;
plot(F,AX1_dB,'ro-','markersize',5);
plot(F,AX2_dB,'ks-','markersize',2);
title('Porównanie widm amplitudowych DFT');
xlabel('F [Hz/Hz]'); ylabel('Amplituda [dB]');
legend('dla sygnalu x[n]','po kwantyzacji z zaokragleniem','po kwantyzacji z obcieciem',1);
axis([0,0.5,-80,0]);
% KONIEC PRZYKŁADU 9.1.
Przykład 9.2
Przykład (plik przyklad_9_2.m) kształtowania szumu kwantyzacji modulatorami Σ-Δ I, II, i III rzędu.% Przykład 9.2:
% m-plik: przyklad_9_2.m
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 9: Przetworniki analogowo-cyfrowe i cyfrowo-analogowe.
% Autorzy rozdziału: Wojciech Półchłopek, Roman Rumian.
%
% Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl
%
% Opracowanie przykładu: marzec 2014 r.
clc; clear; close all;
b=12; q=2^(-(b-1)); % liczba bitów przetwornika A/C i krok kwantyzacji;
N=2^12; % długość ciągu modelującego szum kwantyzacji;
xn=(rand(N,1)-0.5)*q; % generowanie "szumu kwantyzacji";
h= [1, -1]; % odpowiedź impulsowa modulatora sigma delta w modelu z czasem-dyskretnym (filtr FIR);
y1=filter(h,1,xn); % modulator I rzędu;
y2=filter(h,1,y1); % modulator II rzędu;
y3=filter(h,1,y2); % modulator III rzędu;
y4=filter(h,1,y2); % modulator IV rzędu;
% wyznaczamy charakterystyki częstotliwościowe (DFT) szumu wejściowego oraz na wyjściach modulatorów:
fpr=4e6; f=0:fpr/N:fpr/N*(N-1);
Xn=fft(xn); AXn_dB=20*log10(abs(Xn)+eps);
Y1=fft(y1); AY1_dB=20*log10(abs(Y1)+eps);
Y2=fft(y2); AY2_dB=20*log10(abs(Y2)+eps);
Y3=fft(y3); AY3_dB=20*log10(abs(Y3)+eps);
% Wykresy charakterystyk amplitudowych szumów na wyjściach modulatorów:
figure(1); axis_v=[0,fpr/2/1e6,-100,-20];
subplot(4,1,1); plot(f/1e6,AXn_dB,'b'); grid on;
title('DFT szumu kwantyzacji'); ylabel('Amplituda(dB)'); xlabel('f[MHz]');
axis(axis_v);
subplot(4,1,2); plot(f/1e6,AY1_dB,'b'); grid on;
ylabel('Amplituda(dB)'); xlabel('f[MHz]');
legend('DFT szumu po modulatorze S-D I rz.',4);
axis(axis_v);
subplot(4,1,3); plot(f/1e6,AY2_dB,'b'); grid on;
ylabel('Amplituda(dB)'); xlabel('f[MHz]');
legend('DFT szumu po modulatorze S-D II rz.',4);
axis(axis_v);
subplot(4,1,4); plot(f/1e6,AY3_dB,'b'); grid on;
ylabel('Amplituda(dB)'); xlabel('f[MHz]');
legend('DFT szumu po modulatorze S-D III rz.',4);
axis(axis_v);
% KONIEC PRZYKŁADU 9.2.
Przykład 9.3
Przykład (plik przyklad_9_3.m) zastosowania szumu dither o histogramie trójkątnym i prostokątnym do redukcji szumów kwantyzacji.% Przykład 9.3:
% m-plik: przyklad_9_3.m
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 9: Przetworniki analogowo-cyfrowe i cyfrowo-analogowe.
% Autorzy rozdziału: Wojciech Półchłopek, Roman Rumian.
%
% Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl
%
% Opracowanie przykładu: marzec 2014 r./WP/RR.
clc; clear; close all;
w=16; % Długość słowa w bitach (word length);
q=2^(1-w); % Krok kwantyzacji
N=1024; % Liczba próbek;
n=0:N-1; % numery próbek;
k=2^6; % numer elementu DFT (bez przecieku);
Fo=k/N; % Unormowana częstotliwość;
A=2^(-18); % Amplituda sygnału (wersja 1);
%A=Q; % Amplituda sygnału (wersja 2) - należy przenieść znak komentarza powyżej;
x=A*sin(2*pi*n*Fo); % Sygnał dyskretny;
% Rectangular dither - "dither" prostokątny:
r=rand(1,N);
r=r-mean(r);
r=r./max(abs(r)); % Normalizacja;
d_rect=r*q/2;
%Triangular Dither - "dither" trójkątny:
r1=rand(1,N);
r1=r1-mean(r1);
r1=r1./max(abs(r1));
d_tri=(r+r1)*q/4; % amplituda szumu dither;
xqt=floor(x/q)*q; % Kwantyzacja z obcięciem
et=x-xqt;
xqdt=floor((x+d_tri)/Q+0.5)*Q; % Dither trójkątny
win=blackman(N)'; % Okno (wersja 1);
% win=hann(N)'; % Okno (wersja 2) - należy przenieść znak komentarza powyżej;
win=N*win/sum(win); % Skalowanie okna;
Xt=abs(fft(xqt.*win))/(N/2);
X2=abs(fft(xqdt.*win))/(N/2);
thres_dB=-140;
thres=10^(thres_dB/20);
F=(0:(N-1))/(N);
X2_dB=-140*ones(size(X2));
idx2=find(X2>thres);
X2_dB(idx2)=20*log10(X2(idx2)+eps);
X2_dB=20*log10(X2./0.5+eps);
Xt_dB=-140*ones(size(Xt));
idx4=find(Xt>thres);
Xt_dB(idx4)=20*log10(Xt(idx4)+eps);
Xt_dB=20*log10(Xt./0.5+eps);
figure(1)
subplot(211)
plot(xqt(1:100),'r');title('a)Kwantyzacja z obcięciem');hold on;
stem(x(1:100));hold off
xlabel('n \rightarrow');
ylabel(' x_q_t \rightarrow')
subplot(212)
plot(F,Xt_dB); title('b)Spektrogram dla obcinania');
axis([0 0.5 -140 -80]);
grid on, xlabel('f/fp \rightarrow');
ylabel(' PDF{Q}(e^{j\Omega}) [dB] \rightarrow')
figure(2)
subplot(211)
plot(xqdt(1:100)); title('a)Dither trójkatny')
xlabel('n \rightarrow');
ylabel(' x_q_d_t \rightarrow')
subplot(212)
plot(F,X2_dB); title('b)Spektrogam dla trójkatnego dither`ingu');
axis([0 0.5 -140 -80]);
grid on, xlabel('f/fp \rightarrow');
ylabel(' PDF{Q}(e^{j\Omega}) [dB] \rightarrow')
%
SNR_t=10*log10(sum(x.^2)/sum(et.^2));
% Spektra z ditheringiem
figure(3)
Xdt=abs(fft(d_tri.*win))/(N/2);
Xdt_dB=-140*ones(size(Xdt));
idx7=find(Xdt>thres);
Xdt_dB(idx7)=20*log10(Xdt(idx7));
Xdt_dB=20*log10(Xdt./0.5);
subplot(211)
[n_tri,x_tri]=hist(d_tri,20);
bar(x_tri/Q,n_tri/sum(n_tri))
title('Histogram trójkątnego szumu dither');
subplot(212)
plot(F,Xdt_dB); title('Spektrum trójkątnego szumu dither');
axis([0 0.5 -140 -80]);
grid on, xlabel('f/fp \rightarrow');
ylabel(' PDF{Q}(e^{j\Omega}) [dB] \rightarrow')
% KONIEC PRZYKŁADU 9.3.