实验要求

image-20220421181429731

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
clc
clear all
N = 100000000; % 设置拓展次数
k = 10000000; % 设置循环次数,模拟产生码字
p = 0.25; % s1 -> 0, s2 -> 1, 设置产生码字1的概率
dxj = []; % 统计典型集中的1的数目的范围
bm = []; % 对典型集进行定长编码
dxjnum = 0; % 统计随机生成的k个码字中在典型集内的个数
fdxjnum = 0; % 统计随机生成的k个码字中在非典型集内的个数
zeronum = 0; % 统计序列中0的个数
onenum = 0; % 统计序列中1的个数
W = zeros(N^0.5,N^0.5); % 用来储存随机生成的N次扩展序列
Hs = p*log(1/p)/log(2) + (1-p)*log(1/(1-p))/log(2); % 计算信源熵
ipxil = (1-0.96)/0.96*Hs; % 根据编码效率决定典型集的范围

% 计算典型集中的1的数目的范围
for i = 0:1:N
LXNLG = (-1) * ((i-1)*log(p)+(N-i+1)*log(1-p)) / log(2) / N;
if ((LXNLG >= (Hs-ipxil)) && (LXNLG <= (Hs+ipxil)))
dxj = [dxj, i-1];
end
end

zuo = min(dxj); % 典型集中的最小值
you = max(dxj); % 典型集中的最大值

% 模拟随机产生k个长度为N的码字并对其是否在典型集中进行统计
for i = 1:1:k
temp = rand(N^0.5,N^0.5);
W (temp > p) = 0;
W (temp <= p) = 1;
sum(sum(W));
if ( sum(sum(W))>=zuo ) && ( sum(sum(W))<=you )
dxjnum = dxjnum + 1;
else
fdxjnum = fdxjnum + 1;
end
end

% 对典型集进行定长编码
for i = zuo:1:you
Lx = Lx + nchoosek(N,i); % 典型集中的序列数
end
L = ceil(log(Lx)/log(2)); % 码字长度
for i = zuo:1;you
bm = [bm, sprintf('%Ld',dec2bin(i-1))];
stemp = num2str(bm(i))
for j = 1:1:length(stemp)
if stemp(j) == '0'
zeronum = zeronum + nchoosek(N,i);
else
onenum = onenum + nchoosek(N,i);
end
end
end

% 统计码元出现的的概率
zerorate = zeronum / (zeronum + onenum)
onerate = onenum / (zeronum + onenum)

det = fdxjnum / k % 译码错误概率即为所有随机码字中不在典型集中的模拟码字比例
1 - det % 码元符号出现的概率即为所有随机码字中在典型集中的模拟码字比例