具体包括了发送端的串并转换、训练序列的插入、过采样的IFFT变换及加入循环前缀和接收端的循环前缀的去除、FFT变换、去除虚子载波、训练序列的接收以及并串转换。继续将系统框图细化: 信道估计仿真模型:
为了研究信道和噪声对OFDM传输系统的影响,采用加性高斯白噪声信道(AWGN)和多径瑞利衰落信道(MuhipathReyleighFading)模块进行仿真。 具体实现如下: 1. 信道编码
信道编码采用卷积码和交织编码进行信道级联编码。卷积码码率为1/2,仿真时设置k=1,G=[1 0 1 1 0 1 1;1 1 1 1 0 0 1],将输入的90个0、1二进制数经过卷积编码后可得到192个0、1二进制数。交织编码采用24行8列的矩阵,按行写入,按列读出,交织编码可以有效的抗突发干扰。 卷积实现如下:
%************************beginning of file*****************************
%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 段,每段 k0 个
% 有些人将 m=L*k0 定义为约束长度,有的人定义为 m=(L-1)*k0 % 查看是否需要补 0,输入 input 必须是 k0 的整数部
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % G 决定输入序列的生成矩阵
% k0 每一时钟周期输入编码器的 bit 数 % input 输入数据 % output 输入数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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)>0
error('Error,G is not of the right size.') end
% 得到约束长度 L 和输出比特数 n0 L=size(G,2)/k0; n0=size(G,1);
% 在信息前后加 0,使存贮器归 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 为第二组,。。。。, %并将分组按倒序排列。 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);
% 得到输出,输出由生成矩阵 G*uu 得到 output=reshape(rem(G*uu,2),1,n0*(L+n-1));
% ************************end of file***********************************
交织实现如下:
%************************beginning of file***************************** %interlacecode.m
function dout=interlacecode(din,m,n) %实现信道的交织编码
%din为输入交织编码器的数据,m,n分别为交织器的行列值
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % din 输入数据
% m 交织器的行值 % n 交织器的列值 % dout 输出数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for j=1:m
temp(j,:)=din(j*n-(n-1):j*n); end
dout_temp=reshape(temp,1,length(din)); dout=dout_temp(1:end);
%************************end of file**********************************
%************************beginning of file***************************** %qpsk.m
%QPSK调制映射
function dout=qpsk(din)
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % din 输入数据 % dout 输出数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
din2=1-2*din;
din_temp=reshape(din2,2,length(din)/2); for i=1:length(din)/2,
dout(i)=din_temp(1,i)+j*din_temp(2,i); end
% ************************end of file***********************************
2. QPSK调制
在数字信号的调制方式中,使用了QPSK,这种调制方法具有较高的频谱利用率以及抗干扰性。实现代码见附件。 3. 插导频、矩阵变换
导频数据是在进行矩阵变换之前插入有效数据的,在系统设计中我们每8个有效数据插入一个导频,但是数据中间位置不插入导频。96个复数据插入10个导频后,一帧数据长度为106。
矩阵变换是为了降低系统的PAPR,采用方法的是改进Nyquist脉冲调整法(PS)。这里矩阵大小为106*128,滚将系数a=0.22。 具体实现如下:
%************************beginning of file***************************** %seq_train.m
%生成用于同步的训练符号 function dout=seq_train()
%第一帧产生短训练序列,第二帧产生长训练序列 %每个短训练符号由16个子载波组成,短训练序列 %是由伪随机序列经过数字调制后插0后,再经过 %IFFT之后得到的。具体过程如下:首先采用抽头 %系数为[1 0 0 1 ]的4级移位寄存器产生长度为
的伪随机序列之后末尾补0,经过QPSK调制之 %后的伪随机序列只在16的整数倍位置上出现,其 %余的位置补0,产生长度为128的序列,此序列再 %补128个0经过数据搬移后做256点的IFFT变换就 %得到16个以16为循环的训练序列,经过加循环前 %后缀就会产生20个相同的短训练序列。长训练序 %列的产生同短训练序列。
global seq_num
if seq_num==1
fbconnection=[1 0 0 1];
QPSKdata_pn=[m_sequence(fbconnection),0]; QPSKdata_pn=qpsk(QPSKdata_pn); elseif seq_num==2
fbconnection=[1 0 0 0 0 0 1];
QPSKdata_pn=[m_sequence(fbconnection),0];
QPSKdata_pn=qpsk(QPSKdata_pn); end
countmod=0; for k=1:128
if seq_num==1
if mod(k-1,16)==0 %生成16位循环的短训练符号 countmod=countmod+1;
trainsp_temp(k)=QPSKdata_pn(countmod); else
trainsp_temp(k)=0; end
elseif seq_num==2 if mod(k-1,2)==0
countmod=countmod+1;
trainsp_temp(k)=QPSKdata_pn(countmod); else
trainsp_temp(k)=0; end end end
dout=trainsp_temp;
% ************************end of file***********************************
4. IFFT变换
经过矩阵乘模块后,一帧数据长度为128,由于子载波个数为256,所以需要在数据后面补128个零。 具体实现如下:
%************************beginning of file***************************** ?t_my.m
%实现N点FFT运算
function dout=fft_my(din)
%本程序对输入序列din实现DIT——FFT基2算法,点数取大于等于din长度的2的幂次
%+++++++++++++++++++++++variables++++++++++++++++++++++++++++ % din 输入数据 % dout 输出数据
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
m=nextpow2(din) ;
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库OFDM调制及解调系统的设计 - 图文(2)在线全文阅读。
相关推荐: