卷积编码
(n,k,m)的卷积编码器中,输出码组内的n个码元步进与该段内的k个信息位有关,海域前面m-1段内的信息位有关。
卷积编码的表达方法有很多种,如离散卷积法、生成矩阵法、码生成多项式法
如图(2,1,2)卷积编码器的结构图
(3,2,1)如下,输入每个clk下移动两位。
离散卷积法
若两路输出所对应的编码器的脉冲冲击响应为g1,g2,编码器用离散卷积表达式可以表示为
C
1
=
U
∗
g
1
C
2
=
U
∗
g
2
C
=
(
C
1
,
C
2
)
\begin{aligned} &C^{1}=U^{*} g^{1}\\ &C^{2}=U^{*} g^{2}\\ &C=\left(C^{1}, C^{2}\right) \end{aligned}
C1=U∗g1C2=U∗g2C=(C1,C2)
ps: 为什么叫做卷积码? 单位冲激响应与系统传递函数互为傅里叶变换关系
当输入的单位冲击为u=(1,0,0,0…)时,可以得出
g1=(1,0,1);g2=(1,1,1);即上图中的c1,c2.
有了单位冲激响应,将输入卷积单位冲激响应可得输出
那么由此也可得
生成矩阵表达形式
码多项式法
设
U
(
x
)
=
1
+
x
2
+
x
3
+
x
4
g
1
(
x
)
=
1
+
x
2
g
2
(
x
)
=
1
+
x
+
x
2
\begin{aligned} &U(x)=1+x^{2}+x^{3}+x^{4}\\ &g^{1}(x)=1+x^{2}\\ &g^{2}(x)=1+x+x^{2} \end{aligned}
U(x)=1+x2+x3+x4g1(x)=1+x2g2(x)=1+x+x2
则
卷积编码的matlab代码
代码
function [conv_out] = encoding_213(conv_in)
g1 = [1 0 1];
g2 = [1 1 1];
mem = zeros(1,2)
%详写卷积原理
for ii=1:length(conv_in)
inter_var = [conv_in(ii) mem];
first_out(ii)=mod(sum(g1.*inter_var),2);
second_out(ii)=mod(sum(g2.*inter_var),2);
mem = inter_var(1:end-1);
conv_out(ii*2-1:ii*2)=[first_out(ii) second_out(ii)];
end
conv_out = [conv_out 0 0 0 0]
end
编码结果就是卷积结果,卷积每一位结果都是三位输入和系统函数(翻转)相乘再相加。所以上述代码循环中,每次输入码就取三位进行乘加。
状态转移图
上图卷积编码器结构图寄存器中的值b1b2即为状态值。总共就4个状态00 01 10 11 。确定了当前状态,以及当前输入就能得到下一状态和当前输出。下图为状态转移图,图中虚线部分表示的是卷积编码器的输入是0,实线部分表示的是卷积编码器的输入是1。线上数字为当前输出c1c2.
译码—viterbi译码
某一时刻i,当前状态猜测可能情况为4种,对应下一状态也可能有四种。但是传输路径可能有8种。一般判决方式为对比真实接收序列和路径上的c1c2值。得到一条误差最小的路径,将该路径作为编码时状态转移值,进而得到发送信息。如下如,经过n时刻,那么路径数为
8
n
{8^n}
8n,序列越长,那么比较的路径数就呈指数式增长。
viterbi算法,接收一个信息计算一下路径度量值,将会减少对比的路径数。
比如说某一时刻i下,有前面所有时刻的累计路径度量值,
到达四个状态的累计路径度量值为d1,d2,d3,d4.
当前时刻的路径度量值为r1,r2,r3,r4.(比如说,r1为接收码字与00的距离,r2为接收码字与11的距离)。
那么下一状态的累计路径度量值将会有两个,比如到达state00的累计路径度量值有(d1+r1)和(d2+r2)两个,比较这两个值,舍弃较大值,保留较小值,该较小值即为下一状态的累计路径度量值。
关于较大值为什么可以舍弃。会不会某条包含该较大值的路径总体上看路径度量值较小呢?
答案是否定的。
因为对比的两条路径,与之前i-1个时刻的状态选择无关,与之后的状态选择也无关(虽然是累计值)
经维特比算法之后,最终比较的路径就四条。然后可以比较得一最小值作为最终状态转移路径,然后得到发送码字。
还可以发送比特最后添零,使得状态最后为00状态。那么最终路径就只有唯一确定得一条。