11汉明码编解码实验
加错位置 从 0 位置加错 从 1 位置加错 从 2 位置加错 从 3 位置加错 ……. 从 15 位置加错
加错位置 加 0 位错 加 1 位错 加 2 位错 加 3 位错
从 SW103-6,SW103-5,SW103-4,SW103-3 指示的位置开始,每帧加错的位数有 SW103-2,SW103-1 的状 态决定。 5、编码输出设置 D116,D115,D114,D113,D112,D111,D110,D109,D108,D107,D106,D105,D104,D103, D102,D101 为 16 位编码输出位。TP102 和 TP103 分别可以测量编码输出的帧和对应该帧的时钟信号。 6、解码方式选择 SW201-3,SW201-2,SW201-1 000 001 010 解码方式 汉明码解码 CRC 解码 BCH 码解码
semilogy(-2:5,biterr,'*'); hold on; semilogy(-2:5,biterr); xlabel('SNR(dB)'); ylabel('BER'); grid on; 3、仿真结果 (1)编解码波形
(2)白高斯噪声信道误码率仿真结果
五、实验中的汉明码编解码程序
1、汉明编码
010 011 100 101 110 111 3、信道选择(选择加错位置) SW103-6,SW103-5,SW103-4,SW103-3 0000 0001 0010 0011 …… 1111 4、加错数目选择 SW103-2,SW103-1 00 01 10 11
BCH 码编码 卷积码编码 Turbo 码编码 扩展用 扩展用 汉明码交织编码
AWGN Channel的参数SNR设置为SNR; Bernoulli Binary Generator的参数Sample Time设置为SampleTime。 2、仿真程序 clear all; SampleTime=1; SNR=1; sim('hammingsim'); figure(1); subplot(2,2,1); stem(hammingin); title('编码输入序列'); subplot(2,2,2); stem(hammingen); title('编码输出序列'); subplot(2,2,3); stem(hammingene); title('解码输出序列'); subplot(2,2,4); stem(hammingde); title('解码输出序列'); clear all; SampleTime=1/1000; for i=1:8 SNR=i-3; sim('hammingsim'); biterr(i)=0; for j=1:length(err) biterr(i)=biterr(i)+err(j,1); end; biterr(i)=biterr(i)/length(err); end; figure(2);
实验一 汉明码编解码实验
一、实验目的
1、掌握汉明码的编解码原理。 2、掌握汉明码的软件仿真方法。 3、掌握汉明码的硬件仿真方法。 4、掌握汉明码的硬件设计方法。
二、预习要求
1、掌握汉明码的编解码原理和方法。 2、熟悉 matlab 的应用和仿真方法。 3、熟悉 Quatus 的应用和 FPGA 的开发方法。
三、实验原理
1、信道编码的概念 通信信号是通过信道的传输,从信源传到信宿。由于信道有着不同的特征,这些特征将会影响传输中 的通信信号,使信宿不能正确接受和识别信源的信号。因此需要采取各种方式抗信道干扰,信道编码就是 一种广泛采用的抗信道干扰的方法。信道编码的思想是按照一定规律在待发送的信息码中加入一些冗余的 信息,接收端根据这些冗余信息和信息码来恢复原来的信号。因此,信道编码的任务就是以最小的冗余代 价来换取抗干扰性能最好的码。 2、汉明码的原理 汉明码是 1949 年提出的一种能纠正单个错误的线性分组码。实验中采用的含明码为(7,4)汉明码,其 采用的本原多项式为 f ( x ) x x 1 。 其生成矩阵为 G=[1011000,1110100,1100010,0110001]。 监督矩阵为:H=[1001110,0100111,0011101]。 当输入编码序列为 I 时,输出编码序列 R=IG,输出的编码序列为系统码。接收的待译码序列 D=R +E,E 为错误序列。错误图样 S=DHT,根据错误图样 S 可以判决得到错误序列 E。将错误序列和接收的 待译码序列运算可以得到正确的译码输出。 设 (7, 4) 汉明码中共有 4 个信息码, 3 个监督码。 我们用 a6 a5 a4 a3 a2 a1a0 表示这 7 个码元, 用 S1,S2,S3 表示三个监督关系式中的校正子,则 S1,S2,S3 的值与错码的位置的对应关系规定如下表所示: (其中 S1 a6 a5 a4 a2 ; S 2 a6 a5 a3 a1 ; S 3 a6 a4 a3 a0 )
七、实验内容
1、用 matalab 中的 simulink 对(7,4)汉明码进行软件仿真,绘制(7,4)汉明码的误码率图,分析它的纠 错能力和码率; 2、在 Quatus 中分别对(7,4)汉明码的编码和解码程序进行仿真,分析(7,4)汉明码的编解码过程; 3、 在实验系统中, 分别置 SW102-2, SW102-1, SW102-0 为”000”和 SW201-3, SW201-2, SW201-1 为”000”, 选择汉明码编解码方式。置 SW103-6,SW103-5,SW103-4,SW103-3,SW103-2,SW103-1 为”000000”, 即不加任何错。 4、由 SW101-8, SW101-7 ,SW101-6 , SW101-5, SW101-4 ,SW101-3 , SW101-2, SW101-1 任意输入 8 位数据,观察并记录 D116,D115,D114,D113,D112,D111,D110,D109,D108,D107,D106,D105, D104,D103,D102,D101 对应的编码后的输出数据。其中 D115,D114,D113,D112,D111,D110, D109 对应于 SW101-8,SW101-7,SW101-6,SW101-5 输入的四位数据的汉明码编码结果;D107,D106, D105,D104,D103,D102,D101 对应于 SW101-4,SW101-3,SW101-2,SW101-1 输入的四位数据的汉 明码编码结果。D116 和 D108 为保持一帧 16 位的补零数据。 5、用示波器分别测量 TP102 和 TP103,观察并编码输出的帧的帧格式。 6、观察并记录解码数据输出端 D208,D207,D206,D205,D204,D203,D202,D201 的解码输出状态和错误指示 灯(当判断出数据有错码时就指示)D220 的输出状态。看是否译码正确。 7、通过 SW103-6,SW103-5,SW103-4,SW103-3,SW103-2,SW103-1 选择在任意位置设置一位错误。 8、看看解码模块的解码输出数据 D208,D207,D206,D205,D204,D203,D202,D201 以及误码指示 D220。看是 否译码正确。 9、换几组数据(至少 4 组数据)重复上述步骤 3-8。
011 100 101 110 111
卷积码解码 Turbo 码解ቤተ መጻሕፍቲ ባይዱ 扩展用 扩展用 汉明码交织解码
7、解码数据输出端:D208,D207,D206,D205,D204,D203,D202,D201。错误指示灯(当判断出数据有错码时 就指示) :D220。 8、其他:七段码显示表明维特比译码的四路路径度量。
如图所示:编码输入为 0001,编码输出为 0001011。 2、汉明解码 (1)端口设置 cs_hanming:输入汉明解码设置使能位,’1’电平有效; datain_hanming:输入 7 位汉明编码位; error_hanming:输出错误标志位,当信道加错时,输出‘1’电平表示信道有错; dataout_hanming:输出 4 位汉明解码位。 (2)主要程序 --产生错误图样 sel(2)<=(datain_hanming(6) xor datain_hanming(5)) xor (datain_hanming(4) xor datain_hanming(2)); sel(1)<=(datain_hanming(6) xor datain_hanming(5)) xor (datain_hanming(3) xor datain_hanming(1)); sel(0)<=(datain_hanming(6) xor datain_hanming(4)) xor (datain_hanming(3) xor datain_hanming(0)); --输出错误序列 with sel select
(1)端口设置 cs_hanming:输入汉明编码使能位,’1’电平有效; datain_hanming:输入 4 位编码输入位; dataout_hanming:输出 16 位编码输出位,低 7 位为编码输出位,高 9 位为 0。 (2)主程序 if cs_hanming='1'then dataout_hanming(6 downto 3)<=datain_hanming(3 downto 0); dataout_hanming(0)<=datain_hanming(3) xor datain_hanming(1) xor datain_hanming(0); dataout_hanming(1)<=datain_hanming(3) xor datain_hanming(2) xor datain_hanming(0); dataout_hanming(2)<=datain_hanming(3) xor datain_hanming(2) xor datain_hanming(1); dataout_hanming(15 downto 7)<="000000000"; else dataout_hanming(15 downto 0)<="0000000000000000"; end if; (3)输出结果