%窗函数子程序,子程序名称:recoswindow.m function[rcosw]=rcoswindow(beta,Ts)
%输入参数:beta为升余弦窗关键系数,Ts为IFFT长度家循环前缀长度 t=0:(1+beta)*Ts;
rcosw=zeros(1,(1+beta)*Ts); %计算升余弦窗,共有三部分 for i=1:beta*Ts;
rcosw(i)=0.5+0.5*cos(pi+t(i)*pi/(beta*Ts));%计算升余弦窗的第一部分 end
rcosw(beta*Ts+1:Ts)=1;%计算升余弦窗低二部分 for j=Ts:(1+beta)*Ts+1;
rcosw(j-1)=0.5+0.5*cos((t(j)-Ts)*pi/(beta*Ts)); %计算升余弦窗第三部分 end
rcosw=rcosw';%转换为列矢量
%将16QAM信号的解调子程序,子程序的名称:demoduqam16.m end
QAM调制子程序,子程序名称为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映射表中的索引 for i=1:length(bitdata)/4; for j=1:4
X1(i,j)=X1(i,j)*(2^(4-j)); end
source(i,1)=1+sum(X1(i,:)); end
QAM映射表,改表中存放的16对,没对两个实数,表示星座位置 mapping=[-3*d 3*d;-d 3*d;d 3*d;3*d 3*d;-3*d d;-d d;d d;3*d d;-3*d -d;-d -d;d -d;3*d -d;-3*d -3*d;-d -3*d;d -3*d;3*d -3*d];
for i=1:length(bitdata)/4
qam_data(i,:)=mapping(source(i),:);%数据映射 end
complex_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*d 3*d;-d 3*d;d 3*d;3*d 3*d;-3*d d;-d d;d d;3*d d;-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组合为复数; for i=1:length(Rx_serial_complex_symbols); for j=1:16;
metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1)); end
[min_metricdecode_symble(i)]=min(metrics);
%将接收数据与标准16QAM信号比,找到差最小的,将其对应恢复成标准的16QAM信号
end
decode_bit_symble=de2bi((decode_symble-1)','left-msb'); %将16QAM转为二进制
demodu_bit_symble=reshape(decode_bit_symble',1,length(Rx_serial_complex_symbols)*4);%转换为一行
end
baseband_out_length=16000; rand('twister',0);
baseband_out=round(rand(1,baseband_out_length));
%产生16000bit待传输的二进制比特流。这里存放的是发送的二进制信号与后面解调后的二进制信号比较,可以计算误码率。
QAM调制病绘制星座图。
complex_carrier_matrix=qam16(baseband_out); figure(1);
plot(complex_carrier_matrix,'*r');%绘制16QAM星座图 title('16QAM调制后星座图'); grid on ;
QAM调制子程序,子程序名称为qam16.m %将二进制数目流转换为16QAM信号 %QAM16测试
%输入参数:bitdata为二进制数码流
%输出参数:complex_qam_data为16QAM复信号 close all; clear all;
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映射表中的索引 % for i=1:length(bitdata)/4; % for j=1:4
% X1(i,j)=X1(i,j)*(2^(4-j)); % end
% source(i,1)=1+sum(X1(i,:)); % end
% QAM映射表,该表中存放的16对,没对两个实数,表示星座位置 % mapping=[-3*d 3*d;-d 3*d;d 3*d;3*d 3*d;-3*d d;-d d;d d;3*d d;-3*d -d;-d -d;d -d;3*d -d;-3*d -3*d;-d -3*d;d -3*d;3*d -3*d];
相关推荐: