W poprzednim wpisie omówiłem w jaki sposób generować liczby pseudolosowe w MATLABie. Skoro już wiemy jak to robić, czas zająć się analizą sygnałów stochastycznych w celu określenia ich właściwości. Dzisiaj na warsztat bierzemy MATLAB histogram – często wyznaczaną charakterystykę statystyczną, która daje nam dużo cennych informacji o sygnale!
Z tego posta wiemy, że w przypadku sygnałów losowych nie da się ściśle określić ich wartości w danej chwili czasu. Można jedynie oszacować częstość lub prawdopodobieństwo wystąpienia określonej wartości. Stąd narzędzia używane do analizy sygnałów losowych są specyficzne i nieco odmienne od tych, których używamy w przypadku sygnałów zdeterminowanych, na przykład sinusoidalnych.
MATLAB Histogram - podstawowe użycie
Podstawową charakterystyką określającą tzw. rozkład wartości sygnału jest histogram. Ilustruje on ile razy dana wartość wystąpiła w obserwowanym sygnale, a ściśle rzecz biorąc ile razy wystąpiły wartości z określonego przedziału. Na przykład: histogram sygnału stałego w czasie zawierałby tylko jeden prążek, odpowiadający tej stałej wartości; histogram sygnału binarnego posiadałby dwa prążki o wartości 0 i 1, i tak dalej. To na ile przedziałów dzielimy zakres zmienności sygnału zależy od użytkownika, a liczba tych przedziałów jest podstawowym parametrem histogramu nBins.
Do wyznaczenia histogramu w MATLABie przez wiele edycji służyła funkcja hist, która została zastąpiona od 2014 roku przez funkcję MATLABhistogram. Jej podstawowa składnia jest następująca:
historam(X, nBins);
gdzie X – to analizowany sygnał, a nBins – to liczba przedziałów. Od liczby przedziałów zależy czytelność i „szczegółowość” rysowanego histogramu.
Przeanalizujcie poniższy program. W zależności od wyboru rodzaju rozkładu (zmienna typ) generowany jest sygnał losowy o rozkładzie normalnym lub Chi-kwadrat i jest rysowany jego histogram. Proces jest powtarzany w pętli, a rysunek odświeżany jest co sekundę. Za liczbę przedziałów odpowiada zmienna nBins.
clear all; close all; clc
%% Generacja sygnałów losowych
% Parametry próbkowania (niekonieczne przy sygnale losowym, ale dla porządku
% przyjmijmy 1kHz i czas obserwacji sygnału 5 sekund.)
fpr = 1000; dt = 1/fpr; % częstotliwość próbkowania
t0 = 5; xM = 450; % czas obserwacji sygnałów, alternatywnie t0 = 1 lub 0.1s.
N = t0/dt; % liczba próbek
t = (0:N-1)*dt; % wektor czasu
% typ = 1 - rozkład normalny, typ = 2 - rozkład Chi-kwadrat
typ = 1;
for h = 1 : 30
switch(typ)
case(1)
u = 1; s = 0.5; % u - wartość oczekiwana, s - odchylenie standardowe
x = s*randn(1,N) + u; % generujemy sygnał losowy o rozkładzie normalnym
xMin = -2; xMax = 4; yMax = 450; % ograniczenie osi (do rysunku)
nBins = 50;
case (2)
L = 4; % L - liczba stopni swobody
x = chi2rnd(L, 1, N); % generujemy sygnał losowy o rozkładzie chi-kwadrat
xMin = -1; xMax = 10; yMax = 400; % ograniczenie osi (do rysunku)
nBins = 100;
otherwise
return;
end
% Dla porządku obliczmy średnią i odchylenie standardowe
uX=mean(x);
sX=std(x);
% Rysunki
figure(1); subplot(211); plot(t,x);
grid on; xlabel('Czas [s]'); ylabel('Wartość sygnału'); title(['Sygnał stochastyczny']);
% Obliczanie histogramu (MATLAB histogram)
subplot(212); histogram (x, nBins); title(['Histogram, średnia=' num2str(uX) '; odch. std.=' num2str(sX) ';']);
xlabel('Wartość sygnału'); ylabel('Liczność'); grid on;
axis([xMin xMax 0 yMax]);
pause(1)
end
Rozkład normalny:

Rozkład Chi-kwadrat:

