Viterbi译码的Matlab实现
基于matlab的信道编码仿真(可编辑)

基于matlab的信道编码仿真(可编辑)基于matlab的信道编码仿真海南大学毕业论文(设计)题目:基于matlab的信道编码仿真学号:姓名:年级:学院:信息科学技术学院系别:电子信息工程专业:电子信息工程指导教师: 完成日期:摘要通信技术的飞速发展,信道编码已经成功地应用于各种通信系统中。
以及各种传输方式对可靠性要求的不断提高,信道编码技术作为抗干扰技术的一种重要的手段,在数字通信技术领域和数字传输系统中显示出越来越重要的作用。
信道编码的目的是为了改善通信系统的传输质量。
由于实际信道存在噪声和干扰,使发送的码字与信道传输后所接收的码字之间存在差异,称这种差异为差错。
一般情况下,信道噪声、干扰越大,码字产生差错的概率也就越大。
本文利用matlab对二进制对称信道BSC,高斯白噪声信道AWGN两种信道的仿真,(7,4)Hamming码对信道的仿真,通过误码率的曲线图来了解信道的编码。
并利用matlab的simulink模块仿真,运用simulink里的卷积码viterbi译码器来对二进制对称信道和高斯白噪声信道的仿真,观察误码率的曲线图来了解2个信道的不同。
关键字:matlab,信道,编码,译码,Simulink。
AbstractWith the rapid development of communication technology, channelcoding has been successfully applied to various communications systems. And a variety of transmission of the continuous improvement ofreliability requirements, anti-jamming channel coding technology as an important means of technology in the field of digital communications technology and digital transmission systems in a more and more important role The purpose of channel coding is to improve the transmissionquality of communications systems. As the actual existence of thechannel noise and interference, the transmitted codewords and channel transmission received after the difference between code words, said this difference is wrong. Under normal circumstances, channel noise, the greater the interference, the code word generated the greater the probability of errorIn this paper, matlab binary symmetric channel BSC, Gaussian white noise channel AWGN two channel simulation, 7,4 Hamming code simulation of the channel, through the bit error rate curve to understand the channel coding. Using matlab to simulink block simulation, using simulink in the viterbi decoder to convolutional codes on the binary symmetric channel and Gaussian white noise channel simulation, observation error rategraphs to understand the two different channelsKeywords: matlab, channel, coding, decoding, Simulink.目录1引言 11.1选题的目的和意义 11.2本选题的理论依据、研究内容 12.信道编码以及其运行环境MATLAB的介绍 2 2.1 信道编码的概念及分类 22.2 信道编码定理及信道编码中所包含的各种码类的简介 22.2.1卷积码 22.2.2线性分组码 32.2.3循环码 32.3 MATLAB语言的简介 42.4 Simulink 53.信道 53.1二进制对称信道(BSC) 53.2二进制删除信道(BEC) 63.3高斯白噪声信道AWGN 64. Hamming码 74.1汉明码 74.2校验方法 74.3汉明码编码 94.3.1汉明码对高斯白噪声信道 94.3.2汉明码对二进制对称信道的仿真 115.卷积码 155.1卷积码定义与原理 155.2维特比译码原理 155.3卷积码译码器对高斯白噪声信道的设计与仿真 18 5.3.1卷积码译码器的设计与仿真 195.3.2简化维特比译码器的仿真 225.3.3卷积码译码器的误码率分析 245.4卷积编码器在二进制对称信道(BSC)中的性能 256.卷积码译码器对二进制对称信道和高斯白噪声信道仿真比较 307.总结 31致谢 32参考文献 33附录1: 34附录2: 37附录3: 40附录4: 411引言1.1选题的目的和意义数字信号在传输中往往由于各种原因,使得在传送的数据流中产生误码,从而使接收端产生图象跳跃、不连续、出现马赛克等现象。
基于C54XDSP的viterbi译码技术

