(完整word版)卷积码的编译码MATLAB程序

合集下载

卷积码的编码及解码Viterbi解码Word版

卷积码的编码及解码Viterbi解码Word版

卷积码的编码及解码(Viterbi 解码)一、实验目的1、了解卷积码的基本原理;2、掌握卷积码编码的电路设计方法;2、掌握卷积码 Viterbi 译码的基本方法和电路设计方法。

二、实验仪器1、移动通信实验箱一台;2、台式计算机一台;三、实验原理1.卷积码编码原理卷积码是一个有限记忆系统,它也将信息序列切割成长度 k的一个个分组,与分组码不同的是在某一分组编码时,不仅参看本时刻的分组而且参看本时刻以前的 L 个分组。

我们把 L+1 称为约束长度。

2.卷积码的译码算法(硬判决 Viterbi 译码)Viterbi译码算法是一种最大似然算法,它不是在网络图上依次比较所有可能的路径,而是接收一段,计算,比较一段,保留最有可能的路径,从而达到整个码序列是一个最大似然序列。

Viterbi解码算法的基本步骤如下:1、从某一时间单位j=m开始,对进入每一状态的所有长为j段分支的部分路径,计算部分路径度量。

对每一状态,挑选并存储一条有最大度量的部分路径及其部分度量,称此部分路径为留选(幸存)路径。

2、j增加1,把此时刻进入每一状态的所有分支度量,和同这些分支相连的前一时刻的留选路径的度量相加,得到了此时刻进入每一状态的留选路径,加以存储并删去其他所有的路径。

因此留选路径延长了一个分支。

3、若j<L+m,则重复以上步骤,否则停止,译码器得到了有最大路径度量的路径。

上面的过程可以简单的总结为“加、比、选”(也称ACS)。

四、实验步骤1、将实验箱和计算机通过串行口连接好,为实验箱上电。

2、将与实验箱相连的电脑上的学生平台程序打开。

在“实验选择”栏中选择“卷积码”实验,点击确认键。

从而进入此实验界面。

3、在实验界面上点“生成数据”,让系统生成待编码的随机比特。

也可在界面上直接双击所显示的 bit,修改其值。

4、在界面上点击下发“原始数据”,该数据将被送入单片机(或 CPLD)进行卷积编码然后经过编码的数据被送回学生平台并显示在“编码数据”栏。

快速卷积的MATLAB实现

快速卷积的MATLAB实现

摘要在信号处理中,许多具体的应用是以线性卷积为基础的。

当序列点数较少时可以直接计算线性卷积,然而当序列长度很长时,直接计算卷积的运算量非常庞大。

快速卷积是实现卷积的一种快速算法,减少了运算量,节约了时间,给我们计算卷积提供了很大的便利。

本课程设计是以Matlab为基础,完成序列的卷积和快速卷积运算的编程实现,以及相应的分析和比较。

关键字:Matlab 卷积快速卷积目录1.基于设计题目的原理简介 (1)1.1 序列卷积的定义 (1)1.2 快速傅里叶变换FFT概念 (1)1.3 快速卷积方法及实现 (1)2.程序设计及运行结果分析 (3)2.1 题目一 (3)2.2 题目二 (4)2.3 题目三 (7)3.心得体会 (10)参考文献 (11)专业综合课程设计成绩评定表 (12)1.基于设计题目的原理简介卷积是数字信号处理(DSP)系统中最常见的,也是最重要的运算之一,无论在时域或频域都离不开卷积运算,FFT是DFT的快速算法,当满足一定条件时可用来计算线性卷积,称为快速卷积。

Matlab具有强大的矩阵运算能力,方便实用的绘图功能和语言的高度集成性,在DSP开发中,使用Matlab可以快速对系统进行仿真运算。

