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.