MATLAB OFDM卷积编码程序及代码

MATLAB OFDM卷积编码程序及代码
MATLAB OFDM卷积编码程序及代码

%bin22deci.m

function y=bin22deci(x)

%将二进制数转化为十进制数

t=size(x,2);

y=(t-1:-1:0);

y=2.^y;

y=x*y';

%************************end of file***********************************

%comb.m

%AWGN加噪声程序

function[iout,qout]=comb(idata,qdata,attn)

%******************variables*************************

%idata:输入I信道数据

%qdata:输入Q信道数据

%iout输出I信道数据

%qout输出Q信道数据

%attn:由信噪比导致的衰减系数

%******************************************************

iout=randn(1,length(idata)).*attn;

qout=randn(1,length(qdata)).*attn;

iout=iout+idata(1:length(idata));

qout=qout+qdata(1:length(qdata));

%************************end of file***********************************

%crdemapping.m

%数据逆映射载波程序

function[iout,qout]=crdemapping(idata,qdata,fftlen,nd);

%******************variables*************************

%idata:输入I信道的数据

%qdata:输入Q信道的数据

%iout:输出I信道的数据

%qout:输出Q信道的数据

%fftlen:FFT的长度

%nd:OFDM符号数

%*****************************************************

iout(1:26,:)=idata(2:27,:);

qout(1:26,:)=qdata(2:27,:);

iout(27:52,:)=idata(39:64,:);

qout(27:52,:)=qdata(39:64,:);

%********************end of file***************************

%crmapping.m

%数据映射载波程序

function[iout,qout]=crmapping(idata,qdata,fftlen,nd);

%******************variables*************************

%idata:输入I信道的数据

%qdata:输入Q信道的数据

%iout:输出I信道的数据

%qout:输出Q信道的数据

%fftlen:FFT的长度

%nd:OFDM符号数

%*****************************************************

iout=zeros(fftlen,nd);

qout=zeros(fftlen,nd);

iout(2:27,:)=idata(1:26,:);

qout(2:27,:)=qdata(1:26,:);

iout(39:64,:)=idata(27:52,:);

qout(39:64,:)=qdata(27:52,:);

%********************end of file***************************

%deci22bin.m

function y=deci22bin(x,t)

%十进制数x转化为二进制数,二进制数至少表示为t位

y=zeros(size(x,1),t);

for j=1:size(x,1)

i=1;

while x(j)>=0&i<=t

y(j,i)=rem(x(j),2);%x(j)为偶数时,y(j,i)为0;反之为1

x(j)=(x(j)-y(j,i))/2;

i=i+1;

end

y(j,:)=y(j,t:-1:1);%倒序排列

end

%************************end of file***********************************

%giins1.m

%插入保护间隔程序

function[iout,qout]=giins1(idata,qdata,fftlen,gilen,nd);

%******************变量*************************

%idata:输入I信道数据

%qdata:输入Q信道数据

%iout:输出I信道数据

%qout:输出Q信道数据

%fftlen:FFT长度(points)

%gilen:保护间隔长度(points)

%*****************************************************

idata1=reshape(idata,fftlen,nd);

qdata1=reshape(qdata,fftlen,nd);

idata2=[idata1(fftlen-gilen+1:fftlen,:);idata1];

qdata2=[qdata1(fftlen-gilen+1:fftlen,:);qdata1];

iout=reshape(idata2,1,(fftlen+gilen)*nd);

qout=reshape(qdata2,1,(fftlen+gilen)*nd);

%********************end of file***************************

%qpskdemod1.m

%QPSK解调程序

function[demodata]=qpskdemod1(idata,qdata,para,nd,ml)

%******************variables*************************

%idata:输入I信道数据

%qdata:数据Q信道数据

%demodata:解调后数据(para-by-nd matrix)

%para:并行信道数

%nd:符号数

%ml:调制数

%(QPSK->2 16QAM->4)

%*****************************************************

demodata=zeros(para,ml*nd);

demodata((1:para),(1:ml:ml*nd-1))=idata((1:para),(1:nd))>=0; demodata((1:para),(2:ml:ml*nd))=qdata((1:para),(1:nd))>=0;

%************************end of file***********************************

%qpskmod1.m

%QPSK调制程序

function[iout,qout]=qpskmod1(paradata,para,nd,ml)

%******************variables*************************

%paradata:输入数据

%iout:输出数据I

%qout:输出数据Q

%para:并行信道数

%nd:数据数

%ml:调制数

%(QPSK->2 16QAM->4)

%*****************************************************

m2=ml./2;

paradata2=paradata.*2-1;

count2=0;

for jj=1:nd

isi=zeros(para,1);

isq=zeros(para,1);

isi=isi+paradata2((1:para),1+count2);

isq=isq+paradata2((1:para),2+count2);

iout((1:para),jj)=isi;

qout((1:para),jj)=isq;

count2=count2+ml;

end

%********************end of file***************************

%viterbi.m

%viterbi解码程序

function[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output) %[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output)

%其中G是一个n行L*k列矩阵,它的每一行决定了从移位寄存器到输入码字的连接方式.

%survivor_state是一个矩阵,它显示了通过网格的最优路径,这个矩阵通过一个单独

%的函数metric(x,y)给出。

n=size(G,1);

%检验G的维数

if rem(size(G,2),k)~=0

error('Size of G and k do not agree')

end

if rem(size(channel_output,2),n)~=0

error('channle output not of the right size')

end

L=size(G,2)/k;

number_of_states=2^((L-1)*k);

%产生状态转移矩阵,输出矩阵和输入矩阵

for j=0:number_of_states-1

for t=0:2^k-1

[next_state,memory_contents]=nxt_stat(j,t,L,k);

input(j+1,next_state+1)=t;

