對於一個二維信號,比如灰度圖像,灰度值的范圍是0-255,因此只要根據像素灰度值(0-255)出現的概率,就可以計算出信息熵。
但是,對於一個一維信號,比如說心電信號,數據值的范圍並不是確定的,不會是(0-255)這么確定,如果進行域值變換,使其轉換到一個整數范圍的話,就會丟失數據,請高手指點,怎么計算。
比如數字信號是x(n),n=1~N
(1)先用Hist函數對x(n)的賦值范圍進行分塊,比如賦值范圍在0~10的對應第
一塊,10~20的第二塊,以此類推。這之前需要對x(n)做一些歸一化處理
(2)統計每一塊的數據個數,並求出相應的概率
(3)用信息熵公式求解
以上求解方法獲得的雖然是近似的信息熵,但是一般認為,這么做是沒有問題的
求一維序列的信息熵的matlab程序代碼如下:(已寫成調用的函數形式)
測試程序:
fs=12000;
N=12000;
T=1/fs;
t=(0:N-1)*T;
ff=104;
sig=0.5*(1+sin(2*pi*ff*t)).*sin(2*pi*3000*t)+rand(1,length(t));
Hx=yyshang(sig,10)
%———————求一維離散序列信息熵matlab代碼
function Hx=yyshang(y,duan)
%不以原信號為參考的時間域的信號熵
%輸入:maxf:原信號的能量譜中能量最大的點
%y:待求信息熵的序列
%duan:待求信息熵的序列要被分塊的塊數
%Hx:y的信息熵
%duan=10;%將序列按duan數等分,如果duan=10,就將序列分為10等份
x_min=min(y);
x_max=max(y);
maxf(1)=abs(x_max-x_min);
maxf(2)=x_min;
duan_t=1.0/duan;
jiange=maxf(1)*duan_t;
% for i=1:10
% pnum(i)=length(find((y_p>=(i-1)*jiange)&(y_p<i*jiange)));
% end
pnum(1)=length(find(y<maxf(2)+jiange));
for i=2:duan-1
pnum(i)=length(find((y>=maxf(2)+(i-1)*jiange)&(y<maxf(2)+i*jiange)));
end
pnum(duan)=length(find(y>=maxf(2)+(duan-1)*jiange));
%sum(pnum)
ppnum=pnum/sum(pnum);%每段出現的概率
%sum(ppnum)
Hx=0;
for i=1:duan
if ppnum(i)==0
Hi=0;
else
Hi=-ppnum(i)*log2(ppnum(i));
end
Hx=Hx+Hi;
end
end
%----------------
擴展閱讀:
實驗一:計算離散信源的熵
一、實驗設備:
1、計算機
2、軟件:Matlab
二、實驗目的:
1、熟悉離散信源的特點;
2、學習仿真離散信源的方法
3、學習離散信源平均信息量的計算方法
4、熟悉 Matlab 編程;
三、實驗內容:
1、寫出計算自信息量的Matlab 程序
2、寫出計算離散信源平均信息量的Matlab 程序。
3、掌握二元離散信源的最大信息量與概率的關系。
4、將程序在計算機上仿真實現,驗證程序的正確性並完成習題。
四、實驗報告要求
簡要總結離散信源的特點及離散信源平均信息量的計算,寫出習題的MATLAB實現語句。
信息論基礎:
自信息的計算公式
Matlab實現:I=log2(1/p) 或I=-log2(p)
熵(平均自信息)的計算公式
Matlab實現:HX=sum(-x.*log2(x));或者h=h-x(i)*log2(x(i));
習題:
1. 甲地天氣預報構成的信源空間為:
乙地信源空間為:
求此兩個信源的熵。求各種天氣的自信息量。
案:
運行程序:
p1=[1/2,1/4,1/8,1/8];%p1代表甲信源對應的概率
p2=[7/8,1/8];%p2代表乙信源對應的概率
H1=0.0;
H2=0.0;
I=[];
J=[];
for i=1:4
H1=H1+p1(i)*log2(1/p1(i));
I(i)=log2(1/p1(i));
end
disp('自信息量分別為:');
I
disp('H1信源熵為:');
H1
for j=1:2
H2=H2+p2(j)*log2(1/p2(j));
J(j)=log2(1/p2(j));
end
disp('自信息量分別為:');
J
disp('H2信源熵為:');
H2