Sygnały losowe i szumy

Autorzy: Przemysław Korohoda, Adam Borowicz, Krzysztof Duda

Pliki: rozdzial_03.zip

Przykład 3.1

Przykład (plik przyklad_3_1.m) zawiera kompletny plik skryptowy pokazujący jak samodzielnie eksperymentować z danymi pseudolosowymi na przykładzie rozkładu normalnego, a szczególnie jak przygotować obliczenia, aby następnie graficznie: a) porównać histogram z rozkładem teoretycznym, b) zweryfikować obciążenia estymatora odchylenia standardowego, c) zbadać rozkłady losowe estymatorów – wartości średniej i odchylenia standardowego.
% Przykład 3.1:
% m-plik: przyklad_3_1.m
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 3. Sygnały losowe i szumy. 
% Autorzy rozdziału: Przemysław Korohoda, Adam Borowicz, Krzysztof Duda.
%
% Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl
%
% Opracowanie przykładu: kwiecień 2013 r./PK.

clc; clear; close all;                      % posprzątanie "biurka";

N=2^10;     K=2^14;                         % N-dlugość ciągu; K-liczba realizacji;
mu=3;       sigma=4;                        % założone, czyli dokładne, parametry rozkładu;

X=randn(K,N)*sigma+mu;                      % generowanie kompletu danych (ciągi ergodyczne);
mx=mean(X);   sx1=std(X);   sx2=std(X,1);   % szacowanie parametrów dla kolejnych "n";

[hx,bx]=hist(X(:),100);     dx=bx(2)-bx(1); % wyliczanie histogramu i szerokości jednego "słupka";
[hmx,bmx]=hist(mx,100);                     % wyliczanie histogramu dla mx;
[hsx,bsx]=hist(sx1,100);                    % wyliczanie histogramu dla sx1 (estymator nieobciążony);

msx1=mean(sx1),  msx2=mean(sx2),            % wartości średnie dla rozkładów sx1 i sx2;
smx=std(mx),     smx_ref=sigma/sqrt(K),     % porównanie odchylenia standardowego dla mx z teorią;

    figure(1);                              % przykład "surowego" opracowania graficznego:
        subplot(311); bar(bx,hx/(sum(hx)*dx),1);         grid on; hold on;
                      plot(bx,normpdf(bx,mu,sigma),'r-');
                        legend('rozklad teoretyczny','skalowany histogram');
        subplot(312); bar(bmx,hmx,1);                    grid on;
                        legend('histogram wartosci sredniej');        
        subplot(313); bar(bsx,hsx,1);                    grid on;
                        legend('histogram odchyl. stand.');        
        
% KONIEC PRZYKŁADU 3.1.

Przykład 3.2

Przykład (plik przyklad_3_2.m) zawiera kompletny plik skryptowy pokazujący jak samodzielnie eksperymentować z funkcją autokorelacji. Dane są generowane – zgodnie wybraną wersją – na 3 sposoby, a następnie przetwarzane zbiorowo. Na trójwymiarowych wykresach można zaobserwować: a) jakie są kształty i zmienność rozkładów, pokazanych w postaci histogramów, w kolejnych chwilach n, b) jakie są kształty i zmienność funkcji autokorelacji wyznaczanej dla kolejnych realizacji procesu, c) można porównać efekt zastosowania korelacji bez korekty obciążenia i z korektą (przesuwając znak komentarza na początku odpowiedniej linii do linii powyżej). Przykład zawiera możliwość wyboru jednego z trzech sposobów generowania danych pseudolosowych: 1) ergodyczny gaussowski proces losowy o zadanych parametrach, 2) proces dający realizacje kosinusoidalne o pseudolosowej fazie początkowej, 3) gaussowski proces losowy o skorelowanych wzajemnie kolejnych wartościach x[n].
% Przykład 3.2:
% m-plik: przyklad_3_2.m
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 3. Sygnały losowe i szumy. 
% Autorzy rozdziału: Przemysław Korohoda, Adam Borowicz, Krzysztof Duda.
%
% Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl
%
% Opracowanie przykładu: kwiecień 2013 r./PK.

clc; clear; close all;  % Patrz Przykład 3.1;