1.1 序列卷积的定义设x(n)和h(n)是两个离散序列,进行下列求和运算:∑∞-∞== -=nnhnxmnhmxny)(*)()()()(这样,随着n的不同取值,这个求和公式就定义了一个新序列y(n),称为序列x(n)与h(n)的卷积,记为y(n)=x(n)*h(n) 。

由于DSP主要依靠计算机完成,而计算机无论在时域或频域只能处理有限长的离散信号。

此时只需令上述公式中的n在一个范围内取值即可。

1.2 快速傅里叶变换FFT概念DFT就是对序列频谱的离散化,在数字信号处理中有着重要的作用,但直接计算DFT 的运算量非常大,它与序列长度的平方成正比,因此制约了DFT的应用。

快速傅里叶变换FFT是实现DFT的一种快速算法,能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

卷积码+交织+维特比译码+解交织

卷积码+交织+维特比译码+解交织

1.实验摘要实验1 卷积码编码实验2 交织编码实验3 解交织实验4 维特比译码2.实验12.1 实验1概要在实验1中,首先给出了卷积码编码的流程,然后给出了实现卷积码编码的源程序。

2.2程序的具体过程2.2.1程序流程2.2.2MATLAB源程序function [output]=cnv_encd(input)%output=cnv_encd(g,k0,input) 卷积码编码函数%g 生成矩阵%k0 输入码长%input 输入信源序列%output 输出卷积编码序列g=[1 1 1;1 0 1];%编码矩阵k0=1;input=[1 1 0 1];if rem(length(input),k0)>0input=[input,zeros(size(1:k0-rem(length(input),k0)))];endn=length(input)/k0;if rem(size(g,2),k0)>0error('Error,g is not of the right size.')endli=size(g,2)/k0;n0=size(g,1);u=[zeros(size(1:(li-1)*k0)),input,zeros(size(1:(li-1)*k0))];u1=u(li*k0:-1:1);for i=1:n+li-2u1=[u1,u((i+li)*k0:-1:i*k0+1)];enduu=reshape(u1,li*k0,n+li-1);output=reshape(rem(g*uu,2),1,n0*(n+li-1));3.实验23.1 实验2概要在实验2中,给出了两种交织编码的过程—卷积交织和循环等差交织,然后给出了实现这两种交织编码的源程序。

3.2程序的具体过程3.2.1程序流程3.2.2MATLAB源程序(1)卷积交织function [aa]=jiaozhi(bb,n)%jiaozhi.m 卷积交织函数n=28; %分组长度%bb 卷积交织前原分组序列%aa 卷积交织后分组序列%序号重排方式:cc=[123171151721;82241812628;159****9137;22161042620 14 ];%交织矩阵bb=[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28]; for i=1:naa(i)=bb(cc(i));end(2)循环等差交织function [aa]=jiaozhi_nocnv(bb,n)%jiaozhi_nocnv.m 循环等差交织函数n=28; %分组长度%bb 循环等差交织前原分组序列%aa 循环等差交织后还原分组序列%序号重排方式:bb=[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ];j=1;for i=1:nj=rem(j+5-1,n)+1; %序号重排方式迭代算法aa(n+1-i)=bb(j);end3.2.3程序说明交织码通常表示为(M,N),分组长度L=MN,交织方式用M行N列的交织矩阵表示。

Matlab设计卷积编码和Viterbi已实现_read me

Matlab设计卷积编码和Viterbi已实现_read me

1、卷积编码和Viterbi解码的原理参见tutorial,代码编写都是基于该文档进行
网址:
或者附带的pdf文件
2、Convolutional Encoding采用Matlab自带的编码程序;可以在Matlab安装目
录下的通信工具箱中找到
3、测试程序testV对比了uncoded system & (2,1,2)卷积码经维特比解码后误码率
和信噪比曲线图,也可以采用别的卷积编码生成矩阵
4、由于无法压缩上传,故把代码放在一个word文档中,可将其中各子程序分
别复制出来保存为M。

注意有可能某些注释在doc文件中换行了,需要修改为注释
5、代码很少用matlab内部函数和工具箱,除某些参考网上设计外其余皆为自己
编写并测试通过,可修改其内容实现其他功能。

Matlab设计卷积编码和Viterbi已实现_functions

Matlab设计卷积编码和Viterbi已实现_functions

%%---------------------------------------testViterbi.m--------------------------------------------------------------%% %%% Annotated by Quan Xu on Nov. 22, 2011clear all;clc;close;delete *.mat;EsNodB = 0:1:10;EsNo = 10.^(EsNodB/10);N_samples = 100;N_bits = 512;for k = 1 : length(EsNodB)for m = 1 : N_samples% noise powerWGNPower = 1/EsNo(k); % for uncoded systemWGNPower1 = 2/EsNo(k); % for 1/2 convolutional coded system% random messagemsg = randint(1,N_bits);% unencode datab = msg;% Encode data bitstrel = poly2trellis(3,[7 5]); % Define trellisb1 = convenc(msg,trel); % Encode% modulatex = 1 - 2*b;x1 = 1 - 2*b1;% AWGN channelh = ones(size(x));h1 = ones(size(x1));% Gaussian noise generationw = sqrt(WGNPower/2)*(randn(size(x)) + sqrt(-1)*randn(size(x)));w1 = sqrt(WGNPower1/2)*(randn(size(x1)) + sqrt(-1)*randn(size(x1)));% recieved signalsy = h.*x + w;y1 = h1.*x1 + w1;% demodulate uncoded dataoutUncod = uncode(y,h);% Soft-decision viterbi decodingoutVit1 = simeudistVit(trel, y1);errrate(m) = mean(abs(outUncod-msg));errrate1(m) = mean(abs(outVit1-msg));end % for mber(k) = mean(errrate)ber1(k) = mean(errrate1)end % for ksemilogy(EsNodB,ber,'k',EsNodB,ber1,'-r');grid onaxis([1 10 10^-5 1])xlabel('10log(Eb/No)')ylabel('BER')title('AWGN channel viterbi decoder');h = legend('uncoded', '[2,1,2]convolutional encoding');set(h,'Interpreter','none')save conViterbi.mat;% EOF%%---------------------------------------- testViterbi.m ------------------------------------------------------%%%% Calulating Euclidean distance%% (x-y).^2 --> xy ; since x = +1 or -1; y is the same for every branch%% Annotated by Quan Xu on Nov. 22, 2011function dist = simEudist(x,y)leth = length(x);realx = real(x);realy = real(y);dist = 0;for i=1:lethdist = dist + realx(i)*realy(i);end% EOF%%----------------------------------------simEudist.m ------------------------------------------------------%%%%----------------------------------------uncode.m ------------------------------------------------------%% %% Annotated by Quan Xu on Nov. 22, 2011%% demodulating the uncoded datafunction unOut = uncode(y,h)for l = 1 : length(y)llr(l) = abs(y(l)+h(l))^2 - abs(y(l)-h(l))^2;x_hat(l) = sign(llr(l));b_hat(l) = (1-x_hat(l))/2;end % for lunOut = b_hat;% EOF%%----------------------------------------uncode.m ------------------------------------------------------%%%%% Annotated by Quan Xu on Nov. 22, 2011function enc = trellis2enc( trl ),% put the trellis structure into a more user friendly mannerenc.k = log2( trl.numInputSymbols ); % number of inputsenc.n = log2( trl.numOutputSymbols ); % numbor of outputsenc.r = enc.k / enc.n; % code rateenc.ksym = trl.numInputSymbols; % number of possible input combinationsenc.nsym = trl.numOutputSymbols; % number of possible output combinationsenc.stat = trl.numStates; % number of encoder states% forward transitions:enc.next.states = trl.nextStates + 1; % NEXT statesenc.next.output = trl.outputs; % NEXT outputsfor i = 1:enc.ksym, % NEXT (binary) outputsenc.next.binout( :,:,i ) = 1 - 2*de2bi( oct2dec( trl.outputs(:,i) ), enc.n, 'left-msb' );end% store possible binary outputs and inputs:enc.inp = de2bi( oct2dec( [0:enc.ksym-1] ), enc.k, 'left-msb' ); % all possible binary inputsenc.out = de2bi( oct2dec( [0:enc.nsym-1] ), enc.n, 'left-msb' ); % all possible binary outputsenc.bininp = 2*enc.inp-1;return;%%----------------------------------------trellis2enc.m ------------------------------------------------------%%%%% This function could be found in C:\Program Files\MATLAB\R2008b\toolbox\comm\comm\convenc.m%%% Annotated by Quan Xu on Nov. 22, 2011function varargout = convenc(msg, trellis, varargin)% Typical error checking.error(nargchk(2,4,nargin,'struct'));nvarargin = nargin - 2;% Set defaultspunctVec = [];initialstate = 0;switch (nvarargin)case 1if ~isempty(varargin{1})if isscalar(varargin{1})initialstate = varargin{1};elsepunctVec = varargin{1};endendcase 2[punctVec, initialstate] = deal(varargin{:});endif nargout > 2error('comm:convenc:TooManyOutputArg','Too many output arguments.');end% check trellisif ~istrellis(trellis),error('comm:convenc:InvalidTrellis','Trellis is not valid.');end% Get info out of trellis structurek = log2(trellis.numInputSymbols);n = log2(trellis.numOutputSymbols);outputs = oct2dec(trellis.outputs);% Check msgif ~isempty(msg)msg_dim = size(msg);if ~( isnumeric(msg) || islogical(msg) ) || ...length(msg_dim)>2 || ...min(msg_dim)>1error('comm:convenc:InvalidMsg','The input message must be a logical or numeric vector.');endoutLog = islogical(msg); % for output data typemsg = double(msg); % for proper numerical operationif max(max(msg < 0)) || ...max(max(~isfinite(msg))) || ...~isreal(msg) || ...max(max(floor(msg) ~= msg)) || ...max(max(msg)) > 1error('comm:convenc:InputNotBinary','The input message must contain only binary values.');endif mod(length(msg), k) ~=0error('comm:convenc:InvalidMsgLength',['Length of the input message must be a multiple of the ' ...'number of bits in an input symbol.']);end% Get message orientationif msg_dim(1)>1msg_flip = 1;msg=msg';elsemsg_flip = 0;endend% Check Puncture vectorif ~isempty(punctVec)% Validity checkif ~( isnumeric(punctVec) || islogical(punctVec) ) || ...length(size(punctVec)) > 2 || ...~( isvector(punctVec) && ~isscalar(punctVec) ) || ...max(max(~isfinite(punctVec))) || ...~isreal(punctVec)error('comm:convenc:InvalidPuncPat', ['The puncture pattern parameter',...' must be a vector of real or logical values.']);end% Binary value checkif any(punctVec~=0 & punctVec~=1)error('comm:convenc:PuncPatNotBinary', ...['The puncture pattern parameter must be a binary vector of 1''s ',...'and 0''s only.']);end% Length checksif length(punctVec) < nerror('comm:convenc:InvalidPuncPatLength',...['The puncture pattern parameter length must be at least the ',...'number of bits in an output symbol.']);endif mod((length(msg)/k)*n, length(punctVec)) ~=0error('comm:convenc:InvalidCodeLengthPunc', ...['The input message length divided by the base code rate must be an',...'\ninteger multiple of the length of the puncture pattern parameter.']);endend% Check initial stateif ~isnumeric(initialstate) || ...~isscalar(initialstate) || ...max(max(initialstate < 0)) || ...max(max(~isfinite(initialstate))) || ...~isreal(initialstate) || ...max(max(floor(initialstate) ~= initialstate)) || ...max(max(initialstate)) > trellis.numStates-1error('comm:convenc:InvalidInitialState',['The initial state must be an integer scalar between 0 and ' ...'(TRELLIS.numStates-1). See POLY2TRELLIS.']);end% Return if input message is emptyif isempty(msg)varargout{1} = [];varargout{2} = initialstate;return;end% Actual call to core function 'convcore.c'[code, fstate] = ...convcore(msg,k,n,trellis.numStates,outputs,trellis.nextStates,initialstate);if ~isempty(punctVec)% Expand punctVec if neededif length(code) ~= length(punctVec)pVec = punctVec(:);bb = pVec(:, ones(1, length(code)/length(punctVec))); % repeatpunctVec = bb(:); % vector end% Puncture the encoded outputcode(~logical(punctVec)) = [];end% Change code back to same orientation as input MSGif msg_flipcode=code';end% Set output data type to logical if appropriateif outLog, code = logical(code); end;% Set outputsvarargout = {code, fstate};% [EOF]%%----------------------------------------convenc.m ------------------------------------------------------%%%%----------------------------------------simeudistVit.m ------------------------------------------------------%% %% Using the simplified Euclidean distance%% trellis2enc transfer the Matlab trellis to be user-friendly form%% input arguments%% trel : matlab trellis structure%% y : received symbols from the channel%% output%% decVit : decoding bits%% Annotated by Quan Xu on Nov. 22, 2011function decVit = simeudistVit(trel, y);enc = trellis2enc( trel );% some parametersk = enc.k;n = enc.n;r = enc.r;ksym = enc.ksym;nsym = enc.nsym;numStat = enc.stat;states = enc.next.states;outputs = enc.next.binout;leth = length(y)/n;%Input table; for decoding with current state and previous statedecodBit = 2*ones(numStat); %Row numbers represent current states plus 1 while columns represent next states plus 1for i=1:numStatfor j=1:2nxt = states(i,j);decodBit(i,nxt) = j-1;end %jend %i%---------------caculating path metric array &surviving predecessor states array initial value numMem = log2(numStat); % Memories of the encoder: number of branches before constructing four statespm = zeros(1,numStat);pmtmp = pm;surpred = zeros(numStat,leth);inipred = [1 zeros(1,numStat-1)];initmp = inipred;for i = 1:numMemiy = zeros(1,n);for p = 1:niy(p) = y((i-1)*n+p);endfor j = 1:numStatif initmp(j) == 1ininxt0 = states(j,1);pm(ininxt0) = pmtmp(j)+simEudist(outputs(j,:,1),iy);surpred(ininxt0,i) = j;inipred(ininxt0) = 1;ininxt1 = states(j,2);pm(ininxt1) = pmtmp(j)+simEudist(outputs(j,:,2),iy);surpred(ininxt1,i) = j;inipred(ininxt1) =1;endend %jinitmp = inipred;pmtmp = pm;end %i%----caculating path metric array &surviving predecessor states...%...array initial value% indiceid = zeros(2*numStat, 2);for i = 1:2*numStatid(i,1) = mod(i-1,numStat)+1;id(i,2) = floor((i-1)/numStat)+1;end %i% decode beginningfor i=numMem+1:leth;iy = zeros(1,n);for p = 1:niy(p) = y((i-1)*n+p);endfor s = 1:numStat;d1=simEudist(outputs(id(2*s-1,1),:,id(2*s,2)),iy); % The previous two states could be caculated with left-shift of current ..d2=simEudist(outputs(id(2*s,1),:,id(2*s,2)),iy); % ... state then plus 0&1, for theoutputs, these two indices should plus another 1if (pmtmp(id(2*s-1,1))+d1)>(pmtmp(id(2*s,1))+d2);pm(s)=pmtmp(id(2*s-1,1))+d1;surpred(s,i) = id(2*s-1,1);elsepm(s)=pmtmp(id(2*s,1))+d2;surpred(s,i) = id(2*s,1);endendpmtmp = pm;end%find the path having minimum accumulated metricminMetr = [1 pm(1)];for i=1:numStat;if pm(i) > minMetr(2);minMetr(2)= pm(i); % the minimum metric of the last branch in trellisminMetr(1)=i; % the last state of selected pathendenddecVit = 2*ones(1,leth);cs = minMetr(1);for j=leth:-1:1;ps = surpred(cs,j);if ps ==0disp('error');enddecVit(j) = decodBit(ps,cs);cs = ps;end%EOF%%----------------------------------------simeudistVit.m ------------------------------------------------------%%。

matlab conv2 代码

matlab conv2 代码

matlab conv2 代码Matlab中的Conv2函数是卷积函数,它用于在两个矩阵之间进行卷积运算。

该函数已预先编写,用户可以直接使用。

本文将介绍Matlab Conv2代码的使用方法以及参数解释。

步骤1:打开Matlab首先,打开Matlab软件,并创建一个新的M-file。

为此可以点击菜单中的File,选择New和M-file。

步骤2:输入代码和变量输入以下代码,定义我们要使用的两个矩阵:A = [2 4 4; 4 8 8; 4 8 8];B = [1 1; 1 1];此代码定义了这两个矩阵:A和B。

矩阵A中包含9个元素,矩阵B中包含4个元素。

需要注意的是,B矩阵的大小必须小于等于A矩阵大小。

步骤3:使用Conv2函数进行卷积现在,在代码前面添加以下代码以使用Conv2函数:C = conv2(A,B);此代码会将矩阵A和B作为输入并将结果存储在矩阵C中。

代码完成后,您可以运行它并查看结果。

步骤4:查看结果你可以添加以下代码,以查看卷积后的矩阵C:disp(C);此命令输出矩阵C的值。

在本例中,矩阵C的值应该是:6 12 16 8 812 24 32 16 1612 24 32 16 168 16 16 8 88 16 16 8 8步骤5:修改代码并测试现在,您可以尝试修改代码。

考虑更改B矩阵的值并查看结果。

您可以使用类似以下示例的代码:B = [1 0; 0 1];C = conv2(A,B);disp(C);此代码定义了一个不同的B矩阵,然后对A矩阵进行卷积。

在此情况下,结果应该如下所示:2 4 4 0 04 8 8 0 04 8 8 0 00 0 0 2 40 0 0 4 8结论在本文中,我们介绍了使用Matlab的Conv2函数进行卷积的方法。

我们还解释了Conv2函数的参数及其用法。

通过使用该函数,您可以轻松处理任何大小的矩阵,以便进行图像处理、信号处理等任务。

如果您对Matlab有兴趣,我们建议您进一步学习有关这个强大的软件的文档和教程。

卷积matlab

卷积matlab卷积在数字信号处理和图像处理中是一个非常重要的概念。

它可以将两个函数进行数学上的操作,输出一个新的函数。

在MATLAB中,卷积可以使用内置函数conv来实现。

具体方法是将两个函数作为参数传递给conv函数,然后将返回的结果输出或者进行其他处理。

卷积的定义和应用卷积在数学上定义为两个函数f和g通过积分进行操作的结果。

在图像处理和数字信号处理中,我们通常使用离散的形式来进行卷积计算。

离散卷积定义为两个序列f和g之间的操作。

在MATLAB中,我们可以使用内置函数conv来实现离散卷积计算。

比如,我们可以计算两个序列的卷积:x = [1 2 3 4];h = [1 1 1];y = conv(x,h);在这个例子中,序列x有4个元素,序列h有3个元素。

在进行卷积计算之后,我们得到一个新的序列y,其长度为4+3-1=6。

在数字信号处理中,卷积通常用于滤波器设计和信号处理。

通过使用卷积,我们可以对信号进行加权平均或者基于模板的滤波。

在图像处理中,卷积通常用于图像增强和特征提取。

卷积的实现方法在MATLAB中,卷积的实现可以基于多种方法。

下面是其中几种方法:1. 直接卷积法这种方法是最简单的方法。

它可以直接使用卷积的定义,通过计算每个点的乘积并求和得到结果。

这个方法非常慢,因为计算每个点的乘积和求和非常耗时。

因此,它通常只用于小规模的数据集。

2. 快速傅里叶变换法这种方法是非常快的,因为它使用FFT算法来计算卷积。

FFT算法是计算离散傅里叶变换的一种快速算法。

通过使用FFT算法,我们可以将卷积操作的时间复杂度从O(n^2)降低到O(nlogn)。

通常,这种方法用于大规模数据集的卷积计算。

在MATLAB中,我们可以使用内置函数fft2和ifft2实现快速傅里叶变换和逆变换。

比如,我们可以将卷积计算改为使用FFT:x = [1 2 3 4];h = [1 1 1];y = ifft(fft(x).*fft(h));这个例子中,我们首先使用fft函数分别计算x和h的傅里叶变换,然后将它们相乘。

如何通过Matlab进行卷积与卷积运算

如何通过Matlab进行卷积与卷积运算使用Matlab 进行卷积与卷积运算引言:卷积与卷积运算在信号处理、图像处理、机器学习等领域中起着至关重要的作用。

Matlab作为一款强大的数学工具,提供了丰富的函数和工具箱,能够便捷地进行卷积与卷积运算。

本文将介绍如何使用Matlab进行卷积与卷积运算,并通过实例说明其应用。

一、卷积的基本概念卷积是一种数学运算,常用于信号处理中。

它将两个函数进行混合,输出一个新的函数。

在离散卷积中,输入的两个函数通常是序列或矩阵。

卷积的定义如下:[f * g](n) = ∑[f(k) * g(n-k)] (k=-∞ to ∞)其中,f * g 表示卷积运算,f 表示输入函数,g 表示卷积核函数,n 表示输出函数的索引。

二、Matlab中的卷积函数在Matlab中,可以使用conv函数来进行一维离散卷积的计算。

conv函数的语法如下:y = conv(x,h)其中,x 表示输入函数,h 表示卷积核函数,y 表示输出函数。

在使用conv函数时,需要注意输入函数和卷积核函数的维度匹配,以及输入函数和卷积核函数的长度关系。

在长度不一致的情况下,可以使用padarray函数进行填充。

三、卷积运算的应用举例为了更好地理解卷积与卷积运算的应用,下面将通过几个实例进行详细讲解。

实例一:图像模糊图像模糊是一种常见的图像处理技术,可以用于去除图像中的噪声和细节。

在Matlab中,可以通过卷积运算实现图像模糊。

首先,需要构建一个卷积核函数,例如:h = ones(5, 5) / 25;此处构建了一个5x5的全1卷积核函数,并将其除以25,以实现平均模糊。

然后,使用conv函数对输入图像进行卷积运算:blurred_image = conv(input_image, h);实例二:音频信号滤波在音频处理中,常常需要对音频信号进行滤波以去除噪声或者强调特定频率。

卷积运算可以实现各种滤波器的设计和应用。

卷积码编译码实验报告

厦门理工学院实验报告书课程名称:信息论与编码实验实验名称:卷积码编译码m•个有效的寄存器单元,而输出移位寄存器仅中输入移位寄存器最多只有k起一个并串转换作用。

因此称参量m为卷积吗的记忆长度(段)2、维比特译码原理它的基本思想是把接收到的矢量,和网格图上诸种可能的路径比较,删去距离大的路径,保留距离小的路径,以距离最小路径作为发码的估值五、实验内容在MATLAB环境下卷积码编/解码器的实现。

1、主函数main.mclear;clc;msg = randint(1,20,[0,1])word = encode_conv213(msg)word(1) =~word(1); %信道中存在污染,人为的模拟传输过word(10) =~word(10); %程中的出错码字word(15) =~word(15);word1=wordmsg_1 = decode_conv213(word1)msg-msg_12 、状态积state_machine.mfunction [output,nextState] = state_machine(input,current_state)output(1) = mod(current_state(1)+current_state(3),2);output(2) = mod(input+current_state(2)+current_state(1),2);nextState(1) = current_state(2);nextState(2) = current_state(3);nextState(3) = input;3、汉明距离hamming_distance.mfunction distance = hamming_distance(a,b)temp = a+b;temp = mod(temp,2);distance = sum(temp);4 、213编码程序encode_conv213.mfunction word = encode_conv213(msg)word = zeros(1,length(msg)*2);current = [0 0 0];for i = 1:length(msg)[out,next] = state_machine(msg(i),current);current = next;word(2*i-1) = out(1);word(2*i) = out(2);End5、213维比特译码decode_conv213.mfunction msg = decode_conv213(word)chip = 10; %初始状态选十个信息for i = 1:2^chipM(i,:) = de2bi(i-1,chip); %把所有可能性按二进制输出W(i,:) = encode_conv213(M(i,:));%得到相应的二进制编译后的码字D(i) = hamming_distance(W(i,:),word(1:chip*2));%与出错码字对比得到汉明距end[val,index] = sort(D);%val中存汉明距从小到大排列,index中存对应val数据所在位置ret_msg = zeros(1,length(word)/2); %开辟译出码字的存放空间for i = 1:6%1024种选择6种最小距离,并输出在ret_msg中,最小汉明距存于ret_dis ret_msg(i,1:chip) = M(index(i),:);ret_dis(i) = D(index(i));enditer = (length(word)-chip*2)/2; %剩余要译出的码字个数for i=1:iter %迭代过程for j=1:6msg_temp1 = [ret_msg(j,1:chip+i-1) 0]; %下一状态出“0”msg_temp2 = [ret_msg(j,1:chip+i-1) 1]; %下一状态出“1”word_temp1 = encode_conv213(msg_temp1);%下一状态为“0”时的编码word_temp2 = encode_conv213(msg_temp2);%下一状态为“1”时的编码dis_temp1 = hamming_distance(word_temp1,word(1:chip*2+2*i));dis_temp2 = hamming_distance(word_temp2,word(1:chip*2+2*i)); %算两种汉明距if (dis_temp1<dis_temp2)ret_msg(j,1:chip+i) = msg_temp1;ret_dis(j) = dis_temp1;elseret_msg(j,1:chip+i) = msg_temp2;ret_dis(j) = dis_temp2;%选择较小汉明距的状态储存并输出在ret_msg中,最小汉明距存于ret_disendendend[val,index] = sort(ret_dis); %把最终选择的6种最小汉明距按从小到大排列msg =ret_msg(index(1),:); %选出维特比译码最小的距离所译出的信息六、实验数据记录及分析(包括源程序清单及运行结果):。

Matlab的卷积码译码器的设计与仿真

Matlab的卷积码译码器的设计与仿真540802 112008111郭林《基于Matlab的卷积码译码器的设计与仿真》第1页共17页Matlab**本课程设计主要解决对一个输入信号进行卷积码编码,以及维特比(Viterbi)译码输出,并通过Matlab软件进行设计与仿真,并进行误码率分析。

程序设计与仿真均采用Matlab R2007a(7.4),最后仿真详单与理论分析一致。

卷积码编码器;卷积码译码器;Matlab;设计与仿真1本课程设计主要解决对一个信号进行信道编解码,采用卷积码编码,维特比(Viterbi)译码输出,并通过Matlab软件进行设计与仿真。

卷积码的译码有两种方法——软判决和硬判决,此课程设计采用硬判决的维特比译码。

1.1卷积码是一种向前纠错控制编码。

它将连续的信息比特序列映射为连续的编码器输出符号。

这种映射是高度结构化的,使得卷积码的译码方法与分组码译码所采用的方法完全不同。

可以验证的是在同样复杂度情况下,卷积码的编码增益要大于分组码的编码增益。

对于某个特定的应用,采用分组编码还是采用卷积编码哪一种更好则取决于这一应用的具体情况和进行比较时可用的技术。

本课程设计便是通过Matlab,构造了一个卷积码编码后,通过产生加性高斯白噪声的信道,再进行译码的过程,译码后计算误码率,并进行分析。

郭林《基于Matlab的卷积码译码器的设计与仿真》第2页共17页 1.2 2卷积码,又称连环码,是由伊莱亚斯(P.elias)于1955年提出来的一种非分组码。

卷积编码的最佳译码准则为:在给定已知编码结构、信道特性和接收序列的情况下,译码器将把与已经发送的序列最相似的序列作为传送的码字序列的估值。

对于二进制对称信道,最相似传送序列就是在汉明距离上与接收序列最近的序列。

卷积码的译码方法有两大类:一类是大数逻辑译码,又称门限译码(硬判决,编者注);另一种是概率译码(软判决,编者注),概率译码又分为维特比译码和序列译码两种。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

%survivor state是一个矩阵,它显T了通过网格的最优路径,这个矩阵通过一个单独的函数metric(x,y)给出。 %其中G是一个矩阵,它的任一行决定了从移位寄存器到模2加法器的连接方式.为生成矩阵 %这里,我们做了一个简单的(2,1,7)卷积码编码器。 k=1; G=[1 0 1 1 0 1 1;1 1 1 1 0 0 1];%G1=133,G2=171 %以下3种输入序列,可任选一种% %input=[0 0 0 0 0 0 0];%全0输入 %input=[1 1 1 1 1 1 1];%全1输入 input=[round(rand(1,7)*1)];%随机系列输入,也可用 randint(1,7,[0 1]) figure;plot(input,'*r') %figure1:画图:目标input,红色(red,r),形状为* s=input; g1=G(1,:); g2=G(2,:); c1=conv(s,g1);%作卷积 %disp(c1); c2=conv(s,g2); %disp(c2); n=length(c1);%7位输入时n=13 c=zeros(1,2*n);%生成全0矩阵,1*26 %disp(c); for i=1:n c(2*i-1)=c1(i);c(2*i)=c2(i);%两个模2加法器分别输出卷积结果序列后,由旋转开关读取的结果(此时仅为卷积结果,非2进制0/1) end for i=1:2*n if(mod(c(i),2)==0)% mod(c(i),2)==0意思:c(i)除以2,余数为0 c(i)=0; else c(i)=1; end end output=c; channel_output=output;%输出矩阵 %disp(channel_output); figure;plot(output,'*b') %画图:目标:卷积码编码输出,蓝色(blue,b)* %————————————————以上为编码部分,以下为维特比译码———————————————— n=size(G,1);%取矩阵G的行数,故n=2。即得到输出端口,即2个模2加法器 %检验G的维数 if rem(size(G,2),k)~=0 %当矩阵G的列数不为k的整数倍时,rem为求余函数 error('Size of G and k do not agree')%报错 end if rem(size(channel_output,2),n)~=0 %当输出矩阵的列数不是输出端口n的整数倍时。(注:size(channel_output,2)=26,2个模2加法器合成的输出) error('channle output not of the right size') end L=size(G,2)/k;%得出移位数,即寄存器个数,此例程为7 %由于L-1个寄存器的状态即可表示出输出状态,所以总的状态数number_of_states可由前L-1个寄存器的状态组合来确定 number_of_states=2^((L-1)*k);%此例程中2^6,移位寄存器组的状态数为64个 %产生状态转移矩阵,输出矩阵和输入矩阵 for j=0:number_of_states-1 %表示当前寄存器组的状态。因状态从0开始,所以循环为从0到number_of_states-1 for t=0:2^k-1 %k位输入端的信号组成的状态,总的状态数为2^k,所以循环为从0到2^k-1 [next_state,memory_contents]=nxt_stat(j,t,L,k);%nxt_stat完成从当前的状态和输入的矢量得出下寄存器组的一个状态 input(j+1,next_state+1)=t;%input数组值是用于记录当前状态到下一个状态所要的输入信号矢量 %input数组的维数:一维坐标x=j+1指当前状态的值,二维坐标y=next_state+1指下一个状态的值 %由于Matlab中数组的下标是从1开始的,而状态值是从0开始的,所以以上坐标值为:状态值+1 branch_output=rem(memory_contents*G',2);%branch_output用于记录在状态j下输入1时的输出 nextstate(j+1,t+1)=next_state;%nextstate状态转移矩阵,记录了当前状态j下输入1时的下一个状态 output(j+1,t+1)=bin2deci(branch_output);%output记录了当前状态j下输入1时的输出(十进制) end end input; state_metric=zeros(number_of_states,2);%state_metric数组用于记录译码过程在每个状态时的汉明距离,大小为number_of_states,2 %(:,1)为当前状态位置的汉明距离,为确定值;(:,2)为当前状态加输入得到的下一个状态汉明距离,为临时值 depth_of_trellis=length(channel_output)/n;%depth_of_trellis用于记录网格图的深度 channel_output_matrix=reshape(channel_output,n,depth_of_trellis);%channel_output_matrix为输出矩阵,每一列为一个输出状态 %reshape改变原矩阵形状,将channel_output矩阵变为n行depth_of_trellis列矩阵 survivor_state=zeros(number_of_states,depth_of_trellis+1);%survivor_state描述译码过程中在网格图中的路径 [row_survivor col_survivor]=size(survivor_state); %开始非尾信道输出的解码 %i为段,j为何一阶段的状态,t为输入 for i=1:depth_of_trellis-L+1 %i指示网格图的深度 flag=zeros(1,number_of_states);%flag矩阵用于记录网格图中的某一列是否被访问过 if i<=L step=2^((L-i)*k);%在网格图的开始处,并非所有的状态都取到 else %用step来说明这个变化 step=1; %状态数从1到2到4,直到number_of_states end for j=0:step:number_of_states-1 %j表示寄存器的当前状态 for t=0:2^k-1 %t为当前的输入 branch_metric=0; %用于记录码间距离 binary_output=deci2bin(output(j+1,t+1),n);%将当前状态下输入状态t时的输出output转为n位2进制,以便计算码间距离。(说明:数组坐标大小变化同上) for tt=1:n %计算实际的输出码同网格图中此格某种输出的码间距离

branch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt)); end %选择码间距离较小的路径,即当下一个状态没有被访问时就直接赋值,否则,用比它小的将其覆盖 if ((state_metric(nextstate(j+1,t+1)+1,2)>state_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,t+1)+1)==0)

state_metric(nextstate(j+1,t+1)+1,2)=state_metric(j+1,1)+branch_metric;%下一状态的汉明距离(临时值)=当前状态的汉明距离(确定值)+码间距离

survivor_state(nextstate(j+1,t+1)+1,i+1)=j;%survivor_state数组的一维坐标为下一个状态值,二维坐标为此状态 %在网格图中的列位置,记录的数值为当前状态,这样就可以从网格中某位置的 %某个状态得出其对应上一个列位置的状态,从而能很方便的完成译码过程。 flag(nextstate(j+1,t+1)+1)=1;%指示该状态已被访问过 end end end state_metric=state_metric(:,2:-1:1);%移动state_metric,将临时值移为确定值 end %开始尾信道输出的解码 for i=depth_of_trellis-L+2:depth_of_trellis flag=zeros(1,number_of_states); %状态数从number_of_states→number_of_states/2→……→2→1 %程序说明同上,只不过输入矢量只为0 last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k)); for j=0:last_stop-1 branch_metric=0; binary_output=deci2bin(output(j+1,1),n); for tt=1:n

branch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt)); end if ((state_metric(nextstate(j+1,1)+1,2)>state_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,1)+1)==0)

state_metric(nextstate(j+1,1)+1,2)=state_metric(j+1,1)+branch_metric; survivor_state(nextstate(j+1,1)+1,i+1)=j; flag(nextstate(j+1,1)+1)=1; end end state_metric=state_metric(:,2:-1:1); end %从最优路径产生解码输出 %译码过程可从数组survivor_state的最后一个位置逐级向前译码 %由段得到状态序列,再由状序列从input矩阵中得到该段的输出 %数组survivor_state的最后的输出状态肯定为“0” state_sequence=zeros(1,depth_of_trellis+1); size(state_sequence); state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1); %逐级译码过程 for i=1:depth_of_trellis state_sequence(1,depth_of_trellis-i+1)=survivor_state((state_sequence(1,depth_of_trellis+2-i)+1),depth_of_trellis-i+2);%由后向前 end state_sequence; decoder_output_matrix=zeros(k,depth_of_trellis-L+1); for i=1:depth_of_trellis-L+1

相关文档
最新文档