1、 下图 为OFDM系统的调制与解调框图。2、OFDM解调原理框图3.1.3 Matlab完成简单的OFDM信号的产生于解调方案一: c=6; %子载波个数bits=108; %每个信道的比特数n=c*bits; %总的传送比特数data=2*round(rand(1,n)-1; %产生信源数据s=reshape(data,c,bits); %串/并变换tp=1:0.1:(1+10.8)-0.1;for i=1:c carrier(i,:)=cos(2*i*pi*tp); %产生载波信号 bpsk_sig(i,:)=s(i,:).*carrier(i,:); %产生调制信号 fin(i,:)=i
2、fft(bpsk_sig(i,:); %对信号进行IFFTend%并串变换transmit=reshape(fin,1,648);%加噪声snr=10;rxdata=awgn(transmit,snr,measuredrec=reshape(rxdata,c,bits); rd(i,:)=fft(rec(i,: %进行FFT处理 uncarry(i,:)=rd(i,: %解调rdata=sign(real(uncarry); %判决输出结果rdout=reshape(rdata,1,648);通过对比rdata和data方案二:Tu=224e-6; %useful OFDM symbol pe
3、riod 224微秒作用符号周期T=Tu/2048; %baseband elementary period基带基本周期 %求每个子载波的周期,2k模式里有2048个子载波(方便FFT/IFFT计算) %2048=1512(数据载波)+17(参数信令载波TPS)+176(导频载波)+343(虚拟载波)G=1/4; %choice of 1/4, 1/8, 1/16, and 1/32保护间隔长度,这里为1/4delta=G*Tu; %guard band durationTs=delta+Tu; %total OFDM symbol periodKmax=1705; %number of su
4、bcarriers有效子载波1705=1512(数据载波)+17(参数信令载波TPS)+176(导频载波)Kmin=0;FS=4096;%IFFT/FFT length2N-IFFT,N=2048. %一般情况下我觉得取2048就可以了,我猜想用4096的目的是考虑中心频率,而且这样的话采样频率不变,q=10; %carrier period to elementary period ratiofc=q*1/T; %carrier frequency f=1/T=9.124 这个关系使得载波频率接近于90 MHz,这个频率是VHF信道5的范围内, Rs=4*fc; %simulation pe
5、riod是基带信号初始周期长度,t=0:1/Rs:Tu; %Data generator (A确定一个符号周期内的采样点数 )M=Kmax+1;%1706便于计算,产生1706个4QAM符号rand(state,0);a=-1+2*round(rand(M,1).+i*(-1+2*round(rand(M,1).;%有0,1转换成-1,1调制信号,将二进制信息映射到星座图上%从A开始到info结束是串并转换,将每个OFDM符号的串行数据分配到多个信道上,每个信道上若干个数据(子载波是并行的,每个子载波上的数据也是并行的,所以数据要经过串并转换,分别调制个个子载波)。A=length(a);in
6、fo=zeros(FS,1);info(1:(A/2)=a(1:(A/2).; %Zero paddinginfo(FS-(A/2)-1):FS)=a(A/2)+1):A).%info的长度是4096,前853和后853的a值的倒置,中间补0%Subcarriers generation(B)carriers=FS.*ifft(info,FS);%频域转时域,始于信号可以世家顺序依次发送%IFFT保证各个子载波之间的正交性,%把数据调制(频谱搬移)到不同的的正交子载波上tt=0:T/2:figure(1);subplot(211);stem(tt(1:20),real(carriers(1:2
7、0);%绘制针状图%real函数是求实部,imag函数求虚部,%abs函数是求模,angle函数求这个复数在复平面内的角度subplot(212);20),imag(carriers(1:figure(2);f=(2/T)*(1:(FS)/(FS);plot(f,abs(fft(carriers,FS)/FS);Pxx,f=pwelch(carriers,2/T);plot_Pxx1=10*log10(Pxx);plot(f,plot_Pxx1);%D/A simulation数模转换L=length(carriers);chips=carriers.zeros(2*q)-1,L);%串并转换
8、,得到81939个字符p=1/Rs:T/2;g=ones(length(p),1); %pulse shape脉冲波形figure(3);stem(p,g);dummy=conv(g,chips(:%卷积u=dummy(1:length(t);%(C)%这里去的是81921个符号,但是最后一位是0,%所以只有81920个figure(4);plot(t(1:400),real(u(1:400);%画出x,y,当两者有相应的矩阵或者量,%就是画出y相对于x400),imag(u(1:figure(5);ff=(Rs)*(1:(q*FS)/(q*FS);plot(ff,abs(fft(u,q*FS
9、)/FS);Pxx,f=pwelch(u,Rs);%U是要处理的信号2是窗函数3是分段平均时%重合的部分4是fft的点数Rs是采样频率plot_Pxx2=10*log10(Pxx);plot(f,plot_Pxx2);b,a=butter(13,1/20);%reconstruction filter这里得到的是光滑的模拟信号。%这里的butterworth滤波器,是13阶,%1/20是固有频率与采样频率Fs有关H,F=freqz(b,a,FS,Rs);通过低通滤波器,下一半为噪声。3.2 卷积编码和维特比译码及 QPSK3.2.1 卷积原理介绍了卷积码的原理,给出了卷积码的几种表示方法及卷积
10、码的性能描述;接着给出了维特比译码算法的基本原理。卷积码是1955年由爱里斯提出,它与分组编码不同。分组码中本组中的n-k个校验元仅与本组中的k个信息元有关,与其他组的码元无关。分组码译码时,也只从本组中提取有关译码信息。但卷积编码中,编码码字不仅与本组的信息有关,而且与以前时刻的其他组的信息有关。同样,译码时不仅从此时刻收到的码组中提取译码信息,同时还利用以前一段时刻收到的码字。卷积码以“位”为单位进行,因此编码设备结构比分组码简单。卷积码的译码方式有二种:(1)1963年由梅西(Masse)提出的门限译码,这是一种码代数结构的代数译码,类似于分组码中的大数逻辑译码;(2)1961年由沃曾克
11、拉夫特(Wozencraft)提出,1963年由费诺(Eano)改进的序列译码,这是基于码树图结构上的一种准最佳的概率译码;(3) 1967年由维特比(Viterbi)提出的Viterbi算法,这是基于码的网(trellis )图基础上的一种最大似然译码算法,是一种最佳的概率译码方法。维特比译码具有最佳性能,但硬件实现复杂;门限译码性能最差,但硬件简单;序列译码在性能和硬件方面介于维特比译码和门限译码之间。卷积码通常用(n, k, m)表示。m为编码约束长度,说明编码过程中互相约束的码段个数。k/n=R 同分组码一样称为卷积码的码率。它们是衡量卷积码的重要参数。典型的卷积编码器如图所示。卷积编
12、码器%cnv_encd.m %卷积码编码程序 function output=cnv_encd(G,k0,input) %cnv_encd(G,k0,input),k0是每一时钟周期输入编码器的bit数, %G是决定输入序列的生成矩阵,它有n0行L*k0列n0是输出bit数, %参数n0和L由生成矩阵G导出,L是约束长度。L之所以叫约束长度 %是因为编码器在每一时刻里输出序列不但与当前输入序列有关, %而且还与编码器的状态有关,这个状态是由编码器的前(L-1)k0。 %个输入决定的,通常卷积码表示为(n0,k0,m),m=(L-1)*k0是编码 %器中的编码存贮个数,也就是分为L-1段,每段k
13、0个 %有些人将m=L*k0定义为约束长度,有的人定义为m=(L-1)*k0 %查看是否需要补0,输入input必须是k0的整数部 if rem(length(input),k0)0 input=input,zeros(size(1:k0-rem(length(input),k0);end n=length(input)/k0;%检查生成矩阵G的维数是否和k0一致 if rem(size(G,2),k0)error(Error,G is not of the right size.) %得到约束长度L和输出比特数n0 L=size(G,2)/k0;n0=size(G,1);%在信息前后加0,使
14、存贮器归0,加0个数为(L-1)*k0个 u=zeros(size(1:(L-1)*k0),input,zeros(size(1:(L-1)*k0);%得到uu矩阵,它的各列是编码器各个存贮器在各时钟周期的内容 u1=u(L*k0:-1:1);%将加0后的输入序列按每组L*k0个分组,分组是按k0比特增加 %从1到L*k0比特为第一组,从1+k0到L*k0+k0为第二组,。, %并将分组按倒序排列。n+L-2 u1=u1,u(i+L)*k0:i*k0+1);uu=reshape(u1,L*k0,n+L-1);%得到输出,输出由生成矩阵G*uu得到 3.2 .2 QPSK技术1 QPSK原理 四
15、相相移调制是利用载波的四种不同相位差来表征输入的数字信息,是四进制移相键控。QPSK是在M=4时的调相技术,它规定了四种载波相位,分别为45,135,225,315,调制器输入的数据是二进制数字序列,为了能和四进制的载波相位配合起来,则需要把二进制数据变换为四进制数据,这就是说需要把二进制数字序列中每两个比特分成一组,共有四种组合,即00,01,10,11,其中每一组称为双比特码元。每一个双比特码元是由两位二进制信息比特组成,它们分别代表四进制四个符号中的一个符号。QPSK中每次调制可传输2个信息比特,这些信息比特是通过载波的四种相位来传递的。解调器根据星座图及接收到的载波信号的相位来判断发送
16、端发送的信息比特。 图2-1 QPSK相位图以/4 QPSK信号来分析 当输入的数字信息为“10”码元时,输出已调载波 (2-1) 当输入的数字信息为“00”码元时,输出已调载波 (2-2)当输入的数字信息为“01”码元时,输出已调载波 (2-3)当输入的数字信息为“11”码元时,输出已调载波 (2-4) QPSK调制框图 QPSK调制规则接收机收到某一码元的QPSK信号可表示为:yi(t)=a cos(2fct+n) 其中 (2-5) QPSK解调原理分析由QPSK的解调框图得到: (2-6)(2-7)(2-8)(2-9)符号相位的极性判决器输出AB+1- QSK信号解调器的判决准则3.2.
17、3 维特比译码原理由于卷积码的编码输出序列一定对应着网格图(或码树)中的一条路径,因此卷积码的最大似然译码,就是根据收到的序列R,按照最大似然译码的准则,力图在网格图上找到原来编码器编码时所走过的路径,这个过程就是译码器计算、寻找最大似然函数的过程,即得到 (2一5)对于BSC信道而言,就是寻找与R有最小汉明距离的路径,即得到 (2一6)最大似然译码的性能固然很好,但它是以整个译码长度为(L+m)n作为整体考虑的,这就给实际应用带来了困难。例如,若采用,L=50, k=2,可能的路径大于1030条,对于每一个接收序列R都要与大约1030条码序列进行比较,这在实际应用中几乎是不可能的。因此,必须
18、寻找一种新的最大似然译码算法,Viterbi译码方法正是为了解决这一困难提出来的。它不是在网格图上一次比较所有可能的个序列(路径),而是接收一段,就比较、计算一段,选择一条最可能的路径,从而使整个码序列是一个有最大似然函数的序列。用Viterbi译码的方法具体步骤如下:(1)从S0状态开始,时间单位j=1,计算并存储进入每一个状态的部分路径及其度量值。(2)j增加1,计算此时刻进入各状态的部分路径及其度量值,经过比较后,挑出并存储每个状态中一条有最大度量的那个部分路径及该部分路径对应的度量值,称此部分路径为幸存路径。(3)如果j L以后,由于输入码元开始为0,故网格图的状态数减少,幸存路径也减
19、少,到第(L+m)单位时间,网格图回到S0状态,最后只剩一条幸存路径,这条路径就是我们需要的有最大似然函数的路径简单流程图如图2-7。图2-7 译码流程图%viterbi.m %viterbi解码程序 functiondecoder_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列矩阵,它的每一行决定了从移位寄存器到输入码字的连接方式
20、. %survivor_state是一个矩阵,它显示了通过网格的最优路径,这个矩阵通过一个单独 %的函数metric(x,y)给出。n=size(G,1);%检验G的维数 if rem(size(G,2),k)=0 Size of G and k do not agreeif rem(size(channel_output,2),n)=0 channle output not of the right sizeL=size(G,2)/k;number_of_states=2(L-1)*k);%产生状态转移矩阵,输出矩阵和输入矩阵 for j=0:number_of_states-1 for t
21、=0:2k-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);input;state_metric=zeros(number_of_states,2);depth_of_trellis=length(channel_output)/n;channel_output_matrix=res
22、hape(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为输入 depth_of_trellis-L+1 flag=zeros(1,number_of_states);if istate_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,t+1)+1)=0) s
23、tate_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;state_metric=state_metric(:,2:%开始尾信道输出的解码 for i=depth_of_trellis-L+2:depth_of_trellis last_stop=number_of_states/(2(i-depth_of_trellis+L-2)*k);last_stop-1 binary_output=deci2bin(output(j+1,1),n);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;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1