N=2^8;      K=2^10;     % Patrz Przykład 3.1;
wersja=1;               % wybór sposobu generowania danych (1,2 lub 3);
switch wersja,
    case 1, mu=3;   sigma=4;     X=randn(K,N)*sigma+mu;
    case 2, X=cos(ones(K,1)*2*pi*4*(0:N-1)/N + rand(K,1)*ones(1,N)*2*pi);
    case 3, mu=3;   sigma=4;     X=randn(K,N)*sigma+mu;
            M=5;    h=rand(1,M); X=filter(h,1,X);
end;

[H,b]=hist(X,100);      % wyznaczone zbiorczo histogramy (dla kolejnych realizacji);

opcja=1;                % wybór sposobu wyliczania;
switch opcja,
    case 1, for k=1:K, CX(k,:)=xcorr(X(k,:),X(k,:)); end;     % wyliczamy rxx bez korekty;
    case 2, m=-(N-1):N-1;                                     % wariant z korektą;
            for k=1:K, CX(k,:)=xcorr(X(k,:),X(k,:))./(N-abs(m)); end; 
end;

    figure(1); 
            mesh(0:N-1,b,H);  title('wykres 3D z histogramami dla kolejnych realizacji procesu');
                axis tight;   xlabel('numer realizacji');  ylabel('x');
    figure(2); 
            mesh(CX);         title('wykres r_x_x dla kolejnych realizacji procesu');
                axis tight;   xlabel('m');                 ylabel('numer realizacji');
                
% KONIEC PRZYKŁADU 3.2.

Przykład 3.3

W przykładzie (plik przyklad_3_3.m) pokazano jak (identyfikację odpowiednich elementów programu należy potraktować jako formę zadania): a) zweryfikować podobieństwa między splotem i funkcją korelacji, b) wyliczyć charakterystyki częstotliwościowe sygnału na rożne opisane dotąd sposoby. W tym przykładzie porównawcze studium otrzymanych wyników, w tym w formie graficznej, pozostawiono do samodzielnej realizacji. Należy zwrócić uwagę, że drugi wariant generowania danych dotyczy ciągów zespolonych.
% Przykład 3.3:
% m-plik: przyklad_3_3.m
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 3. Sygnały losowe i szumy. 
% Autorzy rozdziału: Przemysław Korohoda, Adam Borowicz, Krzysztof Duda.
%
% Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl
%
% Opracowanie przykładu: kwiecień 2013 r./PK.

clc; clear; close all; 

K=2^10;
N=2^14;         % Patrz przykład 3.1
F=(0:N-1)/N;    % przygotowanie osi unormowanej częstotliwości;

wersja=1;       % wybór wersji danych (wybór procesu losowego x);
switch wersja,
    case 1,   mu=0;     sigma=4;    x=randn(1,N)*sigma+mu;   k=1:N/2+1;   a=1;
    case 2,   muR=0;    sigmaR=1;   muI=0;   sigmaI=1;
              x=randn(1,N)*sigmaR+muR + j*(randn(1,N)*sigmaI+muI); % proces zespolony!!! Widmo nie będzie miało charakterystycznych symetrii;
              k=1:N;  a=1;
end;

y=rand(1,N);    % realizacja procesu y;
c1=xcorr(y,x); c2=conv(y,conj(x(end:-1:1))); % wyznaczamy funkcję korelacji dwiema metodami;
disp('Roznica po wyznaczeniu funkcji korelacji dwiema metodami:');
err=max(abs(c1-c2)),                         % porównujemy wyniki;

X=fft(x);       % DFT ciągu x;

[P1,W1]=periodogram(x,hamming(N),K); F1=W1/(2*pi); % periodogram z (pojedynczym) oknem Hamminga;
[P2,W2]=pwelch(x,K);                 F2=W2/(2*pi); % periodogram wyznaczony metodą Welcha;

    figure(1);
            plot(F1,P1,'ro-'); grid on; hold on;  axis tight;
            plot(F2,P2,'b.-');
                xlabel('F');    ylabel('Widmowa gestosc mocy (PSD)');    legend('a) periodogram','b) pwelch');
                title('Dwa periodogramy - konfrontacja wyników zastosowania dwoch funkcji');