branch_output=rem(memory_contents*G',2);

nextstate(j+1,t+1)=next_state;

output(j+1,t+1)=bin2deci(branch_output);

end

end

input;

state_metric=zeros(number_of_states,2);

depth_of_trellis=length(channel_output)/n;

channel_output_matrix=reshape(channel_output,n,depth_of_trellis);

survivor_state=zeros(number_of_states,depth_of_trellis+1);

[row_survivor col_survivor]=size(survivor_state);

%开始非尾信道输出的解码

%i为段,j为每一阶段的状态,t为输入

for i=1:depth_of_trellis-L+1

flag=zeros(1,number_of_states);

if i<=L

step=2^((L-i)*k);

else

step=1;

end

for j=0:step:number_of_states-1

for t=0:2^k-1

branch_metric=0;

binary_output=deci2bin(output(j+1,t+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,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;

flag(nextstate(j+1,t+1)+1)=1;

end

end

end

state_metric=state_metric(:,2:-1:1);

end

%开始尾信道输出的解码

for i=depth_of_trellis-L+2:depth_of_trellis

flag=zeros(1,number_of_states);

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

%从最优路径产生解码输出

%由段得到状态序列,再由状序列从input矩阵中得到该段的输出

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

dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);

dec_output_bin=deci2bin(dec_output_deci,k);

decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)';

end

decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));

cumulated_metric=state_metric(1,1);

%************************end of file***********************************

%ofdm1.m

%QPSK调制、AWGN信道下仿真程序

%**********************初始参数***************************

para=52;%并行信道数

fftlen=64;%FFT长度

noc=52;%载波数

nd=6;%每循环中OFDM符号数

ml=2;%调制水平:QPSK

gilen=16;%保护间隔长度(points)

ebn0=2;%信噪比

sr=250000;%OFDM symbol rate(250 ksyombol/s)

br=sr.*ml;%Bit rate per carrier

%**************************主循环部分**************************

nloop=200;%仿真的循环数

noe1=0;%信道解码前错误数据数

nod1=0;%信道解码前传输数据数

noe2=0;%信道解码后错误数据数

nod2=0;%信道解码后传输数据数

%**************************发射机*********************************

for iii=1:nloop

%**************************数据产生**************************** %信源编码

t=[0:pi/25:2*pi];

xx=sin(t);

init=[-1:.1:1];

partition=[-1:.1:.9];

predictor=[0 1];

encode=dpcmenco(xx,init,partition,predictor);

encode2=reshape(encode,51,1);

bin=deci22bin(encode2,6);

recode=reshape(bin,1,306);

%信道编码

k0=1;

G=[1 0 1 1 0 1 1;1 1 1 1 0 0 1];

channelencode=cnv_encd(G,k0,recode);

%******************串并转换***********************

paradata=reshape(channelencode,para,nd*ml);%reshape:内建功能

%**************************QPSK调制***************************** [ich,qch]=qpskmod1(paradata,para,nd,ml);

kmod=1/sqrt(2);%sqrt:内建功能

ich=ich.*kmod;

qch=qch.*kmod;

%数据映射

[ich1,qch1]=crmapping(ich,qch,fftlen,nd);

%*******************IFFT************************

x=ich1+qch1.*i;

y=ifft(x);%ifft:内建功能

ich2=real(y);%real:内建功能(实部)

qch2=imag(y);%imag:内建功能(虚部)

%*********插入保护间隔**********

[ich3,qch3]=giins1(ich2,qch2,fftlen,gilen,nd);

fftlen2=fftlen+gilen;

%------------------衰减计算-----------------------

spow=sum(ich3.^2+qch3.^2)/nd./para;%sum:内建功能

attn=0.5*spow*sr/br*10.^(-ebn0/10);

attn=sqrt(attn);

%---------------AWGN addition---------------

[ich4,qch4]=comb(ich3,qch3,attn);

%******************去除保护间隔*********

[ich5,qch5]=girem1(ich4,qch4,fftlen2,gilen,nd);

%******************FFT******************

rx=ich5+qch5.*i;

ry=fft(rx);

ich6=real(ry);

qch6=imag(ry);

%载波逆映射

[ich7,qch7]=crdemapping(ich6,qch6,fftlen,nd);

%*****************解调*******************

ich7=ich7./kmod;

qch7=qch7./kmod;

[demodata]=qpskdemod1(ich7,qch7,para,nd,ml);

%**************并串转换*****************

demodata1=reshape(demodata,1,para*nd*ml);

%信道解码

[channeldecode]=viterbi(G,k0,demodata1);

%信源解码

reshapechanneldecode=reshape(channeldecode,51,6);

deci=bin22deci(reshapechanneldecode);

redeci=reshape(deci,1,51);

codebook=[-1:.1:5.3];

decode=dpcmdeco(redeci,codebook,predictor);

%**************************比特误码率(BER)**************************** noe10=sum(abs(demodata1-channelencode));

nod10=length(channelencode);

noe20=sum(abs(channeldecode-recode));

nod20=length(recode);

noe1=noe10+noe1;

nod1=nod10+nod1;

noe2=noe20+noe2;

nod2=nod20+nod2;

fprintf('%d\t%e\t%e\n',iii,noe10/nod10,noe20/nod20);

end

ber1=noe1/nod1;

ber2=noe2/nod2;

%**********************输出结果***************************

fprintf('%f\t%e\t%e\t%d\t\n',ebn0,ber1,ber2,nloop);

%************************end of file***********************************

实验四-使用matlab实现卷积的运算

