卷积编码器的简单实现
前言
一周前,通信编码老师布置下一个任务——用C/C++实现卷积编码器,于是乎经过一个星期断断续续的思考和码字,也是成功的在linux下实现了。下面我将一些思路及关键点进行阐述和讲解,望各位看客获益。
在开始讲解前,先申明几点:
- 如有通信编码课老师刚好是系主任刚好姓丁刚好也布置了这个作业的同学,别慌!自己人!
- 本程序难度不大,适合C++青铜段的同学们
- 本文只贴出了部分代码,仅提供思路,“…”处为省略
- 小弟学识浅薄,纰漏之处敬请指正
思路
由于卷积的计算可以转化为矩阵的计算,因此卷积编码计算的思路大致为:
- 选定单位脉冲响应(设为gxy,代表第x个输入的第y个输出的单位脉冲响应)
- 根据输入序列长度(设为seqLen)构建出矩阵(设为gMat)
- 输入序列(设为seq)与gMat做矩阵乘法得到输出序列
可以看到,不同的卷积编码仅区别于gxy与序列长度。既然序列长度是根据每次输入所改变的,那么只要改变gxy便可以改变卷积编码的类型。因此,我们将gxy及相关参数保存为文件,想要实现不同的卷积编码仅需载入不同的文件即可
部分源码解析
- 首先是头文件
convCode.h
#pragma once
#include <iostream>
#include <string>
#include <string.h>
#include <fstream>
#include <ctype.h>
#include <errno.h>
#define MAXLINE 64
#define OUTMAX 36
using namespace std;
class Encoder {
//Encoder类,代表编码器
public://图方便将所有成员设为公共,更加严谨的方法是仅留几个函数接口为公共
int