% KONIEC PRZYKŁADU 3.3.

Przykład 3.4

Przykład 3.4 (plik przyklad_3_4.m) przedstawia kompletny plik skryptowy zawierający implementację generatora szumu kolorowego w pakiecie MATLAB, wykorzystując dolnoprzepustowy filtr typu IIR. Program umożliwia porównanie charakterystyk filtra z otrzymanym widmem PSD, do czego są konieczne pewne przeliczenia - warto się zastanowić z czego te przeliczenia wynikają.
% Przykład 3.4:
% m-plik: przyklad_3_4.m
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 3. Sygnały losowe i szumy. 
% Autorzy rozdziału: Przemysław Korohoda, Adam Borowicz, Krzysztof Duda.
%
% Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl
%
% Opracowanie przykładu: kwiecień 2013 r./AB/PK.

clc; close all; clear;

N= 2^14;                    % dlugość przykładowej realizacji szumu;
fpr = 8000;                 % zakładamy częstotliwość próbkowania;
a = 0.9;                    % parametr filtra dolnoprzepustowego;
b1=[1-a]; a1=[1,-a];        % współczynniki filtra (patrz rozdział 4);

[H1,W1]=freqz(b1,a1,1000);  % chki-filtra (patrz rozdział 4)
f1=fpr*W1/(2*pi);

sigma = 3;                  % odchylenie standard. dla PDF szumu białego;
x=randn(1,N)*sigma;         % generujemy relizację procesu (szum biały);
y=filter(b1,a1,x);          % modyfikujemy pasmo szumu przez filtrację;

[P,W2]=pwelch(y,256);       % wyznaczamy periodogram;
f2=fpr*W2/(2*pi);

Pbis=P*pi/(sigma^2);        % przeliczenia (pytanie-zadanie: dlaczego tak?);

    figure(1);
        plot(f2,10*log10(Pbis),'r.-');          grid on;    hold on;
        plot(f1,20*log10(abs(H1)),'c.-'); 
                xlabel('f [Hz]');    ylabel('[dB]');
                title('Porownanie ch-ki amplitudowej filtra "kolorujacego" i PSD otrzymanego szumu');
                legend('PSD szumu kolorowego','ch-ka filtra (odpowiednio przeliczona)');
        
% KONIEC PRZYKŁADU 3.4.

Przykład 3.5

W przykładzie (plik przyklad_3_5.m) zawarto kompletny plik skryptowy weryfikujący zastosowania wzorów (3.45) i (3.46). Pod koniec zaproponowano sprawdzanie polegające na tym, że sygnał „wybielony blokami” został połączony w całość i podzielony na nowe bloki, tym razem na zakładkę – i ponownie wyliczono macierz kowariancji, aby ją porównać z zależnością (3.46).
% Przykład 3.5:
% m-plik: przyklad_3_5.m
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 3. Sygnały losowe i szumy. 
% Autorzy rozdziału: Przemysław Korohoda, Adam Borowicz, Krzysztof Duda.
%
% Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl
%
% Opracowanie przykładu: kwiecień 2013 r./PK.

clc;   clear;  close all;

N=2^10;   M=8;  K=N/M;                  % mamy zadbać, żeby się zgadzało (tj. K - liczba całkowita);

sigma=3;  mu=5; x=randn(1,N)*sigma+mu;  % generujemy szum;
x=filter([1,1,1]/3,1,x);                % kolorujemy szum;
X=reshape(x,M,K);                       % układamy bloki sygnału w macierzy X;
m1=mean(X')'; X1=X-m1*ones(1,K);        % odejmujemy średnie od współrzędnych;
Rx= X1*X1',                             % wyznaczamy macierz kowariancji;

Y=(Rx)^(-1/2)*X1;                       % wybielamy;
Ry=Y*Y' ,                               % sprawdzamy, czy wyszło;

y=Y(:)';                                % ... dokładniej sprawdzamy;
for m=1:M, Y1(m,:)=y(m:end-M+m); end;   % tworzymy bloki, ale na "zakładkę";
Ry_test=(1/M)*Y1*Y1',                   % ponowna weryfikacja;

% KONIEC PRZYKŁADU 3.5.