一 实验目的 1、 学习MATLAB 语言的编程方法及熟悉MATLAB 指令; 2、 深刻理解卷积运算,利用离散卷积实现连续卷积运算; 二 实验内容 1、 完成)(1t f 与)(2t f 两函数的卷积运算 其中:)4()()(), ()(221--==-t u t u t f t u e t f t 在一个图形窗口中,画出)(1t f 、)(2t f 以 及卷积结果。要求每个坐标系有标题、坐标轴名称。 p = ; %定义时间间隔 t= 0:p:10; %定义时间向量 f1=exp(-2*t).*u(t); %将f (t )表示出来 f2=u(t)-u(t-4); f=conv(f1,f2); subplot(1,2,1); plot(t,f1,t,f2); title('f1=e^-2t*u(t)'' / ''f2=u(t)-u(t-4)'); xlabel('t(sec)'); % 这行代码是给出x 坐标的标签 ylabel('f(t)'); grid on ; subplot(1,2,2); plot(f); title('f=f1*f2'); xlabel('t(sec)'); % 这行代码是给出x 坐标的标签 ylabel('f') grid on

2、 若系统模型为: )(3)()(4)(4)(' ' ' 't f t f t y t y t y +=++ 其中 )()(t u e t f t -= 求零状态响应,画出波形(函数本身画出一幅图,自己再画出一幅输入波形图)。 零状态响应: a= [1 4 4]; %将y (t )各阶导数的系数放在向量a 中 b= [1 3]; %将f (t )各阶导数的系数放在向量b 中 sys = tf(b, a); %求系统函数sys td = ; %定义时间间隔 t = 0 : td : 10; %定义时间向量 f = exp(-t).*u(t); %将f (t )表示出来 y = lsim(sys, f, t); %求系统的零状态响应y plot(t, y); %绘出零状态响应的波形 xlabel('t(sec)'); % 这行代码是给出x 坐标的标签 ylabel('y(t)'); % 这行代码是给出y 坐标的标签 grid on

卷积码的编解码Matlab仿真

卷积码的编解码Matlab仿真摘要 卷积码是一种性能优越的信道编码。它的编码器和译码器都比较容易实现,同时它具有较强的纠错能力D随着纠错编码理论研究的不断深入,卷积码的实际应用越来越广泛。本文简明地介绍了卷积码的编码原理和译码原理o并在SIMULINK模块设计中,完成了对卷积码的编码和译码以及误比特统计整个过程的模块仿真。最后,通过在仿真过程中分别改变卷积码的重要参数来加深理解卷积码的这些参数对卷积码的误码性能的影响。经过仿真和实测,并对测试结果作了分析。得出了以下三个结论z (1)当改变卷积码的码率时,系统的误码性能也将随之发生变化。 (2)对于码率一定的卷积码,当约束长度N发生变化时,系统的误码性能也会随之发生变化。 (3)回溯长度也会不同程度上地影响误码性能。 关键词:卷积码:码率:约束长度:回溯长度

Simulation and Research on Encoding and Decoding of Convolution Code Abstract Convolution code has a superior performance of the channel code. It is easy to coding and decoding.An d it has a strong ability to correct e盯ors. As correcting coding theory has a long development,the practice of convolution code is more and more extensive.In由1S由esis,the principle of convolution coding and decoding is introduced simply白rstly. Then由e whole simulation module process of encoding,decoding and the Error Rate Calculation is completed in由is design. Finally,in order to understand 由eir performances of error rate,many changes in parameters of convolution code are calculated in the simulation process.Af ter simulation and me皿UTe,an analysis of test results is presented.Th e following由ree conclusions are draw: (l)Wh en the rate of convolution Code ch皿ges,HER performance of the systemwill change. (2) For a certain rate of convolution code,when由ere is a change in the constraint length of N,BER perfonnance of由e system will change. (3) Re位ospec咀ve length will affect BE R. Key words: convolution code; rate; cons缸aint leng由; retrospective length;

matlab实现卷积运算

2、试求下列图片的卷积波形12()()f t f t * 2() f t t 1 -1 1() f t t 1 -1 列出编程步骤: p=0.01; k1=0:p:1; f1=ones(1,length(k1)); k2=-1:p:1; f2= (k2+1).*(k2<0)+(-k2+1).*(k2>=0); [f,k]=sconv(f1,f2,k1,k2,p) function [f,k]=sconv(f1,f2,k1,k2,p) 3、试求下列图片的卷积波形12()()f t f t *

1() f t t 1 0.5- 2() f t t 12 1 p=0.01; k1=-0.5:p:1; f1=ones(1,length(k1)); k2=0:p:2; f2= 0.5*k2; [f,k]=sconv(f1,f2,k1,k2,p) 4、试求下列图片的卷积波形12()()f t f t *

1() f t t 2 2 - 2() f t t 3-2 -3 21 p=0.01; k1=-2:p:2; f1= (k1==-2)+(k1==2); k2=-3:p:3; f2=(k2+3).*(k2<-2)+(-k2-1).*(k2>=-2).*(k2<=-1)+(k2-1).*(k2>=1).*(k2<=2)+(-k2+3).*(k2>2); [f,k]=sconv(f1,f2,k1,k2,p); 5、试求下列图片的卷积波形12()()f t f t *

1() f t t 5 -5 33 -2() f t t 3 -2 -3 21 p=0.01; k1=-10:p:10; f1=(k1>=-5).*(k1<=-3)+(k1>=3).*(k1<=5); k2=-3:p:3; f2=(k2+3).*(k2<-2)+(-k2-1).*(k2>=-2).*(k2<=-1)+(k2-1).*(k2>=1).*(k2<=2)+(-k2+3).*(k2>2); [f,k]=sconv(f1,f2,k1,k2,p);

利用MATLAB实现循环卷积.doc

一、实验目的 1.利用MATLAB 实现循环卷积。 2.比较循环卷积与线性卷积的区别。 二、实验条件 PC 机,MATLAB7.0 三、实验内容 1)循环卷积的定义:两个序列的N 点循环卷积定义为: )0()()()]()([1 0N n m n x m h n x n h N k N N <≤-=?∑-= 利用MATLAB 实现两个序列的循环卷积可以分三个步骤完成: (1)初始化:确定循环点数N ,测量输入2个序列的长度。 (2)循环右移函数:将序列x(n)循环右移,一共移N 次(N 为循环卷积的循环次数),最后将每次循环成的新序列组成一个矩阵V 。 (3)相乘:将x(n)移位后组成的矩阵V 与第二个序列h(n)对应相乘,即得循环卷积结果。程序如下: 程序一: clear;close all ; N=10; x1=[6 15 -6 3 5 7 0 1]; x2=[7 1 2 9 4 3 20 6]; xn1=length(x1); xxn1=0:xn1-1; xn2=length(x2); xxn2=0:xn2-1; subplot(3,1,1); stem(xxn1,x1); subplot(3,1,2); stem(xxn2,x2); x11=fft(x1,N);

x12=fft(x2,N); y11=x11.*x12; y1=ifft(y11,N); subplot(3,1,3); n=0:length(y1)-1; stem(n,y1,'.'); title('循环卷积的结果'); xlabel('n');ylabel('y1(n)'); 运行后所得图形如下: 观察所得的循环卷积结果发现并没有呈现周期性的序列,因此将程序做下列改变。程序二: clear;close all; N=40; x1=[6 15 -6 3 5 7 0 1]; x2=[7 1 2 9 4 3 20 6]; x2=[x2,x2,x2,x2]; xn1=length(x1); xxn1=0:xn1-1; xn2=length(x2); xxn2=0:xn2-1; subplot(3,1,1);

Matlab中卷积码译码器的误码率分析

长沙理工大学 《通信原理》课程设计报告 郭林 学院计算机与通信工程专业通信工程 班级540802 学号11 学生姓名郭林指导教师龙敏 课程成绩完成日期2008年1月11日

基于Matlab的卷积码译码器的 设计与仿真 学生姓名:郭林指导老师:** 摘要本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出, 并通过Matlab软件进行设计与仿真,并进行误码率分析。在课程设计中,系统开发平台为Windows Vista Ultimate,程序设计与仿真均采用Matlab R2007a(7.4),最后仿真详单与理论分析一致。 关键词课程设计;卷积码译码器;Matlab;Simulink;设计与仿真 1引言 本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通 过Matlab软件进行设计与仿真。卷积码的译码有两种方法——软判决和硬判决,此课程设计采用硬判决的维特比译码。 1.1课程设计目的 卷积码是一种向前纠错控制编码。它将连续的信息比特序列映射为连续的编码器输出符号。这种映射是高度结构化的,使得卷积码的译码方法与分组码译码所采用的方法完全不同。可以验证的是在同样复杂度情况下,卷积码的编码增益要大于分组码的编码增益。对于某个特定的应用,采用分组编码还是采用卷积编码哪一种更好则取决于这一应用的具体情况和进行比较时可用的技术[1]。 本课程设计便是通过Matlab设计一个硬判决维特比译码输出的完整电路,并进行误码率分析。

1.2 课程设计的原理 卷积码,又称连环码,是由伊莱亚斯(P.elias)于1955年提出来的一种非分组码。 卷积编码的最佳译码准则为:在给定已知编码结构、信道特性和接收序列的情况下,译码器将把与已经发送的序列最相似的序列作为传送的码字序列的估值。对于二进制对称信道,最相似传送序列就是在汉明距离上与接收序列最近的序列。 卷积码的译码方法有两大类:一类是大数逻辑译码,又称门限译码(硬判决,编者注);另一种是概率译码(软判决,编者注),概率译码又分为维特比译码和序列译码两种。门限译码方法是以分组码理论为基础的,其译码设备简单,速度快,但其误码性能要比概率译码法差[2]。 当卷积码的约束长度不太大时,与序列译码相比,维特比译码器比较简单,计算速度快。维特比译码算法是1967年由Viterbi提出,近年来有大的发展。目前在数字通信的前向纠错系统中用的较多,而且在卫星深空通信中应用更多,该算法在卫星通信中已被采用作为标准技术。 2维特比译码原理 采用概率译码的基本思想是:把已接收序列与所有可能的发送序列做比较,选择其中码距最小的一个序列作为发送序列。如果发送L组信息比特,那么对于(n,k)卷积码来说,可能发送的序列有2kL个,计算机或译码器需存储这些序列并进行比较,以找到码距最小的那个序列。当传信率和信息组数L较大时,使得译码器难以实现。维特比算法则对上述概率译码做了简化,以至成为了一种实用化的概率算法。它并不是在网格图上一次比较所有可能的2kL条路径(序列),而是接收一段,计算和比较一段,选择一段最大似然可能的码段,从而达到整个码序列是一个最大似然值得序列。 下面以图2.1的(2,1,3)卷积码编码器所编出的码为例,来说明维特比解码的方法和运作过程。为了能说明解码过程,这里给出该码的状态图,如图2.2所

Matlab的卷积码译码器的仿真要点

基于Matlab的卷积码译码器的 设计与仿真 学生姓名:指导老师:** 摘要本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出, 并通过Matlab软件进行设计与仿真,并进行误码率分析。在课程设计中,系统开发平台为Windows Vista Ultimate,程序设计与仿真均采用Matlab R2007a(7.4),最后仿真详单与理论分析一致。 关键词课程设计;卷积码译码器;Matlab;Simulink;设计与仿真 1引言 本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通 过Matlab软件进行设计与仿真。卷积码的译码有两种方法——软判决和硬判决,此课程设计采用硬判决的维特比译码。 1.1课程设计目的 卷积码是一种向前纠错控制编码。它将连续的信息比特序列映射为连续的编码器输出符号。这种映射是高度结构化的,使得卷积码的译码方法与分组码译码所采用的方法完全不同。可以验证的是在同样复杂度情况下,卷积码的编码增益要大于分组码的编码增益。对于某个特定的应用,采用分组编码还是采用卷积编码哪一种更好则取决于这一应用的具体情况和进行比较时可用的技术[1]。 本课程设计便是通过Matlab设计一个硬判决维特比译码输出的完整电路,并进行误码率分析。

1.2 课程设计的原理 卷积码,又称连环码,是由伊莱亚斯(P.elias)于1955年提出来的一种非分组码。 卷积编码的最佳译码准则为:在给定已知编码结构、信道特性和接收序列的情况下,译码器将把与已经发送的序列最相似的序列作为传送的码字序列的估值。对于二进制对称信道,最相似传送序列就是在汉明距离上与接收序列最近的序列。 卷积码的译码方法有两大类:一类是大数逻辑译码,又称门限译码(硬判决,编者注);另一种是概率译码(软判决,编者注),概率译码又分为维特比译码和序列译码两种。门限译码方法是以分组码理论为基础的,其译码设备简单,速度快,但其误码性能要比概率译码法差[2]。 当卷积码的约束长度不太大时,与序列译码相比,维特比译码器比较简单,计算速度快。维特比译码算法是1967年由Viterbi提出,近年来有大的发展。目前在数字通信的前向纠错系统中用的较多,而且在卫星深空通信中应用更多,该算法在卫星通信中已被采用作为标准技术。 2维特比译码原理 采用概率译码的基本思想是:把已接收序列与所有可能的发送序列做比较,选择其中码距最小的一个序列作为发送序列。如果发送L组信息比特,那么对于(n,k)卷积码来说,可能发送的序列有2kL个,计算机或译码器需存储这些序列并进行比较,以找到码距最小的那个序列。当传信率和信息组数L较大时,使得译码器难以实现。维特比算法则对上述概率译码做了简化,以至成为了一种实用化的概率算法。它并不是在网格图上一次比较所有可能的2kL条路径(序列),而是接收一段,计算和比较一段,选择一段最大似然可能的码段,从而达到整个码序列是一个最大似然值得序列。 下面以图2.1的(2,1,3)卷积码编码器所编出的码为例,来说明维特比解码的方法和运作过程。为了能说明解码过程,这里给出该码的状态图,如图2.2所

卷积码matlab程序

卷积编码程序: function [output, len_tal] = cnv_encd(secrettext, encodetext) g = [0 0 1 0 0 1 0 0; 0 0 0 0 0 0 0 1; 1 0 0 0 0 0 0 1; 0 1 0 0 1 1 0 1]; k0 = 1; % 读入文本文件并计算文件长度 frr = fopen(secrettext, 'r'); [msg, len] = fread(frr, 'ubit1'); msg = msg'; % check to see if extra zero padding is necessary if rem(length(msg), k0) > 0 msg = [msg, zeros(size(1:k0-rem(length(msg),k0)))]; end n = length(msg)/k0; % 把输入比特按k0分组,n为所得的组数。 % check the size of matrix g if rem(size(g, 2), k0) > 0 error('Error, g is not of the right size.'); end % determine L and n0 L = size(g, 2)/k0; n0 = size(g, 1); % add extra zeros,以保证编码器是从全0开始,并回到全0状态。 u = [zeros(size(1:(L-1)*k0)), msg, zeros(size(1:(L-1)*k0))]; % generate uu, a matrix whose columns are the contents of conv. encoder at % various clock cycles. u1 = u(L*k0: -1 :1); for i = 1:n+L-2 u1 = [u1, u((i+L)*k0:-1:i*k0+1)]; end uu = reshape(u1, L*k0, n+L-1); % determine the output output = reshape(rem(g*uu, 2), 1, n0*(L+n-1)); len_tal = n0*(L + n - 1);

基于MATLAB的卷积码的分析与应用

基于MATLAB的卷积码的分析与应用

毕业设计(论文)任务书

基于MATLAB的卷积码的分析与应用 摘要 随着现代通信的发展,特别是在未来4G通信网络中,高速信息传输和高可靠性传输成为信息传输的两个主要方面,而可靠性尤其重要。因为信道状况的恶劣,信号不可避免会受到干扰而出错。为实现可靠性通信,主要有两种途径:一种是增加发送信号的功率,提高接收端的信号噪声比;另一种是采用编码的方法对信道差错进行控制。前者常常受条件限制,不是所有情况都能采用。因此差错控制编码得到了广泛应用。 介绍了多种信道编码方式,着重介绍了卷积码的编码方法和解码方式。介绍了MATLAB的使用方法、编程方法、语句、变量、函数、矩阵等。介绍了TD-SCDMA通信系统和该系统下的卷积码,搭建了系统通信模型。编写卷积码的编码和解码程序。用MATLAB仿真软件对TD-SCDMA系统的卷积码编解码进行仿真。对其纠正错码性能进行验证,并且对误码率进行仿真和分析。卷积码的编码解码方式有很多,重点仿真Viterbi算法。Viterbi算法就是利用卷积码编码器的格图来计算路径度量,选择从起始时刻到终止时刻的惟一幸存路径作为最大似然路径。沿着最大似然路径回溯到开始时刻,所走过的路径对应的编码输出就是最大似然译码输出序列。它是一种最大似然译码方法,当编码约束长度不大、或者误码率要求不是很高的情况下,Viterbi译码器设备比较简单,计算速度快,因而Viterbi译码器被广泛应用于各种领域。 关键词:卷积码;信道编码;TD-SCDMA;MATLAB

目录 毕业设计(论文)任务书 ............................................................................................I 摘要........................................................................................................................... II Abstract......................................................................................... 错误!未定义书签。第1章绪论 . (1) 1.1课题研究的背景和来源 (1) 1.2主要内容 (2) 第2章相关理论介绍 (3) 2.1信道编码 (3) 2.1.1 信道编码的分类 (3) 2.1.2 编码效率 (3) 2.2线性分组码 (3) 2.3循环码 (5) 2.4卷积码 (6) 2.4.1 卷积码简介 (7) 2.4.2 卷积码的编码 (7) 2.4.3 卷积码的解码 (13) 第3章MATLAB应用 (21) 3.1数和算术的表示方法 (21) 3.2向量与矩阵运算 (21) 3.2.1 通过语句和函数产生 (21) 3.2.2 矩阵操作 (22) 3.3矩阵的基本运算 (22) 3.3.1 矩阵乘法 (22) 3.3.2 矩阵除法 (23) 3.4MATLAB编程 (23) 3.4.1 关系运算 (23) 3.4.2 控制流 (25) 第4章卷积码的设计与仿真 (27) 4.1TD-SCDMA系统 (27) 4.1.1 系统简介 (27) 4.1.2 仿真通信系统模型 (27)

基于Matlab实现线性卷积等

线性卷积与循环卷积 一、作品目的 通过matlab的强大功能展示线性卷积和循环卷积过程中方方面面的计算和变化,让大家对这两种卷积有一个更加完美的认识。 二、概念简介 卷积是一种典型的乘累加运算。 1.线性卷积 线性卷积是对线性移不变(LSI)系统的输入输出关系的描述,体现系统的特性。 线性卷积的表达式为 一般情况,现实的系统为因果系统,有k<0时,恒有h(k)=0,则 若x(n)是一个N点序列,h(n)是一个m点序列,则卷积的结果y(n)将是L=N+M-1点的序列。 2.循环卷积

设x1(n) 和x2(n) 是两个长度为L、M的有限长序列,它们的N 点循环卷积x3(n) 定义为: 注意:其中N>=Max{L,M}如果其中一个序列(或者两个序列)的长度没有所求N点循环卷积的长度长,那在该序列后面补零,直到长度达到N。 三、设计思路及程序 1. 线性卷积: (1)以输入序列x(n)=[5,4,3,2,1],脉冲响应h(n)=[1,1,1,1]为列进行演示。 (2)计算输入序列和脉冲响应的长度。 (3)画出补零后的输入序列和脉冲响应 (4)设计一个循环,在循环中实现反转、位移和计算。并画出反转后的图像变化和卷积图像,将每一次移位结果保存为fig图。(5)最后将上一步所生成的所有fig图合起来生成一张gif图 程序展示: clear; clc; close all; (1)(2)

xn=[5,4,3,2,1]; M=length(xn);%输入任意序列并计算长度M hn=[1,1,1,1]; N=length(hn);%输入任意脉冲响应并计算长度N m=[-(M-1):M+N-2];%设置代换变量的范围以便x(m)翻转和移位(3) xm=[zeros(1,M-1),xn,zeros(1,N-1)];%补零以便与m对应绘图 subplot(2,2,1);stem(m,xm,'r.');%%绘输入序列x(m) ylabel('x(m)'); grid on; title('(a)输入序列x(m)'); hm=[zeros(1,M-1),hn,zeros(1,M-1)];%补零以便与m对应绘图 subplot(2,2,2);stem(m,hm,'r.');%绘脉冲响应 ylabel('h(m)'),grid,title('(b)脉冲响应h(m)');%%加标签网格和标题 yn=zeros(1,2*M+N-2);%卷积输出初始化 (4) for n=0:M+N-2;%逐个计算卷积输出 if n==0; xmfy=[fliplr(xn),zeros(1,M+N-2)];%实现翻转 else for k=M:-1:1;

基于MATLAB对卷积码的性能分析

基于MATLAB对卷积码的性能分析 【摘要】本文对比了在加性高斯白噪声(AWGN)信道下经BPSK调制后的数据不编码与添加卷积编码后接收到的信道输出的误码性能,并通过对比对卷积码性能进行分析。采用MATLAB自编函数对[2,1,8]卷积码以及维特比译码进行仿真,且对其性能进行分析。由于卷积码有性能floor,编码增益随信噪比降低而体现不明显。仿真结果表明:当信噪比等于-1dB时,一个序列通过加性高斯白噪声信道后接收到的信道输出误比特率大于10-1,且该序列运用[2,1,8]卷积码编码,维特比译码(硬判决)后所得的序列误比特率升高。当信噪比为2dB时,一个序列通过加性高斯白噪声信道后接收到的信道输出误比特率约为4*10-2,且该序列运用[2,1,8]卷积码编码,维特比译码后所得的序列误比特率小于10-3,误码率远低于不编码时的误码率。因此卷积码适用于信道输出误码率比较低时候。 【关键词】维特比译码;卷积码;误比特率;马尔科夫性 1.引言 卷积码的编码器是由一个有k位输入、n位输出,且具有m位移位寄存器构成的有限状态的有记忆系统,通常称它为时序网络。[1]编码器的整体约束长度为v,是所有k个移位寄存器的长度之和。具有这样的编码器的卷积码称作[n,k,v]卷积码。对于一个(n,1,v)编码器,约束长度v等于存储级数m。卷积码是由k个信息比特编码成n(n>k)比特的码组,编码出的n比特码组值不仅与当前码字中的k个信息比特值有关,而且与其前面v个码组中的v*k个信息比特值有关。 卷积码有三种译码方式:序列译码、门限译码和概率译码。其中,概率译码根据最大似然译码原理在所有可能路径中求取与接收路径最相似的一条路径,具有最佳的纠错性能,[2]维特比译码是概率译码中极重要的一种方式。 序列译码和门限译码则不一定能找出与接收路径最相似的一条路径。不同于维特比译码,门限译码与序列译码所需的计算量是可变的且对于给定信息分组的最终判决仅仅基于(m+1)个接收分组,而不是基于整个接收序列。[3]与维特比译码所使用的对数似然量度不同,序列译码所使用的量度为Fano量度。在接收序列受扰严重的情况下,序列译码的计算量大于维特比译码所需的固定计算量,虽然序列译码要求的平均计算次数通常小于维特比译码。在采用并行处理的情况下,维特比译码的速度会优于序列译码。在同样码率和存储级数的条件下,门限译码的性能比维特比译码低大约3dB。 维特比译码的数据输出方式有硬判决及软判决两种方式,本文选取生成多项式为561,753的(2,1,8)卷积码对硬判决的性能进行分析,并依据维特比译码的原理以及卷积码的特性,对卷积码编码和维特比译码过程在加性高斯白噪声(AWGN)信道下进行仿真,并且根据仿真结果对维特比译码(硬判决)的结果

MATLAB OFDM卷积编码程序及代码

%bin22deci.m function y=bin22deci(x) %将二进制数转化为十进制数 t=size(x,2); y=(t-1:-1:0); y=2.^y; y=x*y'; %************************end of file*********************************** %comb.m %AWGN加噪声程序 function[iout,qout]=comb(idata,qdata,attn) %******************variables************************* %idata:输入I信道数据 %qdata:输入Q信道数据 %iout输出I信道数据 %qout输出Q信道数据 %attn:由信噪比导致的衰减系数 %****************************************************** iout=randn(1,length(idata)).*attn; qout=randn(1,length(qdata)).*attn; iout=iout+idata(1:length(idata)); qout=qout+qdata(1:length(qdata)); %************************end of file*********************************** %crdemapping.m %数据逆映射载波程序 function[iout,qout]=crdemapping(idata,qdata,fftlen,nd); %******************variables************************* %idata:输入I信道的数据 %qdata:输入Q信道的数据 %iout:输出I信道的数据 %qout:输出Q信道的数据 %fftlen:FFT的长度 %nd:OFDM符号数 %***************************************************** iout(1:26,:)=idata(2:27,:); qout(1:26,:)=qdata(2:27,:); iout(27:52,:)=idata(39:64,:); qout(27:52,:)=qdata(39:64,:); %********************end of file*************************** %crmapping.m

用matlab实现两个离散序列的卷积(不使用conv函数)

作业2.用matlab实现离散序列的卷积. N=14; n=[1:N-1]; f=1/16; signal1=5*sin(2*pi*n/8); figure(1); subplot(3,1,1) stem(n,signal1);title( ' 信号1' );xlabel( 'n' );ylabel( axis([0 15 -6 6]) long_M=5; signal2=ones(1,long_M); subplot(3,1,2) stem(signal2);title( ' 信号2' );xlabel( 'n' );ylabel( axis([0 6 -2 2]); grid on; long_N=length(signal1); fk=zeros(0,long_N+long_M+10); if (long_N>long_M) for k=1:1:long_N+long_M-1 a=0; if (k<=long_N) for i=1:1:k if (i>long_M) fk(k)=a; else fk(k)=a+signal2(i)*signal1(k-i+1); a=fk(k); end end else for i=1:1:k if (k-long_N+i>long_M) fk(k)=a; else fk(k)=a+signal2(k-long_N+i)*signal1(long_N-i+1); a=fk(k); end end end end end subplot(3,1,3) stem(fk);title( ' 卷积函数的实现' );xlabel( 'n' );ylabel( 'y(n)' ); 'y(n)' ); 幅度' );

MATLAB实现卷积码编译码-

本科生毕业论文(设计) 题目:MATLAB实现卷积码编译码 专业代码: 作者姓名: 学号: 单位: 指导教师: 年月日

目录 前言----------------------------------------------------- 1 1. 纠错码基本理论---------------------------------------- 2 1.1纠错码基本理论 ----------------------------------------------- 2 1.1.1纠错码概念 ------------------------------------------------- 2 1.1.2基本原理和性能参数 ----------------------------------------- 2 1.2几种常用的纠错码 --------------------------------------------- 6 2. 卷积码的基本理论-------------------------------------- 8 2.1卷积码介绍 --------------------------------------------------- 8 2.1.1卷积码的差错控制原理----------------------------------- 8 2.2卷积码编码原理 ---------------------------------------------- 10 2.2.1卷积码解析表示法-------------------------------------- 10 2.2.2卷积码图形表示法-------------------------------------- 11 2.3卷积码译码原理---------------------------------------------- 15 2.3.1卷积码三种译码方式------------------------------------ 15 2.3.2V ITERBI译码原理---------------------------------------- 16 3. 卷积码编译码及MATLAB仿真---------------------------- 18 3.1M ATLAB概述-------------------------------------------------- 18 3.1.1M ATLAB的特点------------------------------------------ 19 3.1.2M ATLAB工具箱和内容------------------------------------ 19 3.2卷积码编码及仿真 -------------------------------------------- 20 3.2.1编码程序 ---------------------------------------------- 20 3.3信道传输过程仿真-------------------------------------------- 21 3.4维特比译码程序及仿真 ---------------------------------------- 22 3.4.1维特比译码算法解析------------------------------------ 23 3.4.2V ITERBI译码程序--------------------------------------- 25 3.4.3 VITERBI译码MATLAB仿真----------------------------------- 28 3.4.4信噪比对卷积码译码性能的影响 -------------------------- 28

用MATLAB实现序列圆周卷积

数字信号处理实验报告 实验项目名称:用MATLAB实现序列的圆周卷积 实验日期: 2012-11-28 实验成绩: 实验评定标准: 一、实验目的 通过本实验,掌握一些基本而且重要的离散时间信号,熟悉基本离散时间信号的MATLAB实现方法。 二、实验器材 PC机,MATLAB软件。 三、实验内容 计算两序列x1(n)={1,2,3,4,5},x2(n)={1,2,3,4,5,4,3,2,1}的圆周卷积。 四、实验结果 实验代码: clear all close all clc x1=[1,2,3,4,5,6,7,8]; x2=[1,2,3,4,5,6,7,8,7,6,5,4,3,2, 1]; N=length(x1)+length(x2); n=0:N-1 n1=0:N-2; n2=0:N-3; y1=circonvt(x1,x2,N); y2=circonvt(x1,x2,N-1);

y3=circonvt(x1,x2,N-2); x1=[x1 zeros(1,N-length(x1))]; x2=[x2 zeros(1,N-length(x2))]; Xf1=dft(x1,N); Xf2=dft(x2,N); Xf=Xf1.*Xf2; x=idft(Xf,N); x=real(x); subplot(2,3,1) stem(n,x1); title('x1(n)'); subplot(2,3,2) stem(n,x2); title('x2(n)') subplot(2,3,3); stem(n,x); title('x(n)=IDFT(X(k))'); subplot(2,3,4); stem(n,y1); title('N点圆周卷积'); subplot(2,3,5); stem(n1,y2); title('N-1点圆周卷积'); subplot(2,3,6); stem(n2,y3); title('N-2点圆周卷积'); function y=circonvt(x1,x2,N) if length(x1)>N error('N 必须 >= x1的长度') end if length(x2)>N error('N 必须 >= x2的长度') end x1=[x1 zeros(1,N-length(x1))]; x2=[x2 zeros(1,N-length(x2))]; m=[0:1:N-1]; x2=x2(mod(-m,N)+1); H=zeros(N,N); for n=1:1:N H(n,:)=cirshift(x2,n-1,N); end y=x1*H; function y=cirshift(x,m,N) if length(x)>N error('N 必须 >= x的长度') end x=[x zeros(1,N-length(x))]; n=[0:1:N-1]; n=mod(n-m,N); y=x(n+1); function [Xk]=dft(xn,N) n=[0:1:N-1];k=[0:1:N-1]; WN=exp(-j*2*pi/N); nk=n'*k; WNnk=WN.^nk; Xk= xn * WNnk; function [xn]=idft(Xk,N) %计算逆离散傅里叶变换 %[xn]=idft(Xk,N) n=[0:1:N-1];

基于matlab的2-3卷积码编码译码设计与仿真

西南科技大学 方向设计报告 课程名称:通信工程方向设计 设计名称:2/3卷积码编译码器仿真与性能分析 姓名: 学号: 班级: 指导教师: 起止日期:2011.12.12-2012.1.6 西南科技大学信息工程学院制

方向设计任务书 学生班级:学生姓名:学号: 设计名称:2/3卷积码编译码器仿真与性能分析 起止日期:2011.12.12-2012.1.6指导教师: 设计要求: (1)分析2/3卷积码编码器结构; (2)分析2/3卷积码译码的Viterbi算法; (3)基于SIMULINK进行2/3卷积码的纠错性能仿真; 方向设计学生日志 时间设计内容 12.15-12.17 查看题目及设计要求。 12.18-12.23 查阅相关资料,设计方案。 12.23-12.27 编写报告及调试程序。 12.28-12.29 完善修改课程设计报告。 12.30-12.31 答辩。

方向设计考勤表 周星期一星期二星期三星期四星期五 方向设计评语表 指导教师评语: 成绩:指导教师: 年月日

2/3卷积码编译码器仿真与性能分析 摘要: 卷积码是一种性能优越的信道编码。它的编码器和译码器都比较容易实现,同时它具有较强的纠错能力。随着纠错编码理论研究的不断深入,卷积码的实际应用越来越广泛。本文简明地介绍了卷积码的编码原理和Viterbi译码原理。并在SIMULINK模块设计中,完成了对卷积码的编码和译码以及误比特统计整个过程的模块仿真。最后,通过在仿真过程中分别改变卷积码的重要参数来加深理解卷积码的这些参数对卷积码的误码性能的影响。经过仿真和实测,并对测试结果作了分析。 关键词: 卷积码编码器、viterbi译码器、SIMULINK

卷积码的编解码Matlab仿真

卷积码的编解码Matlab仿真

卷积码的编解码Matlab仿真 摘要 卷积码是一种性能优越的信道编码。它的编码器和译码器都比较容易实现,同时它具有较强的纠错能力。随着纠错编码理论研究的不断深入,卷积码的实际应用越来越广泛。本文简明地介绍了卷积码的编码原理和译码原理。并在SIMULINK模块设计中,完成了对卷积码的编码和译码以及误比特统计整个过程的模块仿真。最后,通过在仿真过程中分别改变卷积码的重要参数来加深理解卷积码的这些参数对卷积码的误码性能的影响。经过仿真和实测,并对测试结果作了分析。得出了以下三个结论: (1)当改变卷积码的码率时,系统的误码性能也将随之发生变化。 (2)对于码率一定的卷积码,当约束长度N 发生变化时,系统的误码性能也会随之发生变化。 (3)回溯长度也会不同程度上地影响误码性能。 关键词:卷积码;码率;约束长度;回溯长度

Simulation and Research on Encoding and Decoding of Convolution Code Abstract Convolution code has a superior performance of the channel code. It is easy to coding and decoding. And it has a strong ability to correct errors. As correcting coding theory has a long development, the practice of convolution code is more and more extensive. In this thesis, the principle of convolution coding and decoding is introduced simply firstly. Then the whole simulation module process of encoding, decoding and the Error Rate Calculation is completed in this design. Finally, in order to understand their performances of error rate, many changes in parameters of convolution code are calculated in the simulation process. After simulation and measure, an analysis of test results is presented. The following three conclusions are draw: (1) When the rate of convolution Code changes, BER performance of the system will change. (2) For a certain rate of convolution code, when there is a change in the constraint length of N, BER performance of the system will change. (3) Retrospective length will affect BER. Key words:convolution code; rate; constraint length; retrospective length;

相关文档
最新文档