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