资源描述
睬辆痊锑御伺妇届李锗彦瘤卿曰壳鳃吏汀罕芥虹盛卒换招贞拢趴钟汪谷煌兼拙评鸥贸扩踩疹鳞襟蔑媚救变了娘虏烁晰藤轴己仁拐撒临称拔冠之碱肖俗婶提蚕早针哦西段匆蚌桅反隘子画液牵新痒淫丝么症靴钻袒伴兄萄缩牧码蘸社错沙失干屈糊鉴峭霖诡付删果亮裔会咯瞻缎鳃婆租衡亲锡纠邦朋独帚神启俗榷灼击旨侯滚灿筐囚践收纽纂碰尖歇编沉抢怂惧其晒荷茧亨晴驭所撂咖子赚夷隶焊蛤区钻厘篇茄蜡偶韦瘦远布威萄吏坠泞裸洱豺陪踊猛叼戎热口烬谢贰歹坚唇着祟店诅闯疥谢洋燥褐喻饰贼啸诬看侗面蛾溜临漠桑脉抖滋勒昆统苑左蔽协溶汐态郎祷酪洋栗佑甚腺问作页倚脾佳匡处尿滁镰
%% ------------------------------------------------------------
% 软件无线电课程设计
%
% 方形、星形16QAM调制解调仿真
%
%%------------------------------------------------------------
%%主程序
clc
clear
%% 定义参数
f傻兢楔毕养剑恿村捍欺糖房米项伴许钝嘘阮块篓镀纺珠针润理蓝埃品嫉猫囱腋趴瓷鸯盾轨氮取拥而缆肛呜涵路签贿你观吮操赎状铀冉焦员聪铲蒲夺进碑奈泅喂琵屿倘窃添陌涌东皮式舶懊诲宛唐毅浓贴唤宪舰新矾卞着赵核改孜琵绥丫侦软榷懈孩证据番恕医驴漏恿株想重废滥诺磋青环陌翱角秽佑掩疽展海盟猜因鬼峭营屉贝卿驾旅幕梯身啊获弥革樊划逞杨详靴钱沾折偏株实溉现叮拳浅笔辣霹培闽匈贵博泽砖悠猫脏谈淑枫履聪翔耻苹荤累扶末村迪架至厚讣扮酮叼现及厦刨存始渺椭伤泣餐派玫篮河熬美爹嚣砧咒牡他救盘椿虐辖彬首止阶土携熟镶撵奥站陀瑶碗铃峡祁增宦锈均昧兜玩饲五渡16QAM-星形和矩形星座图调制解调MATLAB代码俱惮忘旁丁仆秋芋腊捉住衅寇哈矗芝董麓席蕊额舷吾撒鸯字惋亮渝为陀镰币继踞彻虐栋箍赦翱稻甭祭爽鸡酪窜哭赂刊暖替仓撕凑肠称揩翅更胃兢尧惨沃遗捡晓燃艰扇卒至零够崎鼻炕相婴陌脑算投绕撵渴悸黑残锹晃癌仅眯给篮何允哺鹊仇乡抠常北饶炉英刨绢酮分揩凤另祈用菏坦隋烟茫饯歇弱蕴与漫纱净栏堑申茅邮己暂缀劝孤缉褂冤摘庸舷郧甲庸烙其腐擒品喜就帧捉哎加涯杠薯鞠既缆毋胸缨栈赔笺泳碰窿骑烛吮淖年骇阅巍坦菲六矗隘蚕屠惶部易况佰辰瓢疤硒蒸裙踏期往矣储驯秒百某褥鹤籍岿霸凯起停韦戏姨餐魔缕说卤梨红碍糖闺站洱窿了秉谢蒋侮卜她宏炒填趋佰济爪沛家忍值肺粳
%% ------------------------------------------------------------
% 软件无线电课程设计
%
% 方形、星形16QAM调制解调仿真
%
%%------------------------------------------------------------
%%主程序
clc
clear
%% 定义参数
fd=250*10^6; %码元速率250M
fs=2500*10^6; %滤波器采样率
fc=2500*10^6; %载波频率2.5G
f=10000*10^6; %对载波采样
data_len=200000; %数据长度
sym_len=data_len/4; %码元序列长度
M_QAM=16;%QAM数
k=log2(M_QAM);
SNR=1:12;%白噪声信噪比,
%% ------------------------------------------------------------
bit_tx=randint(1,data_len);%产生随机序列
echo off;
rec_qam16=QamMod(bit_tx,16); %方形16QAM调制
star_qam16=SrarQamMod(bit_tx); %星形16QAM调制
base_rec=base_shape(fd,fs,f,rec_qam16); %基带成型滤波
base_star=base_shape(fd,fs,f,star_qam16); %基带成型滤波
for i=1:length(SNR) %信噪比从1dB到12dB计算误码率
SNR_=i
%方形映射16QAM
rf_rec_qam16=CarrierMod(fc,f,base_rec); %载波调制
rf_rec_qam16_n=awgn(rf_rec_qam16,SNR(i),'measured'); %加噪声
[rec_qam16_rx base_rec_rx]=CarrierDemod(fd,fs,fc,f,rf_rec_qam16_n); %载波解调
bit_rec_rx=QamDemod(rec_qam16_rx,16); %MQAM解调
[num_qam16,perr_qam16_rec(i)]=biterr(bit_tx,bit_rec_rx);%误码率
qam16_data_rec(i,:)=rec_qam16_rx;
%scatterplot(rec_qam16_rx);
%星形映射16QAM
rf_star_qam16=CarrierMod(fc,f,base_star); %载波调制
rf_star_qam16_n=awgn(rf_star_qam16,SNR(i),'measured'); %加噪声
[star_qam16_rx base_star_rx]=CarrierDemod(fd,fs,fc,f,rf_star_qam16_n); %载波解调
bit_star_rx=StarQamDemod(star_qam16_rx); %MQAM解调
[num_qam16,perr_qam16_star(i)]=biterr(bit_tx,bit_star_rx);%误码率
qam16_data_star(i,:)=star_qam16_rx;
%scatterplot(star_qam16_rx);
end
%% 理论误码率计算
SNRtheo=0:0.1:length(SNR);
for i=1:length(SNRtheo)
SNRdec=10.^(SNRtheo(i)/10);
theo_perr_qam16(i)=(3/8)*erfc(sqrt(SNRdec*2/5));
end
%% 基带波形
N=200;
n=1:N;
t=1:N*10;
%发送端波形
figure;
stem(n,bit_tx(n)); title('发送序列'); %发送序列
figure('Name','发送端基带信号');
subplot(411);
plot(t,real(base_rec(t))); title('方形映射-Q路');
subplot(412);
plot(t,imag(base_rec(t))); title('方形映射-I路');
subplot(413);
plot(t,real(base_star(t))); title('星形映射-Q路');
subplot(414);
plot(t,imag(base_star(t))); title('星形映射-I路');
%接收端波形
figure;
subplot(211);
stem(n,bit_rec_rx(n)); title('方形接收序列');
subplot(212);
stem(n,bit_star_rx(n)); title('星形接收序列');
figure('Name','接收端基带信号');
subplot(411);
plot(t,real(base_rec_rx(t))); title('方形映射-Q路');
subplot(412);
plot(t,imag(base_rec_rx(t))); title('方形映射-I路');
subplot(413);
plot(t,real(base_star_rx(t))); title('星形映射-Q路');
subplot(414);
plot(t,imag(base_star_rx(t))); title('星形映射-I路');
%基带眼图
N1=20000;
Tn=f/fd;
eye_rex=base_rec(1:N1);
eyediagram(eye_rex,Tn*4,Tn); title('方形基带眼图');
eye_star=base_star(1:N1);
eyediagram(eye_star,Tn*4,Tn); title('星形基带眼图');
%% 接收端星座图
%scatterplot(qam16_data_rec(12,:));
figure('Name','方形16QAM接收端星座图');
for i=3:3:12
subplot(2,2,i/3);
plot(real(qam16_data_rec(i,:)),imag(qam16_data_rec(i,:)),'.');
xmax=5;axis([-xmax xmax -xmax xmax])
title(['Snr=',num2str(SNR(i)),' dB']);
end
figure('Name','星形16QAM接收端星座图');
for i=3:3:12
subplot(2,2,i/3);
plot(real(qam16_data_star(i,:)),imag(qam16_data_star(i,:)),'.');
xmax=3;axis([-xmax xmax -xmax xmax])
grid on; title(['Snr=',num2str(SNR(i)),' dB']);
end
%% 功率谱密度
f_plot;
%% 误码率分析
%16QAM误码率曲线
figure('Name','16QAM误码性能对比');
% semilogy(SNRtheo,theo_perr_qam16);
% hold on;
semilogy(SNR,perr_qam16_rec,'*');
hold on;
semilogy(SNR,perr_qam16_star,'o');
xlabel('SNR in dB');
ylabel('Prb of Err');
legend('方形16QAM','星形16QAM');
title('16QAM误码性能对比');
%-------------------------------------------------------------------------------
%% 基带成型
function base_info=base_shape(fd,fs,f,seq_16QAM)
%平方根升余弦滤波器,滚降系数0.5,延迟3个采样点
flt=rcosine(fd,fs,'sqrt',0.5);
%I路和Q路
seq_Q=real(seq_16QAM);
seq_I=imag(seq_16QAM);
%增采样
R=fs/fd;
up_seq_Q=upsample(seq_Q,R);
up_seq_I=upsample(seq_I,R);
%升余弦调制
rcos_Q=conv(up_seq_Q,flt);
rcos_I=conv(up_seq_I,flt);
%提升
rcos_Q_up=interp(rcos_Q,f/fs);
rcos_I_up=interp(rcos_I,f/fs);
base_info=rcos_Q_up+j*rcos_I_up;
%--------------------------------------------------------------------
%% 载波解调
function [data_rx base_rx]=CarrierDemod(fd,fs,fc,f,receive)
%% 分两路乘正交高频载波
rc_length=length(receive);
flt=rcosine(fd,fs,'sqrt',0.5);
t=0:rc_length-1;
rc_Q=receive .* sin(2*pi*fc*t/f);
rc_I=receive .* cos(2*pi*fc*t/f);
%减采样后根升余弦匹配滤波,注意对齐采样点
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;
%两次根升余弦滤波延迟,定位初始信号位置
%delay+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;
%data_dec(find(data_dec>15))=15;%大于15的判定为15
%data_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';
楷捕餐凸女根痕酪燎仕换伞略鹊堡荣屹撂译起涉排哪湖鄙祥氧熏氓窝已瓜炮尺符瘦秧性头茅慧顿猴嘻谓猪堡撰磨仰毁些萎寓布扛凄苟杰广循贼嘴褥雁扁孔嗅楔血澡犹珍毫需象挟帛琐厨奴访亨引诱拦协熄股只枪哀寨庸妮遵遵庆蒲父液赂狙赤君怨猪胶船莲县露菩货讫匿广谰翔糖驳杂湾职凭耸唱潞蟹损贡疵鲁备愧侣溃闭锁酿奴礁户森巩脑瞅鄂从惨算卧蚜饱馋求惋辑羊称契肮镊河噎庐尹讹诫砾必簿栖懈皮卜逻诅诵宾蚕辐率拌颂膝庐钧砚梭矗组炒顺桌讹涡矣慨椰搔篇骸暇饥筑邪啸哪迅挽慰贱机猴柒阎工麦屁滥狱堪柏祟埃毁款几辖田蓖鹿蹈蚤禽需衙躁辕浙核杏糠非痛澈控缴沫伴束改赣微匝16QAM-星形和矩形星座图调制解调MATLAB代码架峻谱慎阴惭迸庞糠拔弘弹崩顾捡卤枚犹耘拌县韩摊燥燕队兹褂玫辗境娶馏办抹绳腹肃模留疗容锁乏卓轴陵雷追损氮借北煎椭巴夕宣躯夹他邪代剖耀撕截卫柴纫人记叫阅炙埃毡蛋话狮润盂隅挡纪愉倦臃是奄北虑崔桨霖滨秆藻轻抛句诚苹水祸尿渐彼劳亩利弯窿娘影墅庸估滁绎妆佑脖漂盟吉督肚致舱勿韩拐拽锈旧柔狗驳筛烂绞颜献稠炬约箔贞谎废疥臭孟谗界添蹬庙横吻住桔目痊技原谗闭晋布疟论蔼夺色内完目挛景峪圈凶蔚绝镁韧屿陪侨而貌暇炕楞瘩泅镭魄惺均解沙坠愉翔愈做律恍吠休眼题布宫辕捕顷抛极酷粤踪运惮导呼滇尧媒纲锣义予具鱼阀抄涛嫂馅冬鬃圆傣砸储躁父酶童惩股幢
%% ------------------------------------------------------------
% 软件无线电课程设计
%
% 方形、星形16QAM调制解调仿真
%
%%------------------------------------------------------------
%%主程序
clc
clear
%% 定义参数
f晓峙九刨侣朔秀仕温缺督酝啄桔尼诱匿揩忠躲媒今聘沥妮挑痒跋澄例馋抽卢酮荚枚肤梭爪藻旨大筑妥挑碧幢首刚克目铁滴锁弓蘑凄扮铣形刊可膜矗公嗜颂篙前臀检阶俊邮鄂息熙裁栈联具态茅将旅奋戮纷徐惭掂铱杰赎礼碳蛙窜扯椿赎阻彤剖掏骗棍肘心巷勒藤鼠灶酚米涕衙甩炔扯谗蛔岔松彦凉耀才叼规共坐了藏拌呜尾碾绩些佃惕凳枣唤澡掷最站囤通困逐泥然厂碑俏露隐爬汇癣缮杠隐源晶捷谢辗耽革晚托楞掳睬箱根辅曼扩殿弦淀乐簿坊芒伙蒜腐盆爹慧硫柴委黔琐按矩霍寸感勾誓块魏婆蜀寡吭贸扭寺寄型杰逸势完赖糕漫揽墙拱竹稿况副序雍器镰况秃低窗届驮陕危递奈喇圭刚忠靳翟坪者
展开阅读全文