您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 完整的OFDM系统的仿真实现
%窗函数子程序,子程序名称:recoswindow.mfunction[rcosw]=rcoswindow(beta,Ts)%输入参数:beta为升余弦窗关键系数,Ts为IFFT长度家循环前缀长度t=0:(1+beta)*Ts;rcosw=zeros(1,(1+beta)*Ts);%计算升余弦窗,共有三部分fori=1:beta*Ts;rcosw(i)=0.5+0.5*cos(pi+t(i)*pi/(beta*Ts));%计算升余弦窗的第一部分endrcosw(beta*Ts+1:Ts)=1;%计算升余弦窗低二部分forj=Ts:(1+beta)*Ts+1;rcosw(j-1)=0.5+0.5*cos((t(j)-Ts)*pi/(beta*Ts));%计算升余弦窗第三部分endrcosw=rcosw';%转换为列矢量%将16QAM信号的解调子程序,子程序的名称:demoduqam16.mend%16QAM调制子程序,子程序名称为qam16.m%将二进制数目流转换为16QAM信号function[complex_qam_data]=qam16(bitdata)%输入参数:bitdata为二进制数码流%输出参数:complex_qam_data为16QAM副信号X1=reshape(bitdata,4,length(bitdata)/4)';%将二进制数码流以4bitte分段d=1;%转换4bit二进制码为十进制码1~16,生态农场mapping映射表中的索引fori=1:length(bitdata)/4;forj=1:4X1(i,j)=X1(i,j)*(2^(4-j));endsource(i,1)=1+sum(X1(i,:));end%16QAM映射表,改表中存放的16对,没对两个实数,表示星座位置mapping=[-3*d3*d;-d3*d;d3*d;3*d3*d;-3*dd;-dd;dd;3*dd;-3*d-d;-d-d;d-d;3*d-d;-3*d-3*d;-d-3*d;d-3*d;3*d-3*d];fori=1:length(bitdata)/4qam_data(i,:)=mapping(source(i),:);%数据映射endcomplex_qam_data=complex(qam_data(:,1),qam_data(:,2));%组合为负数形式,形成16QAM信号end%将16QAM信号的解调子程序,子程序的名称:demoduqam16.m%该子程序测试function[demodu_bit_symble]=demoduqam16(Rx_serial_complex_symbols)%输入参数为:Rx_serial_complex_symbols为接收端接收到的复16QAM信号%输出参数:demodu_bit_symble为二进制数码流complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symbols),1);d=1;mapping=[-3*d3*d;-d3*d;d3*d;3*d3*d;-3*dd;-dd;dd;3*dd;-3*d-d;-d-d;d-d;3*d-d;-3*d-3*d;-d-3*d;d-3*d;3*d-3*d];complex_mapping=complex(mapping(:,1),mapping(:,2));%将数据映射表中转换为16QAM信号,即3组合为复数;fori=1:length(Rx_serial_complex_symbols);forj=1:16;metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1));end[min_metricdecode_symble(i)]=min(metrics);%将接收数据与标准16QAM信号比,找到差最小的,将其对应恢复成标准的16QAM信号enddecode_bit_symble=de2bi((decode_symble-1)','left-msb');%将16QAM转为二进制demodu_bit_symble=reshape(decode_bit_symble',1,length(Rx_serial_complex_symbols)*4);%转换为一行endbaseband_out_length=16000;rand('twister',0);baseband_out=round(rand(1,baseband_out_length));%产生16000bit待传输的二进制比特流。这里存放的是发送的二进制信号与后面解调后的二进制信号比较,可以计算误码率。%16QAM调制病绘制星座图。complex_carrier_matrix=qam16(baseband_out);figure(1);plot(complex_carrier_matrix,'*r');%绘制16QAM星座图title('16QAM调制后星座图');gridon;%16QAM调制子程序,子程序名称为qam16.m%将二进制数目流转换为16QAM信号%QAM16测试%输入参数:bitdata为二进制数码流%输出参数:complex_qam_data为16QAM复信号closeall;clearall;baseband_out_length=16000;rand('twister',0);bitdata=round(rand(1,baseband_out_length));complex_carrier_matrix=qam16(bitdata);%X1=reshape(bitdata,4,length(bitdata)/4)';%将二进制数码流以4bite分段%d=1;%%转换4bit二进制码为十进制码1~16,生成mapping映射表中的索引%fori=1:length(bitdata)/4;%forj=1:4%X1(i,j)=X1(i,j)*(2^(4-j));%end%source(i,1)=1+sum(X1(i,:));%end%%16QAM映射表,该表中存放的16对,没对两个实数,表示星座位置%mapping=[-3*d3*d;-d3*d;d3*d;3*d3*d;-3*dd;-dd;dd;3*dd;-3*d-d;-d-d;d-d;3*d-d;-3*d-3*d;-d-3*d;d-3*d;3*d-3*d];%fori=1:length(bitdata)/4%qam_data(i,:)=mapping(source(i),:);%数据映射%end%complex_qam_data=complex(qam_data(:,1),qam_data(:,2));%%组合为负数形式,形成16QAM信号%figure(1);%plot(complex_qam_data,'*r');%绘制16QAM星座图%title('16QAM调制后星座图');%gridon;figure(1);plot(complex_carrier_matrix,'*r');%绘制16QAM星座图title('16QAM调制后星座图');gridon;%程序功能%(1)通过对OFDM信号各个子载波赋共轭对称的数据产生一个实OFDM符号。%(2)给OFDM符号加循环前缀与循环后缀%(3)给OFDM符号加窗。在程序中加入的是升余弦窗,可以通过改变升余弦窗的滚降系数,观察加入不同升余弦窗对OFDM信号频谱的的影响%(4)信道采用嘉兴高斯白噪声信道。可以通过改变信噪比来改变信道环境,从而在接受端通过误码率或是星座图观察信道对OFDM信号传输的影响%(5)去除循环前缀与循环后缀,对OFDM信号进行解调%程序代码:clearall;closeall;carrier_count=200;%这个程序中OFDM子载波个数为512,其中400即carrier_count*2为数据符号,其余赋0值symbols_per_carrier=20;%每个子载波上的符号数,在这里即是OFDM符号的个数bits_per_symbol=4;%OFDM符号的每个子载波上传输的比特数,4bit通常采用的16QAM调制IFFT_bin_length=512;%FFT的长度,也即一个OFDM符号的子载波个数;PrefixRatio=1/4;%循环前缀的比值,循环前缀与OFDM符号长度的壁纸,通常在1/6~1/4之间GI=PrefixRatio*(IFFT_bin_length);%保护间隔的长度,这里为128beta=1/32;%升余弦窗的滚降系数GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度,这里为20;SNR=16;%本程序考虑加性高斯白噪声信道,这里信噪比为30db%===============================OFDM信号产生=====================baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol;%计算传输数据总的比特数,为200*20*4%bits=16000bits。16000bits构成20个OFDM符号,每个OFDM符号200个子载波,每个子载波传输4bit信息carriers=(1:carrier_count)+(floor(IFFT_bin_length/4)-floor(carrier_count/2));%计算OFDM符号的在载波的序号,carriers中存放的序号是29~228;conjugate_carriers=IFFT_bin_length-carriers+2;%conjugate_carriers=IFFT_bin_length-carriers-2;%====================================================这个序号有问题%计算OFDM符号子载波的序号,conjugate_carriers中存放的序号是282~481;rand('twister',0);baseband_out=round(rand(1,baseband_out_length));%产生16000bit待传输的二进制比特流。这里存放的是发送的二进制信号与后面解调后的二进制信号比较,可以计算误码率。%16QAM调制病绘制星座图。complex_carrier_matrix=qam16(baseband_out);%调用子程序qam16进行16QAM调制。将base_band中的二进制比特流,每4bit转换为一个16QAM信号,即将二进制比特流每4bit转换为-3-3j,-3+3j,3-3j,3+3j,%-1-3j,-1+3j,1-3j,1+3j,-3-j,-3+j,3-j,3+j,-1-j,-1+j,1-j,1+j中的一个。转换后complex_carrier_matrix为1*4000矩阵。complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier);%转换complex_carrier_matrix中的数据为carrier_coun6t*symbols_per_carrier矩阵,这里为20*200矩阵。figure(1);plot(complex_carrier_matrix,'*r');%绘制16QAM星座图title('16QAM调制后星座图');gridon;%IFFT,即进行OFDM调制IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%将symbols_per_carrier*IFFT_bin_length矩阵赋0值,这里讲20*512矩阵赋0值。这里512是IFFT的长度,也是OF
本文标题:完整的OFDM系统的仿真实现
链接地址:https://www.777doc.com/doc-4244083 .html