1 引言卷积码的概率码最早始于1961年由Wozencraft提出的序列译码,这是第一个实用的概率译码方法,1963年Fano对序列译码进行改进,提出Fano算法,从而推动了序列译码的实际应用。
1967年Viterbi提出了另一种概率译码算法:Viterbi算法,它是一种最大似然译码算法。
在码的约束比较小时,它比序列译码算法效率更高、速度更快,译码器也较简单。
因而自Viterbi算法提出以来,无论在理论上还是实践上都得到了极其迅速的发展,并广泛应用于各种数据传输系统,特别是卫星通信系统中。
1.1 卷积码的发展卷积码是深度空间通信系统和无线通信系统中常用的一种编码。
卷积码与分组码不同,它的本码组的校验元不仅与本组的信息元有关,而且还与以前各时刻输入至编码器的信息组有关。
在编码过程中,卷积码充分利用了各码字间的相关性,而且它的信息元和校验元也比分组码小,在与分组码同样的码率R和设备复杂性条件下,无论从理论上还是从实践上都证明卷积码的性能至少不比分组码差;而且卷积码在实现最佳译码也较分组码容易。
所以从信道编码定理来看,卷积码是一种非常有前途的码类。
在IS-95.CDMA的无线数字蜂窝标滩中都采用了卷积码;在第三代无线通信系统的蜂窝结构中所采用的Turbo码,也是源自卷积码。
卷积码是由伊利亚斯(P.Elias)发明的一种非分组码。
通常它更适用于前向纠错,因为对于许多实际情况它的性能优于分组码,而且运算简单。
卷积码是一种线性树码,由于该码的输出序列是输入序列和编码器的冲击响应的离散时间卷积,故名卷积码。
其一般结构包括:一个由N段组成的输入移位寄存器,每段k个,共Nk个移位寄存器、一组n个模2和相加器,一个由n级组成的输出移位寄存器。
对应于每段k个比特的输入序列,输出n个比特。
卷积码常记为(n,k,N-1),当k等于1时,N-1就是寄存器的个数。
卷积编码器是由记忆的,即一组信息码元的校验码元不但取决于本组信息元,而且还与前m=N-1组信息码元有关。
viterbi译码算法详解

viterbi译码算法详解Viterbi译码算法是一种常用的序列解码算法,广泛应用于语音识别、自然语言处理、通信等领域。
本文将详细介绍Viterbi译码算法的原理和步骤,以及它的应用。
Viterbi译码算法是一种动态规划算法,用于在给定观测序列的情况下,求解最可能的隐藏状态序列。
在这个过程中,算法会基于概率模型和观测数据,通过计算每个可能的状态路径的概率,选择概率最大的路径作为输出。
Viterbi译码算法的基本原理是利用动态规划的思想,将问题分解为一系列子问题,并利用子问题的最优解来求解整体问题的最优解。
在Viterbi译码算法中,我们假设隐藏状态的转移概率和观测数据的发射概率已知,然后通过计算每个时刻的最优路径来递推地求解整个序列的最优路径。
具体而言,Viterbi译码算法包括以下步骤:1. 初始化:对于初始时刻t=0,计算每个隐藏状态的初始概率,即P(x0=s)。
2. 递推计算:对于时刻t>0,计算每个隐藏状态的最大概率路径。
假设在时刻t-1,每个隐藏状态的最大概率路径已知,则在时刻t,可以通过以下公式计算:P(xt=s) = max(P(xt-1=i) * P(xi=s) * P(ot=s|xi=s))其中,P(xt=s)表示在时刻t,隐藏状态为s的最大概率路径;P(xt-1=i)表示在时刻t-1,隐藏状态为i的最大概率路径;P(xi=s)表示从隐藏状态i转移到隐藏状态s的转移概率;P(ot=s|xi=s)表示在隐藏状态s的情况下,观测到观测值为s的发射概率。
3. 回溯路径:在最后一个时刻T,选择概率最大的隐藏状态作为最终的输出,并通过回溯的方式找到整个序列的最优路径。
通过上述步骤,Viterbi译码算法可以求解出给定观测序列下的最可能的隐藏状态序列。
这个算法的时间复杂度为O(N^2T),其中N 是隐藏状态的个数,T是观测序列的长度。
Viterbi译码算法在实际应用中有着广泛的应用。
viterbi译码的matlab实现

