移动通信综合实验 16QAM调制解调与信道分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南昌大学实验报告
学生姓名:学号:专业班级:
实验类型:□验证□综合 设计□创新实验日期:2018/6/23 实验成绩:
一、实验名称
实验八16QAM调制解调与信道分析
二、实验目的
(1) 掌握QAM及解调原理与特性
(2) 了解星座图的原理及用途
(3) 分析高斯、瑞利、莱斯信道
三、实验内容
(1) 设计16QAM调制解调算法
(2) 比较GMSK和16QAM在高斯、莱斯和瑞利信道条件下的误码性能
(3) 撰写实验报告。

四、实验原理
正交振幅调制是用两个独立的基带数字信号对两个相互正交的同频载波进行抑制载波的双边带调制,利用这种已调信号在同一带宽内频谱正交的性质来实现两路并行的数字信息传输。

正交振幅调制信号的一般表示式为
16QAM是指包含16种符号的QAM调制方式,产生的框图如图1.
图 1 16QAM调制
相干解调原理如图2.
图 2 16QAM解调
五、实验步骤
(1) 16QAM调制与解调算法
先产生所需的二进制基带信号:
%% 产生的随机二进制数据流
M = 16; %信号的星座尺寸
k = log2(M); %每个符号的比特数
n = 30000; %处理的比特数目
numSamplesPerSymbol = 1; %过采样因子
%% 创建二进制数据流作为列向量
rng default%使用缺省随机数发生器
dataIn = randi([0 1],n,1); %产生的二进制矢量数据
%% 将二进制信号转为整数值信号
dataInMatrix = reshape(dataIn,length(dataIn)/k,k);%数据整形成二进制4
元组
dataSymbolsIn = bi2de(dataInMatrix); %转换为整数使用MATLAB函数qammod()进行QAM的调制
%% 使用16-QAM调制
dataMod = qammod(dataSymbolsIn',M,'bin'); %二进制编码、相位偏移=0
scatterplot(dataMod)
title('未加噪声的星座图')
axis([-4 4 -4 4])
在信号中加入噪声
%% 添加高斯白噪声
EbNo = 10; % 当信道SNR计算的EB/N0=10dB
snr = EbNo + 10*log10(k) - 10*log10(numSamplesPerSymbol);
%% 将信号通过AWGN信道
rxSignal = awgn(dataMod,snr,'measured');
显示星座图
%% 使用scatterplot功能展示星座图
sPlotFig = scatterplot(rxSignal ,1,0,'g.');
hold on
scatterplot(dataMod,1,0,'k*',sPlotFig)
title('加了噪声的星座图')
使用MATLAB函数qamdemod ()进行QAM的解调
%% 16-QAM解调
dataSymbolsOut = qamdemod(rxSignal ,M,'bin');
%% 将整数值信号转为二进制信号
dataOutMatrix = de2bi(dataSymbolsOut,k);
dataOut = dataOutMatrix(:); %返回的数据列矢量计算解调后的误码率
%% 计算系统的误码率(BER)
[numErrors,ber] = biterr(dataIn,dataOut);
fprintf('\nThe binary coding bit error rate = %5.2e, based on %d errors\n', ...
ber,numErrors)
运行效果如图3
图 3 运行效果图
(2) QAM在高斯、莱斯和瑞利信道条件下的误码性能
思路:先产生16QAM信号,然后先通过高斯信道引入噪声,再送入莱斯和瑞利信道后输出,通过给定不同的信噪比,画出误码率曲线。

效果结果如图4所示,代码见附录1。

图 4 16QAM经过各信道的误码率
其中用到的各信道模型如下,并可以通过使用Y = FILTER(CHAN, X)来模拟信道Chanon对信号X的影响。

A.高斯信道:A WGN:在某一信号中加入高斯白噪声
y = awgn(x,SNR) 在信号x中加入高斯白噪声。

信噪比SNR以dB为单位。

x的强度假定为0dBW。

如果x是复数,就加入复噪声。

y = awgn(x,SNR,SIGPOWER) 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;如果SIGPOWER为'measured',则函数将在加入噪声之前测定信号强度。

y = awgn(x,SNR,SIGPOWER,STA TE) 重置RANDN的状态。

y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的单位。

POWERTYPE可以是'dB'或'linear'。

如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW 为单位。

如果POWERTYPE是'linear',那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。

B.瑞利信道:RAYLEIGHCHAN(TS, FD, TAU, PDB)
TS—为输入信号的采样周期
FD—就是Doppler频偏,以Hz为单位,与速率的换算关系为v×fc/c,fc是载频
TAU—输入的信道参数,一个向量,包含了各径的延时,以s为单位
PDB—输入的信道参数,一个向量,包含了各径的功率(当然是均值啦,实际产生的能量都是以此为均值的随机量),以dB为单位。

C.莱斯信道:RICIANCHAN(TS, FD, K)
TS—是输入信号的采样时间,以秒为单位。

FD—是最大的多普勒频移,赫兹。

K—是线性尺度上的Rice K-因子。

(3) GMSK在高斯、莱斯和瑞利信道条件下的误码性能
思路:先产生GMSK信号,然后先通过高斯信道引入噪声,再送入莱斯和瑞利信道后输出,通过给定不同的信噪比,画出误码率曲线。

效果结果如图5所示,代码见附录2。

图 5 GMSK经过各信道的误码率
本次程序设计的各信道模型用到了MATLAB自带的模型类。

A.G MSK生成器:
comm.GMSKModulator(BitInput,PulseLength, SamplesPerSymbol)
▷BitInput—指定是否将输入比特或整数。

默认是false。

当为false,step方法要求输入带符号的整数或双精度型数据值的-1或1的列向量。

当为true,step方法要求输入带符号的整数或双精度型数据值的0或1的列向量
▷PulseLength—脉冲长度,默认的是4。

指定的长度的高斯脉冲形状在符号间隔作为实的正整数,GMSK为4.
▷SamplesPerSymbol—每个输出符号的样本数目,默认的是8。

指定上采样系数输出为实数、正数,标量整数值。

上采样系数的数目是的step方法用于产生每个输入样本的输出采样。

B.高斯信道生成器:
comm.AWGNChannel('NoiseMethod','SNR')
▷NoiseMethod—噪声的方法
'Signal to noise ratio (Eb/No)','Signal to noise ratio (Es/No)','Signal to noise ratio (SNR)'或者,'Variance'
▷SNR—信号功率与噪声功率之比的分贝值
C.莱斯信道生成器:
comm.RicianChannel(
'SampleRate',1e6,...
'KFactor',2.8,...
'MaximumDopplerShift',50,...
'DopplerSpectrum',doppler('Bell', 8),...
'RandomStream','mt19937ar with seed', ...
'Seed',73, ...
'PathGainsOutputPort',true);
▷SampleRate—输入信号取样速率(Hz) ,此属性的默认值是1Hz。

▷KFactor—RicianK因子(标量或矢量线性尺度),该位的默认值3
如果KFactor是一个标量,那么第一离散路径是具有Kras系数的Rice k-因子的莱斯衰落过程。

剩下的离散路径是独立的瑞利衰落过程。

如果KFactor是行向量,则对应于K因子向量的正元素的离散路径是具有由该元素指定的瑞斯K因子的莱斯衰落过程。

与K因子向量的零值元素相对应的离散路径是瑞利衰落过程
▷MaximumDopplerShift—最大多普勒频移(赫兹),属性的默认值是0.001赫兹。

多普勒频移适用于信道的所有路径。

当将最大值DoppReSHIFT设置为0时,通道对整个输入保持静态。

可以使用RESET方法生成新的通道实现。

▷DopplerSpectrum—多普勒频谱
指定所述多普勒频谱的形状(路径)的信道。

▷RandomStream—随机数流源,此属性的默认值是Global stream。

将随机数流的源指定为Global stream| mt19937ar的种子。

▷Seed—初始种子的mt19937ar随机数流,默认值73
▷PathGainsOutputPort—输出信道路径增益,此属性默认值是FALSE
将此属性设置为true输出通道路径增益的衰落过程的基础。

E.瑞利信道生成器:
comm.RayleighChannel(...
'SampleRate',1e6, ...
'MaximumDopplerShift',30, ...
'DopplerSpectrum',doppler('Bell', 8),...
'RandomStream','mt19937ar with seed', ...
'Seed',73, ...
'PathGainsOutputPort',true);
▷属性与莱斯信道相同
六、思考及体会
通过本次实验,对各信道的模型有了一定的了解,通过误码率曲线图直观的看到了不同信道对信号的影响,为之后的学习提供了形象的解释。

附录1
%% ---------------------- QAM ---------------------- %%
M = 16; %信号的星座尺寸
k = log2(M); %每个符号的比特数
n = 30000; %处理的比特数目
numSamplesPerSymbol = 1; %过采样因子
%% 创建二进制数据流作为列向量
rng default %使用缺省随机数发生器
dataIn = randi([0 1],n,1); %产生的二进制矢量数据
dataMod = qam_mod(dataIn); % 数据调制
for N = -50:20
%% 高斯
% 添加高斯白噪声
snr = N;
% 将信号通过AWGN信道
rxSignal_Gauss = awgn(dataMod,snr,'measured'); %信噪比以dB为单位
% 16-QAM解调
dataOut_Gauss = qam_demod(rxSignal_Gauss);
% 计算系统的误码率(BER)
[numErrors, ber] = biterr(dataIn,dataOut_Gauss);
% fprintf('\nThe binary coding bit error rate = %5.2e, based on %d errors\n',ber,numErrors)
plot(snr,ber,'r^')
hold on
%% 瑞利
% 获得瑞利信道函数
Rayleigh_chan = rayleighchan(1/10000,100); %采样频率1/10000,最大多普勒频移100
% 将信号通过Rayleigh信道
rxSignal_Rayleigh = filter(Rayleigh_chan, rxSignal_Gauss);
% 16-QAM解调
dataOut_Rayleigh = qam_demod(rxSignal_Rayleigh);
% 计算系统的误码率(BER)
[numErrors, ber] = biterr(dataIn,dataOut_Rayleigh);
% fprintf('\nThe binary coding bit error rate = %5.2e, based on %d errors\n',ber,numErrors)
plot(snr,ber,'g*')
hold on
%% 莱斯
% 获得莱斯信道函数
Rician_chan = ricianchan(1/10000,100,1);
% 将信号通过Rician信道
rxSignal_Rician = filter(Rician_chan, rxSignal_Gauss);
% 16-QAM解调
dataOut_Rician = qam_demod(rxSignal_Rician);
% 计算系统的误码率(BER)
[numErrors, ber] = biterr(dataIn,dataOut_Rician);
% fprintf('\nThe binary coding bit error rate = %5.2e, based on %d errors\n',ber,numErrors)
plot(snr,ber,'b.')
hold on
end
xlabel('信噪比SNR'),ylabel('误码率BER');
legend('高斯','瑞利','莱斯, K=5dB','Location','NorthEastOutside')
title('16QAM 下的误码率 -- SXF')
hold off
scatterplot(dataMod)
title('16QAM - 调制信号星座图 -- SXF')
axis([-4 4 -4 4])
附录2
%% ---------------------- GMSK ---------------------- %%
n = 300; %处理的比特数目
sps = 8; %每个符号的采样
%% 创建二进制数据流作为列向量
rng default %使用缺省随机数发生器
dataIn = randi([0 1],n,1); %产生的二进制矢量数据
% 创建GMSK调制器
gmskMod = comm.GMSKModulator('BitInput',true,'PulseLength',4,
'SamplesPerSymbol',sps);
% 创建GMSK解调器
gmskDeMod = comm.GMSKDemodulator('BitOutput',true,'PulseLength',4, 'SamplesPerSymbol',sps);
% 数据调制
modSigGMSK = step(gmskMod, dataIn);
% 误码率器
hError = comm.ErrorRate('ReceiveDelay', gmskDeMod.TracebackDepth);
for N=-50:20
%% 高斯
snr = N;
% 创建高斯信道器
hAWGN = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)','SNR',snr);
% 将信号通过AWGN信道
rxSignal_Gauss = step(hAWGN, modSigGMSK);
% GMSK解调
dataOut_Gauss = step(gmskDeMod, rxSignal_Gauss);
% 计算系统的误码率(BER)
errorStats = step(hError, dataIn, dataOut_Gauss);
fprintf('Error rate = %f\nNumber of errors = %d\n',errorStats(1), errorStats(2))
figure(3)
plot(snr,errorStats(1),'r^')
hold on
%% 瑞利
RayleighChan = comm.RayleighChannel(...
'SampleRate',1e6, ...
'MaximumDopplerShift',30, ...
'DopplerSpectrum',doppler('Bell', 8),...
'RandomStream','mt19937ar with seed', ...
'Seed',73, ...
'PathGainsOutputPort',true);
% 将信号通过瑞利信道
[rxSignal_Rayleigh, PathGains1] = step(RayleighChan,rxSignal_Gauss); %将通过AWGN信道的信号再通过瑞利信道 modSigGMSK
% GMSK解调
dataOut_Rayleigh = step(gmskDeMod, rxSignal_Rayleigh);
% 计算系统的误码率(BER)
errorStats = step(hError, dataIn, dataOut_Rayleigh);
fprintf('Error rate = %f\nNumber of errors = %d\n', errorStats(1), errorStats(2))
plot(snr,errorStats(1),'b.')
hold on
%% 莱斯
ricianChan = comm.RicianChannel(...
'SampleRate',1e6,...
'KFactor',2.8,...
'MaximumDopplerShift',50,...
'DopplerSpectrum',doppler('Bell', 8),...
'RandomStream','mt19937ar with seed', ...
'Seed',73, ...
'PathGainsOutputPort',true);
% 将信号通过莱斯信道
[rxSignal_Rician, RicianPathGains1] = step(ricianChan,rxSignal_Gauss); %将通过AWGN信道的信号再通过莱斯信道 modSigGMSK
% GMSK解调
dataOut_Gauss = step(gmskDeMod, rxSignal_Rician);
% 计算系统的误码率(BER)
errorStats = step(hError, dataIn, dataOut_Gauss);
fprintf('Error rate = %f\nNumber of errors = %d\n', errorStats(1), errorStats(2))
plot(snr,errorStats(1),'g*')
hold on
end
xlabel('信噪比SNR'),ylabel('误码率BER');
legend('高斯','瑞利','莱斯, K=5dB','Location','NorthEastOutside')
title('GMSK 下的误码率 -- SXF')。

相关文档
最新文档