当前位置: 首页 > news >正文

16QAM实验报告【附全部MATLAB代码】

​微信公众号:智能电磁频谱算法 QQ交流群:949444104

内容简介

电子信息与通信学院

实 验 报 告

实验名称

16QAM仿真实验

课程名称

软件无线电

班级

电磁

姓名

XXXX

学号

XXXXXXXXXX

成绩

一、实验要求

1、仿真 16QAM调制,画出频谱图,星座图,以及解码后的时域波形图。

2、增加高斯通道噪声,观察误码率的变化。

二、实验原理

16QAM信号由两路正交的4ASK信号叠加组成,调制框图如下:

16QAM解调采用正交相干解调,框图如下:

三、实验实现步骤以及主要代码

1、仿真步骤:首先随机产生0,1序列,然后将其分成I、Q两路,分别转换成4进制数据,再与两个正交的载波相乘,相加即完成16QAM调制。在已调信号上加高斯白噪声,解调时首先将接受到的信号分成两路,分别与两个正交的载波相乘,经过低通滤波器后定时抽样判决,最后经过4-2电平转换,合成一路即得到原信号。

2、主要代码:

主函数:

16QAM调制函数:

2-4电平转换函数:

16QAM解调函数:

4-2电平转换函数:

四、实验结果

频谱中心在200KHz左右,即载波频率。

误码率随信噪比的增大而减小,且符合实际情况。

该图是在信噪比18dB时解调之后得到的星座图,符合实际情况。

该图为前100个比特的发送和解调得到的二进制数据。

五、实验心得

本次实验我在老师提供的BPSK调制解调代码上改动。主要修改了主函数和调制解调函数,由于采用正交调制方法,16QAM需要分成两路做2-4/4-2电平转换,因此添加了这两个电平转换函数。在做这个实验时,碰到的最大一个问题是在解调上,最开始做出来的误码率很高,无论信噪比为多少,误码率都在0.12左右。最后我发现解调时若在判决电平前将接受到的信号归一化,那么得出来的误码率曲线才是正确的。

main_16QAM.m

clear
close all
​
%  系统参数定义
sys_param = Parameter();
M=16;
k=log2(M);
%  数据流长度
N=400;
%  输入的比特数据流
input_data = randi([0,1],1,N);
​
% 信号调制
modulated_signal = QAM_Modulation(input_data,sys_param);
​
%调制信号时域波形 前400个比特
figure
PlotTDSignal(modulated_signal(1:400),sys_param.sample_freq,sys_param.symbol_rate);
title('调制信号时域波形(前400个比特)');
% 调制信号频谱
figure
PlotFFTSignal(modulated_signal,sys_param.sample_freq);
title('调制信号频谱');
​
% 添加信道噪声
for j=1:10
signal_noise = awgn(modulated_signal,sys_param.SNR(j));
​
% 采用正交相干解调方式
[decode_data,I,Q] = QAM_Demodulation(signal_noise,sys_param);% % 误码率曲线
error_ratio(j) = CalBitErrorRate(input_data,decode_data);
end
figure
semilogy(sys_param.SNR,error_ratio,'*-k');hold on;grid on;
xlabel('SNR/dB');
ylabel('误码率');
title('AWGN信道下的误码率');
% % 星座图
figure
plot(I,Q,'*');
title('解码后的星座图');
% % 
figure
subplot(2,1,1);
stem(input_data(1:200));
title('原始发送的二进制信号');
subplot(2,1,2);
stem(decode_data(1:200));
title('接收(解调)的二进制信号');
​

QAM_Modulation.m

function modulated_signal = QAM_Modulation(input,sys_param)
%正交调幅法
n=length(input);
m=sys_param.sample_freq/sys_param.symbol_rate;% 一个比特的点数
dt=1/sys_param.sample_freq; %采样时间间隔
T=n/sys_param.symbol_rate;
t=0:dt:T-dt;
%I路
I=input(1:2:n-1);
%2-4电平转换
X=two2four(I,4*m);
​
%Q路
Q=input(2:2:n);
Y=two2four(Q,4*m);
% 基带成形滤波
rcos=firrcos(16,sys_param.symbol_rate/4,sys_param.symbol_rate/4,sys_param.sample_freq);
I=filter(rcos,1,X);
Q=filter(rcos,1,Y);
​
modulated_signal=I.*cos(2*pi*sys_param.carrier_freq*t)-Q.*sin(2*pi*sys_param.carrier_freq*t);
​

QAM_Demodulation.m

function [signal,In,Qn] = QAM_Demodulation(input_data,sys_param)
​
N=length(input_data);
dt=1/sys_param.sample_freq; %采样间隔
t=0:dt:(N-1)*dt;
m=4*sys_param.sample_freq/sys_param.symbol_rate;
n=N/m;
​
I_noise=input_data.*cos(2*pi*sys_param.carrier_freq*t);
Q_noise=-input_data.*sin(2*pi*sys_param.carrier_freq*t);
​
%低通滤波
[b,a]=butter(2,2*sys_param.symbol_rate/sys_param.sample_freq); %设计巴特沃斯滤波器
I=filtfilt(b,a,I_noise);
Q=filtfilt(b,a,Q_noise);
​
%定时抽取
nn=(0.6:1:n)*m;
nn=fix(nn);%取整
In=2.*I(nn);
Qn=2.*Q(nn);
​
%4-2电平转换
I_bin=four2two(In);
Q_bin=four2two(Qn);
xn=[I_bin;Q_bin];
xn=xn(:);
​
signal=xn';
end