然选择对象的网格图上的路径,即,如果有两条路径到达同一状态,则
具有最佳量度的路径被选中,称为幸存路径( sur vi vi n g pa t h) 。对所有 状态都将进行这样的选路操作,译码器不断在网格图上深入,通过去除
可能 性最 小的 路径 实现判 决。 较早 士也抛 弃不 可能 的路 径刚氏 了译 码器 的
lI
如
~0。
·
、、
e {O- ● d_11 o
啦l 畔尊帅 ■魔比较
· ·\, 、
●
●
譬=∽
图2幸存路径选 择
在译码过程的每—步,到达每个状态的可能路径总有两条,通过 比较路径量度舍弃其中一条。图e 给出了译码过程的下—步:在时刻t 。 到达各个状态的路径都有两条,其中一条被舍弃:图f 是时刻t 。的幸存 路径。注意,此例中尚不能对第二位输入数据比特做出判决,因为在时 刻t 2离开状态10的路径仍为两条。图g中的时刻t 。同样有路径合并, 图h是时刻t 6的幸存路径,可见编码器输出的第二位译码比特是1,对 应了时刻t 2 和t 。之间的幸存路径。译码器在网格图上继续上述过程, 通过不断舍弃嘣圣直至仅剩一条,来对输入数据比特做出判决。
里, G=g,k=kO,c hannel —out put =out put o用Mat l a b函 得到 的 译码 输出 为10011100110000111, 这与 我们 经过 理论 分析 得出 的 结果是一致的。
我们用s ubpl ot 函 将译码器最 终的输出结果与( 下转第261页)
应用科技
在的0.94左右。 电流变化显示: 对东曲选煤厂8个低压配电室,配皂12 台变压器装设了补偿后,
平 均每 台变 压 器的 二次 侧总 电 流比 原来 刚 氏25 %左 右。
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 ------------------------------------------------------%%。
通信系统中Viterbi译码的Matlab仿真与实现

在现代通信 中, 信源 、 信宿和信道是组成通信系统 的最基本单元。其中信源是产生信息的源 , 信宿是信息 的 目的地, 信道则是传送载荷信息的信号所通 过的通 道, 信源和信宿之间是通过信道连接的¨ J 。 。通常从两 方 面来衡 量通信 系统的性 能指标 : 数量 和质 量 。一 般数
摘
要
数 字通信 作为一种前向纠错编码技 术卷积码起 着重要的作用 。相应地 ,信 息接 收端对卷积码 的译码 实现
也提 出了更高的要 求。文 中提 出的卷积码译码 Ma a 真方案 ,旨在用 Vt b 译码 实现对卷积码 译码的功能。仿 真结 tb仿 l i ri e 果表 明,维特 比是 一种 良好 的译码方式 。
量 指标用 有效性度 量 , 而质量 指标 用可靠 性度 量 。前者 主要取决 于信源 的统计特 I 而后 者主要 取决 于信 道 的 生, 统 计特性 。在信道 中传输数 字信 号 , 一般 要求信 源 端把 信息 转换成 电信号 , 用尽量低 速率 的二进 制数 字 信号 并
长度为 k的一个个分组 , 在某一 时刻 的编码输 出不 仅取 决于本 时刻的分组 而且 取 决于本 时刻 以前 的 ( N一1 个 ) 分组 , 这种距 离性决定 了卷积码潜在 的纠错能力 ] 。 下面 以参数 ( ,, ) 2 17 的卷 积码 为 例说 明卷 积 码编
a 叶技22 第2卷 3 0年 5 第 期 1
卷积码的维特比译码原理及仿真
卷积码的维特比译码原理及仿真摘 要 本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通过Matlab 软件进行设计与仿真,并进行误码率分析。
实验原理QPSK :QPSK 是英文QuadraturePhaseShiftKeying 的缩略语简称,意为正交相移键控,是一种数字调制方式。
四相相移键控信号简称“QPSK ”。
它分为绝对相移和相对相移两种。
卷积码:又称连环码,是由伊莱亚斯(P.elias)于1955年提出来的一种非分组码。
积码将k 个信息比特编成n 个比特,但k 和n 通常很小,特别适合以串行形式进行传输,时延小。
卷积码是在一个滑动的数据比特序列上进行模2和操作,从而生成一个比特码流。
卷积码和分组码的根本区别在于,它不是把信息序列分组后再进行单独编码,而是由连续输入的信息序列得到连续输出的已编码序列。
卷积码具有误码纠错的能力,首先被引入卫星和太空的通信中。
NASA 标准(2,1,6)卷积码生成多项式为: 346134562()1()1g D D D D D g D D D D D=++++=++++其卷积编码器为:图1.1 K=7,码率为1/2的卷积码编码器维特比译码:采用概率译码的基本思想是:把已接收序列与所有可能的发送序列做比较,选择其中码距最小的一个序列作为发送序列。
如果接收到L 组信息比特,每个符号包括v 个比特。
接收到的Lv 比特序列与2L 条路径进行比较,汉明距离最近的那一条路径被选择为最有可能被传输的路劲。
当L 较大时,使得译码器难以实现。
维特比算法则对上述概率译码做了简化,以至成为了一种实用化的概率算法。
它并不是在网格图上一次比较所有可能的2kL 条路径(序列),而是接收一段,计算和比较一段,选择一段最大似然可能的码段,从而达到整个码序列是一个最大似然值得序列。
下面以图2.1的(2,1,3)卷积码编码器所编出的码为例,来说明维特比解码的方法和运作过程。
卷积编码与解码的MATLAB实现及性能分析
积编码与解码的MATLAB实现及性能分析摘要本课程设计主要解决通信系统中卷积编码与解码技术在Matlab中实现以及对其性能进行分析。
用贝努利二进制序列产生器作为信号源,产生基带信号,对其中的卷积进行编码,调制解调,然后采用Viterbi译码输出,最后计算误码率,对其性能进行分析。
关键词卷积码;卷积编码器;Viterbi译码器;BSK调制与解调;约束长度。
目录1引言 (4)1.1课程设计的目的 (4)1.2 课程设计的基本任务和要求 (4)1.2.1本次课程设计的基本任务 (4)1.2.2课程设计中的要求 (5)1.3设计平台 (5)2设计原理 (5)2.1卷积码的基本概念 (5)2.2卷积码的编码 (5)2.2.1卷积编码 (5)2.2.2卷积码的树状图 (6)2.2.3卷积码的网格图 (7)2.2.4卷积码的状态图 (8)2.3卷积码的解码 (8)3卷积码的仿真与性能分析 (9)3.1 卷积码的仿真 (9)3.1.1卷积码的设计框图 (9)3.1.2Simulink仿真模块的参数设置 (9)3.2 卷积码的波形输出 (15)3.2.1输入信号波形 (15)3.2.2输入信号与解码输出波形 (16)3.3卷积码的性能分析 (17)4出现的问题及解决方法 (19)5 结束语 (19)6参考文献 (20)1 引言本课程设计主要解决基于Matlab的Simulink下的模块对卷积编码与解码进行仿。
通过仿真可以更清楚的认识到卷积码的编码与解码的各个环节,并对仿真结果进行分析。
得出Viterbi译码的误码率性能和约束长度的关系。
1.1课程设计目的卷积码,又称连环码,是由伊莱亚斯(P.elias)于1955年提出来的一种非分组码[4]。
卷积码是一种向前纠错控制编码。
它将连续的信息比特序列映射为连续的编码器输出符号。
这种映射是高度结构化的,使得卷积码的译码方法与分组码译码所采用的方法完全不同。
可以验证的是在同样复杂度情况下,卷积码的编码增益要大于分组码的编码增益。
matlab卷积编码与viterbi译码的实现
matlab卷积编码与viterbi译码的实现MATLAB中viterbi译码算法讨论⼤家可以再评论区交流!!!MATLAB中实现viterbi译码的函数为:convenc其中:code = convenc(msg,trellis)vitdec其中:vitdec(code,trellis,tblen,opmode,dectype)code卷积编码,trellis⽹格表,tblen回溯长度,opmode:cont、term、trunc,dectype:unquant、hard、soft;本⼈最近在做⼀个关于viterbi译码算法,最终在FPGA中实现,在FPGA中最终的实现⽅案为xillinx IP核实现。
在此之前⽤MATLAB进⾏仿真验证。
matlab程序:Tre = poly2trellis(7,[133 171]);通过poly2trellis⽣成逻辑关系图,如下图所⽰。
逻辑关系图%卷积编码:msg = [0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1];code = convenc(msg,Tre);%code = [0,0,1,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,0,0,1,1,0,1,0,1,1,1,1,0];%这是通过convenc函数⽣成的卷积码%vitdec译码:%在vitdec译码过程中采⽤硬判决,通过不同的tblen和opmode来找出其中关系。
%(1) opmode = conttblen = 12;msg_dat = vitdec(code,Tre,tblen,'cont','hard');%msg_dat =[ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 ];%通过了解到cont模式中,vitdec译码会有延迟,延迟的长度为tblen长度,所以在此对vitdec进⾏修改code_temp = [code,zeros(1,24)];msg_temp = vitdec(code_temp ,T,12,'cont','hard')msg_dat = msg_temp(13:end);%msg_dat = [ 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1];%此时vitdec译码出来的数据和信源⼀样tblen = 18;code_temp = [code,zeros(1,24)];msg_temp = vitdec(code_temp ,T,12,'cont','hard')msg_dat = msg_temp(13:end);%msg_dat = [ 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0];%此时vitdec译码出来的数据和信源在后⾯最后⼀位不⼀样%(2) opmode = termtblen = 12;msg_dat = vitdec(code,Tre,tblen,'term','hard');%msg_dat = [0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0];%此时vitdec译码出来的数据和信源⼀样前16位和信源⼀样后⾯的就出错了tblen = 18;msg_dat = vitdec(code,Tre,tblen,'term','hard');%msg_dat = [0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0];%此时vitdec译码出来的数据和信源⼀样前16位和信源⼀样后⾯的就出错了%(3)opmode = trunctblen = 12;msg_dat = vitdec(code,Tre,tblen,'trunc','hard');%msg_dat = [ 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1];%此时vitdec译码出来的数据和信源⼀样tblen = 18;msg_dat = vitdec(code,Tre,tblen,'trunc','hard');%msg_dat = [ 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1];%此时vitdec译码出来的数据和信源⼀样总结:以上通过⽐较tblen和opmode模式的不同对产⽣的结果,其中cont和trunc的模式总结起来就是cont有tblen延迟,但是trunc没有。
卷积码编码器及Viterbi译码器的设计
1.
卷积码是一种性能优越的信道编码。(n ,k ,N) 表示把 k 个信息比特编成 n 个比特,N 为编码约束长度,说明编码过程中互相约束的码段个数。卷积码编码后的 n 个码元不仅与当前组的 k 个信息比特有关,而且与前 N - 1 个输入组的信息比特有关。编码过程中相互关联的码元有 N ×n 个。R = k/ n 是卷积码 的码率,码率和约束长度是衡量卷积码的两个重要参数。 卷积码的编码描述方式有很多种:冲激响应描述法、生成矩阵描述法、多项式乘积描述法、状态图描述,树图描述,网格图描述等。卷积码的纠错能力随着 N 的增加而增大,而差错率随着 N 的增加而指数下降。在编码器复杂性相同的情况下,卷积码的性能优于分组码。分组码的译码算法可以由其代数特性得到。卷积码虽然可以采用适用于分组码的门限译码(即大数逻辑译码),但性能不如维特比译码和序列译码[5]。
Abstract:This course design mainly resolves to a convolutional code sequence for Viterbi Viterbi decoding output, and through the Matlab software to carry on the design and simulation, and analysis of bit error rate. In curriculum design, system development platform for Windows Vista Ultimate, program design and simulation using Matlab R2007a(7.4), and finally the simulation list is consistent with theoretical analysis.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010年12月(上)
Viterbi 译码的Matlab 实现
张慧
(盐城卫生职业技术学院,江苏盐城
224006)
[摘要]本文主要介绍了Viterbi 译码是一种最大似然译码算法,是卷积编码的最佳译码算法。
本文主要是以(2,1,2)卷积码为例,介
绍了Viterbi 译码的原理和过程,并用Matlab 进行仿真。
[关键词]卷积码;Viterbi 译码
1卷积码的类型
卷积码的译码基本上可划分为两大类型:代数译码和概率译码,其中概率译码是实际中最常采用的卷积码译码方法。
2Viterbi 译码
Viterbi 译码是由Viterbi 在1967年提出的一种概率译码,其实质是最大似然译码,是卷积码的最佳译码算法。
它利用编码网格图的特殊结构,降低了计算的复杂性。
该算法考虑的是,去除不可能成为最大似然选择对象的网格图上的路径,即,如果有两条路径到达同一状态,则具有最佳量度的路径被选中,称为幸存路径(
surviving path )。
对所有状态都将进行这样的选路操作,译码器不断在网格图上深入,通过去除可能性最小的路径实现判决。
较早地抛弃不可能的路径降低了译码器的复杂性。
为了更具体的理解Viterbi 译码的过程,我们以(2,1,2)卷积码为例,为简化讨论,假设信道为BSC 信道。
译码过程的前几步如下:假定输入数据序列m ,码字U ,接收序列Z ,如图1所示,并假设译码器确知网格图的初始状态。
图1
时刻t 1接收到的码元是11,从状态00出发只有两种状态转移方向,00和10,如图a 所示。
状态转换的分支量度是2;状态转换的分支径量度是0。
时刻t 2从每个状态出发都有两种可能的分支,如图b 所示。
这些分支的累积量度标识为状态量度┎a ,┎b ,┎c ,┎d ,与各自的结束状态相对应。
同样地,图c 中时刻t 3从每个状态出发都有两个分支,因此,时刻时到达每个状态的路径都有两条,这两条路径中,累积路径量度较大的将被舍弃。
如果这两条路径的路径量度恰好相等,则任意舍弃其中一条路径。
到各个状态的幸存路径如图d 所示。
译码过程进行到此时,时刻t 1和t 2之间仅有一条幸存路径,称为公共支(com-mon stem )。
因此这时译码器可以判决时刻t 1和t 2之间的状态转移是00→10;因为这个状态转移是由输入比特1产生的,所以译码器输出1作为第一位译码比特。
由此可以看出,用实线表示输入比特0,虚线表示输入比特1,可以为幸存路径译码带来很大的便利。
注意,只有当路径量度计算进行到网格图较深处时,才产生第一位译码比特。
在典型的译码器实现中,这代表了大约是约束长度5倍的译码延迟。
图2幸存路径选择
在译码过程的每—步,到达每个状态的可能路径总有两条,通过比较路径量度舍弃其中一条。
图e 给出了译码过程的下一步:在时刻t 5到达各个状态的路径都有两条,其中一条被舍弃;图f 是时刻t 5的幸存路径。
注意,此例中尚不能对第二位输入数据比特做出判决,因为在时刻t 2离开状态10的路径仍为两条。
图g 中的时刻t 6同样有路径合并,图h 是时刻t 6的幸存路径,可见编码器输出的第二位译码比特是1,对应了时刻t 2和t 3之间的幸存路径。
译码器在网格图上继续上述过程,通过不断舍弃路径直至仅剩一条,来对输入数据比特做出判决。
网格图的删减(通过路径的合并)确保了路径数不会超过状态数。
对于此例的情况,可证明在图b 、d 、f 、h 中,每次删减后都只有4条路径。
而对于未使用维特比算法的最大似然序列彻底比较法,其可能路径数(代表可能序列数)是序列长度的指数函数。
对于分支字长为L 的二进制码字序列,共有2L 种可能的序列。
下面我们用Matlab 函数viterbi (G,k,channel_output )来产生输入序列经Viterbi 译码器得到的输出序列,并将结果与输入卷积码编码器的信息序列进行比较。
在这里,G =g ,k=k0,channel_output=output 。
用Matlab 函数得到的译码输出为10011100110000111,这与我们经过理论分析得出的结果是一致的。
我们用subplot 函数将译码器最终的输出结果与(下转第261页)
250
TECHNOLOGY TREND
(上接第250页)
编码器的输入信息序列画出来,其仿真图如下:
图5-4
从仿真图上可以看出,在无任何干扰的理想状态或纠错范围内(随机干扰数),经过译码后,其输出的结果与输入编码器的信息序列是一致的。
这说明设计的卷积编译码器是符合要求的。
但是当有一连串的
突发差错出现时,译码器的输出就会出错,这时,我们就得考虑对信道进行改造,以降低误码率。
3结语
Viterbi 译码是一种最大似然译码算法,是卷积编码的最佳译码算法。
本文主要是以(
2,1,2)卷积码为例,介绍了Viterbi 译码的原理和过程。
同时指出,尽管差错概率随着约束长度按指数级减小,但是编码状态数以及相应的译码复杂性,都随约束长度呈指数增长,因此要选择合适的约束长度。
[参考文献]
[1]徐超颖,杨国安,石永光,郑南宁.卷积码及其维特比译码算法的软件实现.
西安交通大学学报,2003.
[2]John G.Proakis.数字通信(第三版)(Digital Communications,Third Edition).电子工业出版社,1998.
[3]王新梅,肖国镇.纠错码———原理与方法.西安电子科技大学出版社,2001.[4]徐元欣,王匡,仇佩亮.实现卷积交织的几种实用方法.电路与系统学报.2001.
在的0.94左右。
电流变化显示:
对东曲选煤厂8个低压配电室,配电12台变压器装设了补偿后,平均每台变压器的二次侧总电流比原来降低25%左右。
变压器的二次测电压变化情况:
补偿前,开车时,线电压降为370V~375V 左右;补偿后,开车时,线电压升为380V~385V 左右。
2)从经济效益方面看:
a.装设无功补偿设备后,减少了线路和变配电设备传输的无功功率和视在功率,提高了功率因数,减少了功率损耗和电能损耗。
降低了线路损耗.功率因数由0.78提高到0.94后,线损降低的百分率为31.2%,生产开车时,全厂供电系统需传输功率约为700KW ,在补偿前,线损百分率为5%,补偿后,线损比原来降低31.2%,则线损比原来降低109.2KW ,按每天开时间为20小时计算,则每月节约电能为65520Kwh ,年节约电费为27万元。
b.减少了功率因数调整电费支出
根据有关功率因数调整电费的办法,用户的功率因数低于0.9时要加收电费,高于该值时减收电费。
补偿前,因功率因数低于0.9,受罚多支出电费平均每月为4.5万元,每年多支出电为54万元。
补偿后,功率因数达0.94,按照奖励办法将奖励0.6%,与补偿前相比较,年减少电费支出61.1万元,综上,每年直接创造经济效益87.8万元.
c.减少了供电系统的无功损耗
无功补偿运行以来,大大降低了无功电量。
如广场高压配电室Ⅰ回路,补偿前每月无功电量为558000,补偿后,该回路每月份无功电量为212400,比原来降低了62%。
d.减少了供电设备投资
补偿后,减少了供电设备的负载,因而在一定范围内解决了过载问题,可不办理变配电设备增容手续和更换供电设备,减少了增容改造的费用,从而节省了投资。
5提高功率因素的意义
东曲选煤厂通过低压配电系统集中无功补偿改造,在6KV 侧的功率因数由低于0.8提高到现在的0.94左右,变压器二次侧运行电流降低了25%,使变压器的备用容量得到增加,能够再充分利用。
同时减少了变压器配电线路的功率损失和配电线路的电压损失,有利于异步电动机的运行和安全起动,既满足了上级电业管理部门的安全要求,又节约了电费支出。
实践证明,低压配电系统集中无功补偿改造能够很好地提高电力系统功率因数,是节约电能,保证供电质量和安全运行的有效方法之一。
作者简介:王超,男,1971年5月14日出生于河南省柘城县,本科学历,山西西山煤电(集团)有限责任公司东曲矿选煤厂工程师,研究方向为电器安全运行。
[参考文献]
[1]最新实用电工手册,化学工业出版社,2000.
[2]煤矿电工手册,煤炭工业出版社,1981.[3]矿山供电,山西焦煤编印,2003.
应用科技
261。