Co wynika z analizy rysunków? Najpierw wnioski ogólne:
- z histogramu możemy wnioskować jak często dana wartość występuje w sygnale, co jest podstawą określenia rodzaju rozkładu prawdopodobieństwa sygnału (o tym następnym razem) ,
- każda realizacja sygnału losowego ma inny kształt i inne wartości - sygnały w istocie są losowe,
- tym samym, kształt histogramu czyli częstości występowania poszczególnych wartości w sygnale, również się zmienia z realizacji na realizację (kolejno generowane sygnały), w sygnale o rozkładzie Chi-kwadrat nie występują liczby ujemne.
- kształty rozkładów wartości (histogramów) dla liczb normalnych i Chi-kwadrat różnią się, a w sygnale o rozkładzie Chi-kwadrat nie występują liczby ujemne,
- najczęściej występująca wartość dla rozkładu Normalnego to 1, a dla Chi-kwadrat to 2,
- w przypadku asymetrycznego rozkładu Chi-kwadrat wartość średnia (4) nie jest równa wartości najczęściej występującej (1).
Dużo cennych informacji!
Spróbujcie zmieniać czas obserwacji sygnału oraz liczbę przedziałów nBins i zaobserwujcie jak wpływa to na wynik obserwacji. Nie wdając się w analizę teoretyczną, zalecenia są takie, że przy analizę sygnałów losowych dąży się do obserwacji jak najdłuższego sygnału, a liczbę przedziałów nBins dobiera się tak, aby otrzymany obraz był czytelny.
Obiekt typu histogram
Wywołanie funkcji w następujący sposób:
h = historam(X, nBins);
powoduje utworzenie obiektu h typu histogram. Obiekt ten zawiera wszelkie informacje na temat obliczonego histogramu, które można łatwo odczytać za pomocą indeksowania z użyciem kropki, a ponadto daje to możliwości zmiany parametrów histogramu bez konieczności jego ponownego obliczania. Ilustruje to kolejny przykład:
clear all; close all; clc
%% Wczytanie danych i narysowanie histogramu
load carbig.mat % Wczytujemy plik z danymi samochodów wyprodukowanych
% w latach 1970 - 1982
x = Horsepower; % Interesuje nas histogram mocy pojazdów
nBins0=50; % Liczba przedziałów histogramu
h = histogram(x,nBins0) % h - obiekt typu histogram
xlabel('Moc silnika [KM]'); ylabel('Liczność'); grid on;
disp(['Histogram z liczbą przedziałów ' num2str(nBins0)])
pause
%% Analiza histogramu i zmiana jego parametrów
disp('Liczność w poszczególnych przedziałach')
hVal = h.Values % przez indeksowanie z kropką, mamy dostęp
% do poszczególnych wartości/parametrów
% histogramu. Values - to liczba zliczeń
% w poszczególnych przedziałach
disp('Liczba przedziałów:')
nBins = h.NumBins % NumBins to liczba przedziałów
pause
% Liczbę przedziałów możemy zmieniać, już po wywołaniu funkcji 'histogram':
disp('Zwiększamy liczbe przedziałów: ')
h.NumBins = nBins + 10;
h.NumBins
pause
nBins = morebins(h)
pause
nBins = morebins(h)
pause
% Zamiast zmieniać liczbę przedziałów, można dostosować ich szerokość:
disp('Zamiast tego można zmieniać szerokość przedziału odwołując się tak: h.BinWidth')
wBin = h.BinWidth % Obecna szerokość przedziału
h.BinWidth = 4 * wBin; % Nowa szerokość przedziału (4 x stara)
Posługiwanie się obiektem histogram daje wiele możliwości i jest bardzo wygodne. Zamiast obliczać kolejne histogramy w celu otrzymania żądanego wyniku, można łatwo dostosowywać histogram do swoich potrzeb. Obiekt tego rodzaju, przechowuje również wyniki liczbowe dzięki temu można łatwo „wyciągnąć” dane liczbowe, na przykład liczby zliczonych wartości w danych przedziałach h.Values bądź zobaczyć jakie są granice przedziałów h.Binedges.
Funkcja histogram kryje w sobie dużo więcej niż z pozoru się wydaje. Można jej używać do wyznaczania funkcji gęstości prawdopodobieństwa sygnałów oraz analizy porównawczej różnych realizacji procesów losowych. Ale o tym już następnym razem. Tymczasem sami eksperymentujcie z funkcją MATLAB histogram.

Mega interesujący wpis. Dziękujemy!