down_Q=downsample([0 rc_Q],f/fs); down_I=downsample(rc_I,f/fs); low_Q_rcos=conv(down_Q,flt); low_I_rcos=conv(down_I,flt);
base_rx=low_Q_rcos(1:length(low_I_rcos))+j*low_I_rcos;
%两次根升余弦滤波延迟,定位初始信号位置 Tlay+1:end-delay-1 R=fs/fd;
delay=3*R*2;
rc_Q_seq=(downsample(low_Q_rcos(delay+1:end-delay-1),R));
rc_I_seq=(downsample(low_I_rcos(delay+1:end-delay-1),R));
data_rx=rc_Q_seq+j*rc_I_seq;
%-------------------------------------------------------------------------- %% 载波调制
function transmit=CarrierMod(fc,f,base)
%载波调制
t=0:length(base)-1;
high_freq_Q=real(base) .* sin(2*pi*fc*t/f); high_freq_I=imag(base) .* cos(2*pi*fc*t/f);
transmit=high_freq_Q+high_freq_I;
%------------------------------------------------------------------------------ %
% QAM解调程序,将MQAM码元还原为二进制数据 % 入口参数:data_QAM:QAM码元数据 % M_QAM:MQAM中M的大小 % 出口参数:二进制数据比特流
%------------------------------------------------------------------------ function data_out=QamDemod(data_QAM,M_QAM)
k=log2(M_QAM);%每个M进制码元的bit数 data_len=length(data_QAM);%码元长度
%------------------------------------------------------------------- %QAM信号放缩至与发送端相同比例
data_temp=data_QAM(find(real(data_QAM>0))); aver=mean(real(data_temp));
data_Qam_temp=data_QAM/aver*(2^(k/2-1));
%------------------------------------------------------------------------
%类型转换
%平移到第一象限
data_Qam_temp2=(data_Qam_temp+(2^(k/2)-1)*(1+j))/2; %---------------------------------------------------------------------- %将实部虚部分别映射为二进制数据 %实部
data_real=round(real(data_Qam_temp2));%实部判决
data_real(find(data_real>(2^(k/2)-1)))=2^(k/2)-1;%大于2^(k/2)-1的数据判定为2^(k/2)-1 data_real(find(data_real<0))=0;%小于0的数据判为0 bit_real=abs(dec2bin(data_real))-'0'; %虚部
data_imag=round(imag(data_Qam_temp2));%虚部判决
data_imag(find(data_imag>(2^(k/2)-1)))=2^(k/2)-1;%大于2^(k/2)-1的数据判定为2^(k/2)-1 data_imag(find(data_imag<0))=0;%小于0的数据判为0 bit_imag=abs(dec2bin(data_imag))-'0';
%------------------------------------------------------------------------ %还原为二进制比特流 bit_rec=[bit_real,bit_imag]';
data_out=reshape(bit_rec,1,data_len*k);
%------------------------------------------------------------------------------------------------------------- %
% QAM调制程序,实现二进制到MQam调制 % 入口参数:binary:二进制数据
% M_QAM:MQAM中M的大小 % 返回参数:MQAM码元
%------------------------------------------------------------------------ function data_M = QamMod(binary,M_QAM)
k=log2(M_QAM);%每个M进制码元的bit数
data_len=length(binary);%比特长度
binary_rec=reshape(binary,k,data_len/k)';%转化为data_len/k行,k列,的矩阵,以便转化为16进制M进制 %计算实部
data_str1=num2str(binary_rec(:,1:k/2)); data_m_real=bin2dec(data_str1); %计算虚部
data_str2=num2str(binary_rec(:,k/2+1:k)); data_m_imag=bin2dec(data_str2); %实部虚部映射到MQam
data_M=((data_m_real*2-2^(k/2)+1)+j*(data_m_imag*2-2^(k/2)+1)).';
%---------------------------------------------------------------------------------
%% 星形16QAM映射
function data_m16 = SrarQamMod(binary) %binary=randint(1,100);%产生随机序列 data_len=length(binary);%比特长度
binary_rec=reshape(binary,4,data_len/4)';%转化为data_len/4行,4列,的矩阵,以便转化为16进制
data_str=num2str(binary_rec); data_dec=bin2dec(data_str);
data_mm16=(floor(data_dec/8)+1).*exp(j*45/180*pi*mod(data_dec,8)); data_m16=reshape(data_mm16,1,data_len/4);
%------------------------------------------------------------------------------ %% 星形16QAM解调
function data_bit = StarQamDemod(qam_rev) %qam_rev=xing_qam16_noise(1:10); am=abs(qam_rev);%幅度判定
am(find(am>2))=2;%幅度大于2的判定为2 am(find(am<1.5))=1;%幅度大于2的判定为2
%相位判定
ang=angle(qam_rev)/pi*180;%将-180度到0度变为180度到360度 ang(find(ang<0))=ang(find(ang<0))+360; ang_n=round(ang/45); ang_n(find(ang_n>7))=0;
data_dec=8*(round(am)-1)+ang_n;
úta_dec(find(data_dec>15))=15;%大于15的判定为15 úta_dec(find(data_dec<0))=0;%小于0的判定为0 data_bit_rec=dec2bin(data_dec);
data_bit=reshape(data_bit_rec',1,length(qam_rev)*4)-'0';

