clear ,clc
%main 为程序的入口
%本程序仿真GMSK信号的解调过程
%程序先调用Generator产生一个调制信号
%调制信号的抽样值传入下面的函数进行解调
%调用GMSKDecoder进行解调
%转移表,前8条路径为定值,所以全部列出
TransferTable = [
0 +1 +1 pi/2 +1 -1 pi -1 +1 pi/2 +1 +1
0 +1 +1 pi/2 +1 -1 pi -1 +1 pi/2 +1 -1
0 +1 +1 pi/2 +1 -1 pi -1 -1 pi/2 -1 +1
0 +1 +1 pi/2 +1 -1 pi -1 -1 pi/2 -1 -1
0 +1 +1 pi/2 +1 +1 pi +1 +1 -pi/2 +1 +1
0 +1 +1 pi/2 +1 +1 pi +1 +1 -pi/2 +1 -1
0 +1 +1 pi/2 +1 +1 pi +1 -1 -pi/2 -1 +1
0 +1 +1 pi/2 +1 +1 pi +1 -1 -pi/2 -1 -1
];
theta_now = [0 +1 +1]; %指上一个码元产生后的theta
bit = [-1 -1 -1 1 1 ] %差分序列
hamming_head = zeros(8,3); %这里保存前8条路径的汉明距离
hamming_temp1 = [];
hamming_temp2 = [];
path = []; %路径
path_temp = [];
method = 'a'; %由于每次状态的转移集合可以分成两组,所以就可以分别在码元计算之间进行交替
for i = 1:length(bit)
if (i-1 > 2) %判断是否出了前8条路径,前8条路径只有3个点
disp('正在仿真8路径后的点:');
disp(i);
if (i-1 > 3) %每次要调整比较的路径
if (method == 'a')
method = 'b';
else
method = 'a';
end
end
else
disp('正在仿真的点数:');
disp(i);
end
[Sn, Cn, theta_now] = Generator(theta_now, bit(i), i-1);
[path_temp,hamming_temp1,hamming_temp2] = GMSKDecoder2(Sn, Cn, i-1, method);
if (i == 4)
%到第四个码元时,将路径度量调整为全不为0的矩阵
%因为此前存储的hamming_head矩阵为如下格式
% 6.7432 0.5892 -7.4709
%-3.4128 7.5723 4.3539
% 0 1.7402 -9.6432
% 0 0.4883 10.9556
% 0 0 3.1054
% 0 0 -4.5701
% 0 0 -5.7368
% 0 0 2.5033
hamming_head(5:8,1) = hamming_head(2,1);
hamming_head(1:4,1) = hamming_head(1,1);
hamming_head(7:8,2) = hamming_head(4,2);
hamming_head(5:6,2) = hamming_head(3,2);
hamming_head(3:4,2) = hamming_head(2,2);
hamming_head(1:2,2) = hamming_head(1,2);
%现在将其调整成下面的格式
%8.9284 0.2476 -9.6936
%8.9284 0.2476 7.3007
%8.9284 6.1644 -8.2771
%8.9284 6.1644 10.5269
%0.0722 0.9976 1.4014
%0.0722 0.9976 -3.4820
%0.0722 0.5668 -8.3241
%0.0722 0.5668 5.6449
for i = 1:8
hamming(i,1) = sum(hamming_head(i,:)); %将每一行的和赋值给hamming矩阵
end
%赋值后的hamming矩阵
%14.8394
%12.0642
%13.8251
%27.2332
% 4.3106
% 1.2857
%-0.2288
%-5.1446
end
%每一个码元计算完成后将路径度量值赋给hamming矩阵存储
if (i-1 > 3)
hamming = [hamming hamming_temp1];
end
hamming_head = hamming_head + hamming_temp2; %这是前三个码元计算时用到的路径度量值存储,之后的码元GMSKDecoder2函数返回的hamming_temp2都是8*3的全零矩阵,所以相加不改变hamming_head的值
path = [path path_temp]; %路径保存
end
% 开始解码
tempth = [];
realpath = [];
new_hamming = [];
new_hamming_temp = [];
%下面做的主要是根据path表把路径整理出来
for i = 1:8
tempth = path(i,1:6);
temp = path(i,4:6);
new_hamming_temp = hamming(i, 2);
for k = 1:length(path)/6 - 1
std = path(:,1 + k*6:6 + k*6);
for index = 1:8
if (temp == std(index,1:3))
tempth = [tempth std(index, 4:6)];
new_hamming_temp = [new_hamming_temp hamming(index, k + 2)];
temp = std(index, 4:6);
break;
end
index = index + 1;
end
end
realpath = [realpath ; tempth];
new_hamming = [new_hamming; new_hamming_temp];
end
realpath2 = [];
new_hamming2 = [];
%整理路径度量值,使之和path相对应
for i = 1:8
temph = TransferTable(i,10:12);
for k = 1:8
if temph == realpath(k,1:3)
realpath2 = [realpath2;realpath(k,:)];
new_hamming2 = [new_hamming2; new_hamming(k,:)];
break;
end
end
end
finalhamming = [hamming(:,1) hamming_head new_hamming2];
for i = 1:8
finalhamming(i,1) = sum(finalhamming(i,2:length(finalhamming(1,:)))); %最终的路径度量值表
end
[x y] = max(finalhamming(:,1));
path = [TransferTable(:,1:9) realpath2];
code = path(y,6:3:length(path)) %输出解码
disp('最佳路径号')
disp(y)
- 1
- 2
前往页