CalBitErrorRate.m

function error_ratio= CalBitErrorRate(input_data,decode_data)
​
% 计算误码率
% 获取数据长度
data_len = length(input_data);
% 初始化计数器
count = 0;
​
for k = 1:data_len% 如果解码错误if input_data(k)~=decode_data(k)% 计数器加1count = count +1;end
end
​
error_ratio = count/data_len;

PlotFFTSignal.m

function PlotFFTSignal(x,sampling_freq)
​
% 画出FFT变换后的图像
% 数据的长度
data_len = length(x);
% FFT变换获得频域
fft_x = abs(fft(x));
% 频域信号正半轴
fre_x = fft_x(1:data_len/2);
​
% 频率范围的最大值(根据奈奎斯特采样定理,采样率是最大频率的2倍)
max_fre = sampling_freq/2;
​
% 频域范围
plotscope = linspace(0,max_fre,data_len/2);
​
% 画图
plot(plotscope,fre_x,'Linewidth',1.5);

PlotTDSignal.m

function PlotTDSignal(x,sampling_freq,symbol_rate)
​
% 画出信号的时域图像
% 数据长度
data_len = length(x);
% 时域间隔
time_interval = 1/sampling_freq;
% 时域范围
plotscope = 0:time_interval:(data_len-1)*time_interval;
​
% 画图
plot(plotscope,x,'Linewidth',1.5);
​
% 比特间隔
bit_interval = 1/symbol_rate;
% 比特数量
bit_num = floor(data_len/sampling_freq*symbol_rate);
​
for k = 1:bit_numhold onplot([k*bit_interval k*bit_interval],[min(x) max(x)],'--k','Linewidth',1.5);

Parameter.m

function sys_param = Parameter()
​
%%系统类参数定义sys_param
​
% 射频信号的中心频率
sys_param.center_freq  = 2.4e9;
% 信号相对于中心的载波频率
sys_param.carrier_freq = 200e3;
% 信号比特速率
sys_param.symbol_rate = 100e3;
​
​
% 基带信号采样频率
sys_param.sample_freq = 800e3;
% 信号发送带宽
sys_param.band = 150e3;
​
% 仿真的信噪比(dB)
sys_param.SNR = 0:2:18;
​
% 一个比特的时间长度
sys_param.bit_duration = 1/sys_param.symbol_rate;
% 采样时间间隔
sys_param.sampling_interval = 1/sys_param.sample_freq;
​
​

four2two.m

function xn=four2two(yn)
​
y=yn; ymin=min(y);
ymax=max(y);
yn=(y-ymin)*3/(ymax-ymin); 
​
%设置门限电平,判决
I0=find(yn< 0.5);       
yn(I0)=zeros(size(I0));
I1=find(yn>=0.5 & yn<1.5);   
yn(I1)=ones(size(I1));
I2=find(yn>=1.5 & yn<2.5);   
yn(I2)=ones(size(I2))*2;
I3=find(yn>=2.5);       
yn(I3)=ones(size(I3))*3;
%一位四进制码元转换为两位二进制码元
T=[0 0;0 1;1 1;1 0];  
n=length(yn); 
for i=1:nxn(i,:)=T(yn(i)+1,:);
end  
xn=xn'; 
xn=xn(:); 
xn=xn';

two2four.m

function [y,yn]=two2four(x,m)
% 2-4电平转换
T=[0 1;3 2];  
n=length(x);  
ii=1;
for i=1:2:n-1xi=x(i:i+1)+1; yn(ii)=T(xi(1),xi(2)); ii=ii+1;
end
yn=yn-1.5;    y=yn; 
for i=1:m-1y=[y;yn];
end
y=y(:)'; %映射电平分别为-1.5;-0.5;0.5;1.5

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 高阶面试-hw算法整理
  • 2013年全国大学生数学建模竞赛B题碎纸片复原(含word论文和源代码资源)
  • Python PDF Magic:合并和拆分随心所欲
  • windows server——5.DNS管理器域名解析搭建网站
  • 快速创建 vue 项目并添加 Dockerfile 文件
  • 手动构建线性回归(PyTorch)
  • 如何搭建一个RADIUS服务器?
  • vue3封装el-table及实现表头自定义筛选
  • CSP-J模拟赛day1
  • 【计算机网络】0 课程主要内容(自顶向下方法,中科大郑烇、杨坚)(待)
  • Flutter 开源库学习
  • 【Linux】shell简单模拟实现
  • Adobe Premiere Pro(Pr)安装包软件下载
  • 2024年热门硬盘数据恢复软件大盘点:高效恢复您的宝贵数据
  • 【数据结构】二叉树OJ题_对称二叉树_另一棵的子树
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Android Studio:GIT提交项目到远程仓库
  • crontab执行失败的多种原因
  • Elasticsearch 参考指南(升级前重新索引)
  • flask接收请求并推入栈
  • javascript面向对象之创建对象
  • python大佬养成计划----difflib模块
  • Spring框架之我见(三)——IOC、AOP
  • Travix是如何部署应用程序到Kubernetes上的
  • 闭包--闭包之tab栏切换(四)
  • 构建工具 - 收藏集 - 掘金
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 算法之不定期更新(一)(2018-04-12)
  • 一份游戏开发学习路线
  • 一天一个设计模式之JS实现——适配器模式
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ‌移动管家手机智能控制汽车系统
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (3)STL算法之搜索
  • (4)(4.6) Triducer
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (接口自动化)Python3操作MySQL数据库
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .Net多线程总结
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [20161101]rman备份与数据文件变化7.txt