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.
卷积码编译码matlab仿真
一、概述卷积码是一种常用的编码技术,用于提高数字通信系统的可靠性和抗干扰能力。
而编码的解码过程则需要运用编译码技术,以恢复原始数据。
Matlab作为一种强大的工程仿真软件,可以用来对卷积码编译码进行仿真分析,帮助工程师们更好地理解和优化卷积码系统,提高通信系统的性能。
二、卷积码原理1. 卷积码的概念卷积码是一种线性块码,它采用移位寄存器和模2加法器进行编码,通过引入冗余比特来提高信号的可靠性。
卷积码的编码过程可以简单描述为:将输入信息数据与特定的生成多项式进行卷积运算,得到编码后的输出数据。
2. 卷积码的特点卷积码具有较高的编码效率和能够很好地控制码长、纠错能力等特性,因此在实际通信系统中得到广泛应用。
三、编译码原理1. Viterbi算法卷积码的译码过程通常采用Viterbi算法,它是一种最大似然译码算法,通过计算最小距离路径的方式来进行译码。
Viterbi算法能够有效地对卷积码进行解码,提高译码的准确性。
2. 编译码的实现在Matlab中,编译码的实现通常是通过编写一定的程序来模拟Viterbi算法的译码过程。
通过仿真分析,可以评估不同的编码方案对通信系统性能的影响。
四、Matlab仿真环境1. Matlab的特点Matlab作为一种强大的仿真软件,具有丰富的工具和函数库,能够方便地进行数字通信系统设计与仿真分析。
Matlab提供了直观的图形界面和强大的数据处理能力,可用于展示仿真结果和进行数据分析。
2. 使用Matlab进行卷积码编译码仿真在Matlab环境中,可以编写程序来实现卷积码的编码和Viterbi算法的译码过程。
通过调用Matlab中的工具函数和绘图函数,可以直观地展示通信系统的性能指标,并对比不同编码方式的性能差异。
五、仿真实例分析1. 卷积码编码仿真我们可以编写Matlab程序,实现对卷积码的编码过程。
通过模拟不同的编码率和约束长度,可以观察到编码后的效果,并评估编码的性能。
MATLAB实现卷积码编译码
本科生毕业论文(设计)题目:MATLAB实现卷积码编译码专业代码:作者姓名:学号:单位:指导教师:年月日目录前言----------------------------------------------------- 1 1. 纠错码基本理论---------------------------------------- 21.1纠错码基本理论 ----------------------------------------------- 21.1.1纠错码概念 ------------------------------------------------- 21.1.2基本原理和性能参数 ----------------------------------------- 21.2几种常用的纠错码 --------------------------------------------- 62. 卷积码的基本理论-------------------------------------- 82.1卷积码介绍 --------------------------------------------------- 82.1.1卷积码的差错控制原理----------------------------------- 82.2卷积码编码原理 ---------------------------------------------- 102.2.1卷积码解析表示法-------------------------------------- 102.2.2卷积码图形表示法-------------------------------------- 112.3卷积码译码原理---------------------------------------------- 152.3.1卷积码三种译码方式------------------------------------ 152.3.2V ITERBI译码原理---------------------------------------- 163. 卷积码编译码及MATLAB仿真---------------------------- 183.1M ATLAB概述-------------------------------------------------- 183.1.1M ATLAB的特点------------------------------------------ 193.1.2M ATLAB工具箱和内容------------------------------------ 193.2卷积码编码及仿真 -------------------------------------------- 203.2.1编码程序 ---------------------------------------------- 203.3信道传输过程仿真-------------------------------------------- 213.4维特比译码程序及仿真 ---------------------------------------- 223.4.1维特比译码算法解析------------------------------------ 233.4.2V ITERBI译码程序--------------------------------------- 253.4.3 VITERBI译码MATLAB仿真----------------------------------- 283.4.4信噪比对卷积码译码性能的影响 -------------------------- 283.4.5码率对卷积码译码性能的影响 ---------------------------- 303.4.6约束长度对卷积码误码性能的影响------------------------ 313.4.7回溯长度对卷积码误码性能的影响 ------------------------ 323.4.8判决方式对卷积码误码性能的影响------------------------ 324. 结论及展望------------------------------------------ 344.1结论-------------------------------------------------------- 344.2展望 -------------------------------------------------------- 355. 结束语----------------------------------------------- 36参考文献------------------------------------------------ 37致谢---------------------------------------------------- 38附录---------------------------------------------------- 39摘要在数字通信系统中,通常采用差错控制编码来提高系统的可靠性。
_2_1_7_卷积编码及其维特比译码算法的软件实现
第4卷 第6期信息与电子工程Vo1.4,No.6 2006年12月INFORMATION AND ELECTRONIC ENGINEERING Dec.,2006 文章编号:1672-2892 (2006)06-0467-03(2,1,7)卷积编码及其维特比译码算法的软件实现刘少阳,邹永(国防科技大学电子科学与工程学院,湖南长沙 410073)摘要:提出了一种(2,1,7)卷积编码及其维特比(Viterbi)译码的软件实现方案,在Matlab环境中应用软件技术实现了(2,1,7)卷积码的Viterbi译码器功能。
测试证明,该Viterbi译码算法在低信噪比下的误码率仍能达到10-6。
关键词:卷积编码;维特比译码;Matlab中图分类号:TN957.51+3 文献标识码:ASoftware Implementation of (2,1,7) Convolutional Coding andIts Viterbi Decoding AlgorithmLIU Shao-yang,ZOU Yong(School of Electronic Science and Engineering,National University of Defense Technology,Changsha Hunan 410073,China)Abstract: A software scheme of (2,1,7) convolutional coding and Viterbi decoding technology is presented,which implements Viterbi decoder function of (2,1,7) convolutional code in the Matlab.According to the test, the BER(Bit Error Rate)of Viterbi algorithm can still reach 10-6in the lowSNR( Signal-to-Noise Ratio).Key words: convolutional coding;Viterbi decoding;Matlab1 引言卷积码是由Elias于1955年提出的。
matlab维特比译码
维特比(Viterbi)译码是一种用于解码卷积码的算法,常用于通信和数据存储系统。
在MATLAB中实现维特比译码主要涉及以下步骤:定义模型参数:首先,你需要定义卷积码的生成矩阵和转移概率。
初始化路径:为每个可能的起始状态初始化一个路径。
递归计算:对于每个时间步,根据转移概率和接收信号,递归地计算每条路径的概率。
选择最佳路径:在每个时间步,选择具有最大概率的路径作为当前状态。
生成输出:根据最佳路径,生成输出序列。
终止条件:当达到终止状态或达到最大迭代次数时,停止计算。
下面是一个简单的MATLAB代码示例,演示了如何实现维特比译码:matlabfunction [decoded, decoded_path] = viterbi_decoder(received, G, num_states, init_state_prob) % received: 接收信号% G: 生成矩阵% num_states: 状态数% init_state_prob: 初始状态概率num_time_steps = length(received);transition_prob = zeros(num_states, num_states); % 转移概率矩阵% 初始化路径和概率矩阵path = zeros(num_time_steps, num_states);path(:, 1) = init_state_prob;path(:, 1) = path(:, 1) .* ones(size(path(:, 1))); % 设置初始路径prob = zeros(num_time_steps, 1); % 概率矩阵prob(1) = path(1,:) .* log2(init_state_prob); % 初始化概率矩阵% 递归计算for t = 2:num_time_stepsfor i = 1:num_statesfor j = 1:num_statestransition_prob(i,j) = G(:,j) * received(t) .* path(t-1,i); % 计算转移概率endend[~, max_state] = max(prob(t-1) + log2(transition_prob)); % 选择最佳状态path(t,:) = zeros(1, num_states); % 重置路径矩阵path(t, max_state) = 1; % 设置当前路径为最佳状态prob(t) = max_state + log2(prob(t-1) + log2(transition_prob)); % 更新概率矩阵end% 选择最佳路径和生成输出[~, max_time] = max(prob); % 选择具有最大概率的时间步作为终止状态decoded = path(:, max_time); % 生成输出序列end请注意,这只是一个基本的示例,可能需要根据您的具体应用和需求进行调整。
信道编码与译码matlab
信道编码与译码matlab1.引言1.1 概述概述信道编码与译码是信息传输中重要的技术手段之一。
在无线通信系统中,由于信道噪声、干扰和传输损耗等因素的存在,信号在传输过程中容易发生误码。
为了提高传输的可靠性和效率,人们采用信道编码与译码技术来减小误码率,提高系统的性能。
信道编码的主要目标是通过在发送端增加冗余信息,使得接收端能够检测和纠正传输中出现的误码。
它通过在原始数据上附加冗余编码,增加冗余度以提高传输可靠性。
常见的信道编码技术包括前向错误纠正码(FEC)和卷积码等。
译码是信道编码的一个重要环节,它是指接收端根据接收到的编码信息,恢复出原始数据的过程。
译码算法的设计和性能评估对于提高系统的可靠性和效率至关重要。
常见的译码算法包括硬判决译码、软判决译码和迭代译码等。
MATLAB作为一种强大的数学计算和仿真工具,在信道编码与译码中有着广泛的应用。
它提供了丰富的函数库和工具箱,可以实现对不同类型信道编码方案的设计、仿真和性能分析。
通过MATLAB,我们能够方便地研究各种信道编码与译码算法,并对其性能进行评估和优化。
本文将介绍信道编码与译码的基本概念,包括信道编码的原理、应用场景以及常见的编码方案;译码算法的分类和性能评估方法;MATLAB在信道编码与译码中的应用及实现步骤;以及通过实验结果与分析来验证不同编码方案的性能优劣。
最后,我们将总结本文的主要内容,并对未来研究进行展望。
通过本文的阅读,读者将能够全面了解信道编码与译码的基本原理和应用,掌握MATLAB在信道编码与译码中的实现方法,并对不同编码方案的性能进行评估和优化,为无线通信系统的设计和优化提供一定的参考和指导。
文章结构的部分是用来说明本篇文章的组成和安排,以帮助读者更好地理解文章的内容和架构。
本文的结构如下:1. 引言1.1 概述1.2 文章结构- 本节1.3 目的2. 信道编码2.1 信道编码的基本概念2.2 信道编码的应用3. 译码3.1 译码算法的分类3.2 译码性能评估4. 实现与分析4.1 MATLAB在信道编码与译码中的应用4.2 实验结果与分析5. 结论5.1 总结5.2 对未来研究的展望引言部分提供了本文研究领域的概述、文章结构和目的。
维特比译码的仿真与实现
卷积码的码率越高 ,约束长度越大 ,所需维特比 译码的回溯长度也越长 。我们仍然就上面提出的那 个系统进行 Matlab 仿真 ,在回溯深度为 24 ,48 ,96 时分别观察其误码率曲线 (如图 2) 。可以看出回溯 深度对系统误码率的影响没有判决方式那么严重 ,但 是在误码率为 10 - 3时回溯深度为 24 的情况下所需信 噪比比 48 的情况下大约013 dB左右 ,这也是不可忽 略的 。但是回溯深度为 96 或者更长时相对于回溯深
了广泛地应用 。 本文首先使用 Matlab 分析了在无线高斯信道
中 ,对于维特比译码采用硬判决 、2 比特 、3 比特 、4 比特及 5 比特时的系统性能进行分析比较 ,同时也 分析了在回溯深度分别为 24 、48 和 96 时的系统性 能 ,得出结论 :在 3 比特软判决及回溯深度为 48 时 , 系统的性能达到最佳 。基于这些结论 ,用 Q1900 芯 片来实现卷积编码和维特比译码 ,其性能与仿真结 论一致 。
1 引 言
在无线通信系统中 ,为克服数据传输错误 ,需要 进行差错控制编码 。卷积编码是一种很好的纠错编 码方法 。它充分利用了各组之间的相关性 ,增加的 监督元不仅与本组的信息元有关 ,而且与前面若干 组的信息数字发生关系 ,这就是卷积码的基本想法 。 由于每个校验数字与更多的信息数字有关 ,无论从 理论上还是实际上均已证明其性能优于分组码 。与 卷积码相应的维特比译码算法是加性高斯白噪声 (additive white gaussian noise ,AW GN) 信道下卷积 码的最优译码算法 ,在数据通信和卫星通信中得到
第9章 Viterbi译码及其实现
“黑色经典”系列之《DSP嵌入式系统开发典型案例》第9章Viterbi译码及其实现华清远见<ARM开发培训班>培训教材在通信系统中,信息传输的可靠性和有效性是相当重要的。
信息在传输时是经由信道(Channel)传输。
当其在信道传输过程中会受到各种干扰,使得传输信息掺杂各种错误序列在其中。
因此,在通信系统中,良好的纠错码可以有效地应用在信息传输过程中,以降低信息的误码率。
信息在传输时,先由信源发出消息,如语言、图像、文字等,消息进入通信系统后,经由信源编码器编码成信息序列1。
编码过程中,为了使传输有效,还加上一些与传输信息无关的冗余度。
接着信息序列1经过信道编码器编码成信息序列2,序列2是将信息序列1加入了更多的冗余数据(Redundancy Data),以抵抗信道中的各种干扰。
数字信号一般不适合直接在信道上传输,所以调制器是将数字信号转变成模拟信号,使其在信道中传输。
而信道中难免会受到噪声干扰,使信道的输出序列不同于信道的输入序列。
解调器将信道的输出序列由原来的模拟信号转化成数字信号,既是接收序列3,信息序列中因噪声干扰会掺杂一些错误的码元在其中。
信道译码器利用序列中的冗余码元去纠正错误,并且根据信道译码器的结果,产生接近于信息序列1的接收序列1。
整个译码过程是根据信道编码的结果和噪声在信道中的特性所得到的。
理想的结果是所有的错误都被更正回来,即接收序列等同于发送序列。
9.1 Viterbi译码概述在众多的纠错码中,卷积码(Convolutional Code)是一种在实际中得到广泛应用、性能很好的纠错码。
卷积码是不同于分组码的另一种码,它虽然也是把k个信息比特编成n个比特,但k和n都很小,延时小,特别适宜于以串行形式传输信息。
与分组码不同,卷积码中编码后的n个码元不但与当前段的众个信息码元有关,而且与前面(N−1)段的信息有关,编码过程中相互关联的码元为Nn个。
在编码器复杂程度相同的情况下,卷积码的性能优于分组码。
Viterbi译码器逻辑设计及Verilog实现
Viterbi译码器逻辑设计及Verilog实现向舜然【摘要】本文首先分析了卷积码编码和维特比译码的原理以及影响维特比译码的软判决的概念,然后针对维特比译码进行设计,分别有BMU单元的设计、ACS 单元设计、PMU单元设计、SMU的设计并针对这些模块进行了一些优化。
最后通过分析代码的通用性对代码进行了一些调整。
在实际的代码编写中运用了matlab建立M文件实现卷积码编码和维特比解码的过程,按照matlab的M文件重新建立Verilog模块。
最后通过仿真对比Verilog的输出与M文件的输出来检测代码的正确性。
【期刊名称】《电子制作》【年(卷),期】2015(000)014【总页数】2页(P32-32,33)【关键词】维特比;matlab;Verilog【作者】向舜然【作者单位】重庆城市管理职业学院重庆 401331【正文语种】中文【中图分类】TN911.7通信系统的传输要靠调制解调,但是信号在空间传播过程中,会受到或多或少的干扰,加上本来解调方法的差异,导致信号误码率升高的问题也亟待解决,为了提升频移键控通信系统的,将采用一种编码解码技术来提高通信系统的抗干扰能力、纠错能力。
目前常用的编码技术如:奇偶校验码、二维奇偶校验码、恒比码、正反码、线性分组码、循环码、BCH(Bose Chaudhuri Hocguenghem)码、RS(Reed Solomon)码。
最后要说的是卷积码,是一种非分组码。
卷积码又常常被称作连环码、针对卷积码编码,维特比译码容易用数字电路实现,本文重点研究卷积码编码和维特比解码技术。
卷积码(convolutional code)是一种非分组码,通常适用于向前纠错,在大多数情况下卷积码的性能都要优于分组码,并且运算相对来说更简单。
之所以叫卷积码是因为实际上卷积码编码就是对输入数据进行卷积运算然后再输出数据,这里的卷积运算可能是两路或者多路不同的卷积抽头来相乘的,与卷积码的定义有关,本文设计的是(217)卷积码,因此卷积抽头是固定的两路。
- 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。