使用matlab自带的卷积码编解码函数实现咬尾卷积码
2013-09-28 14:25
886 查看
卷积码的原理这里就不说了,这里只是一个小的演示程序。主要解决的问题是如何使用matlab自带的卷积码编译码函数实现咬尾卷积码的编码,打孔以及译码。
%编码器输入48比特 signal = randi([0 1],1,48); fprintf('信号长度%d\n',length(signal)); %1/2咬尾卷积码:先输入尾部的码6比特,再输入正常码48 c = [signal(end-(constLen-2):end), signal]; fprintf('补充尾部后信号长度%d\n',length(c)); %打孔器设计 %信号的长度必须是打孔向量长度的整数倍 %打孔长度本来为24*4 = 96比特,但是由于信号多输入了6比特,会多产生12比特,所以打孔向量的长度为96+12=108 %这12比特需要被被完全打掉 p = [1 1 ;1 0]; p =reshape(p,1,4); for i = 1:23 p = [p,1 1 1 0]; end %前面补0是为了打孔时,将前面的尾部生成的比特打掉(尾部本来是应该放在初始状态中的) p = [zeros(1,12),p]; fprintf('打孔器的长度为 %d\n',length(p)) % 卷积编码 C = convenc(c, convCode,p); fprintf('卷积编码输出长度为 %d\n',length(C)) %解码部分 tbLen = length(C)/rateInv; %为了能在译码时获得咬尾卷积码的初始状态,把接收到的码子拷贝两份译码,第一份译码完毕以后,编码器的状态就与咬尾卷积码的起始状态相同了 C = [C,C]; fprintf('双份比特的长度为%d\n',length(C))%144 %相应的,解码器的打孔矩阵也要发生变化: %当数据重复2份时,解码时的打孔矩阵并不是将原先的打孔矩阵重复而是,将编码打孔时的用来打掉咬尾的打孔部分去掉 p = [p(1+12:end),p(1+12:end)]; %输入解码器的比特长度应该是打孔矩阵的1的个数的整数倍 fprintf('打孔矩阵1的个数为%d\n',sum(p)) %译码 cR = vitdec(C, convCode, tbLen, 'trunc', 'hard',p); fprintf('译码输出个数为%d\n',length(cR)); %解码时选择后面那一份的译码结果 recv = cR(length(cR)/2+1:end); fprintf('最终结果个数为%d\n',length(recv)); err = sum(abs(recv-signal))
相关文章推荐
- 给图像加高斯噪声和椒盐噪声(不使用自带函数)matlab实现
- MATLAB自带的svm实现函数与libsvm差别
- 图像放缩 (matlab实现,不用自带的函数)
- 【转】Matlab中使用varargin来实现参数可变的函数
- Matlab中使用varargin来实现参数可变的函数
- C语言实现Matlab自带的滤波filter()函数
- matlab自带函数实现BP神经网络
- matlab自带函数实现高斯滤波(gauss filter)快速算法
- MATLAB自带的svm实现函数与libsvm差别小议(机器学习)
- MATLAB GUI ,2,使用MATLAB的函数来实现MATLAB GUI,part 5,imshow绘图方式以及主辅图像缓存
- [置顶] matlab2c使用c++实现matlab函数开发配置全解
- MATLAB自带的svm实现函数与libsvm差别小议
- 使用MATLAB自带函数求解二次特征值问题
- MATLAB GUI ,2,使用MATLAB的函数来实现MATLAB GUI,part 4,小游戏
- Matlab中使用varargin来实现参数可变的函数
- 使用OpenCV中的filter2D函数精确实现matlab中的imfilter函数(已测)
- MATLAB GUI ,2,使用MATLAB的函数来实现MATLAB GUI,part 1,图像、按钮和坐标轴
- Matlab中使用varargin来实现参数可变的函数
- MATLAB GUI ,2,使用MATLAB的函数来实现MATLAB GUI,part 3,全局变量,计时器和状态机
- MATLAB自带的svm实现函数与libsvm差别小议