移动通信综合实验16QAM调制解调与信道分析Word下载.docx
《移动通信综合实验16QAM调制解调与信道分析Word下载.docx》由会员分享,可在线阅读,更多相关《移动通信综合实验16QAM调制解调与信道分析Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
%%产生的随机二进制数据流
M=16;
%信号的星座尺寸
k=log2(M);
%每个符号的比特数
n=30000;
%处理的比特数目
numSamplesPerSymbol=1;
%过采样因子
%%创建二进制数据流作为列向量
rngdefault%使用缺省随机数发生器
dataIn=randi([01],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([-44-44])
在信号中加入噪声
%%添加高斯白噪声
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.'
holdon
scatterplot(dataMod,1,0,'
k*'
sPlotFig)
加了噪声的星座图'
使用MATLAB函数qamdemod()进行QAM的解调
%%16-QAM解调
dataSymbolsOut=qamdemod(rxSignal,M,'
%%将整数值信号转为二进制信号
dataOutMatrix=de2bi(dataSymbolsOut,k);
dataOut=dataOutMatrix(:
%返回的数据列矢量
计算解调后的误码率
%%计算系统的误码率(BER)
[numErrors,ber]=biterr(dataIn,dataOut);
fprintf('
\nThebinarycodingbiterrorrate=%5.2e,basedon%derrors\n'
...
ber,numErrors)
运行效果如图3
图3运行效果图
(2)QAM在高斯、莱斯和瑞利信道条件下的误码性能
思路:
先产生16QAM信号,然后先通过高斯信道引入噪声,再送入莱斯和瑞利信道后输出,通过给定不同的信噪比,画出误码率曲线。
效果结果如图4所示,代码见附录1。
图416QAM经过各信道的误码率
其中用到的各信道模型如下,并可以通过使用Y=FILTER(CHAN,X)来模拟信道Chanon对信号X的影响。
A.高斯信道:
AWGN:
在某一信号中加入高斯白噪声
y=awgn(x,SNR)在信号x中加入高斯白噪声。
信噪比SNR以dB为单位。
x的强度假定为0dBW。
如果x是复数,就加入复噪声。
y=awgn(x,SNR,SIGPOWER)如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;
如果SIGPOWER为'
,则函数将在加入噪声之前测定信号强度。
y=awgn(x,SNR,SIGPOWER,STATE)重置RANDN的状态。
y=awgn(…,POWERTYPE)指定SNR和SIGPOWER的单位。
POWERTYPE可以是'
dB'
或'
linear'
。
如果POWERTYPE是'
,那么SNR以dB为单位,而SIGPOWER以dBW为单位。
,那么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—是线性尺度上的RiceK-因子。
(3)GMSK在高斯、莱斯和瑞利信道条件下的误码性能
先产生GMSK信号,然后先通过高斯信道引入噪声,再送入莱斯和瑞利信道后输出,通过给定不同的信噪比,画出误码率曲线。
效果结果如图5所示,代码见附录2。
图5GMSK经过各信道的误码率
本次程序设计的各信道模型用到了MATLAB自带的模型类。
A.GMSK生成器:
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—噪声的方法
'
Signaltonoiseratio(Eb/No)'
,'
Signaltonoiseratio(Es/No)'
Signaltonoiseratio(SNR)'
或者,'
Variance'
▷SNR—信号功率与噪声功率之比的分贝值
C.莱斯信道生成器:
comm.RicianChannel(
SampleRate'
1e6,...
'
KFactor'
2.8,...
MaximumDopplerShift'
50,...
DopplerSpectrum'
doppler('
Bell'
8),...
RandomStream'
mt19937arwithseed'
Seed'
73,...
PathGainsOutputPort'
true);
▷SampleRate—输入信号取样速率(Hz),此属性的默认值是1Hz。
▷KFactor—RicianK因子(标量或矢量线性尺度),该位的默认值3
如果KFactor是一个标量,那么第一离散路径是具有Kras系数的Ricek-因子的莱斯衰落过程。
剩下的离散路径是独立的瑞利衰落过程。
如果KFactor是行向量,则对应于K因子向量的正元素的离散路径是具有由该元素指定的瑞斯K因子的莱斯衰落过程。
与K因子向量的零值元素相对应的离散路径是瑞利衰落过程
▷MaximumDopplerShift—最大多普勒频移(赫兹),属性的默认值是0.001赫兹。
多普勒频移适用于信道的所有路径。
当将最大值DoppReSHIFT设置为0时,通道对整个输入保持静态。
可以使用RESET方法生成新的通道实现。
▷DopplerSpectrum—多普勒频谱
指定所述多普勒频谱的形状(路径)的信道。
▷RandomStream—随机数流源,此属性的默认值是Globalstream。
将随机数流的源指定为Globalstream|mt19937ar的种子。
▷Seed—初始种子的mt19937ar随机数流,默认值73
▷PathGainsOutputPort—输出信道路径增益,此属性默认值是FALSE
将此属性设置为true输出通道路径增益的衰落过程的基础。
E.瑞利信道生成器:
comm.RayleighChannel(...
1e6,...
30,...
▷属性与莱斯信道相同
六、思考及体会
通过本次实验,对各信道的模型有了一定的了解,通过误码率曲线图直观的看到了不同信道对信号的影响,为之后的学习提供了形象的解释。
附录1
%%----------------------QAM----------------------%%
%信号的星座尺寸
%每个符号的比特数
%处理的比特数目
rngdefault%使用缺省随机数发生器
%产生的二进制矢量数据
dataMod=qam_mod(dataIn);
%数据调制
forN=-50:
20
%%高斯
%添加高斯白噪声
snr=N;
%将信号通过AWGN信道
rxSignal_Gauss=awgn(dataMod,snr,'
%信噪比以dB为单位
%16-QAM解调
dataOut_Gauss=qam_demod(rxSignal_Gauss);
%计算系统的误码率(BER)
[numErrors,ber]=biterr(dataIn,dataOut_Gauss);
%fprintf('
ber,numErrors)
plot(snr,ber,'
r^'
%%瑞利
%获得瑞利信道函数
Rayleigh_chan=rayleighchan(1/10000,100);
%采样频率1/10000,最大多普勒频移100
%将信号通过Rayleigh信道
rxSignal_Rayleigh=filter(Rayleigh_chan,rxSignal_Gauss);
dataOut_Rayleigh=qam_demod(rxSignal_Rayleigh);
[numErrors,ber]=biterr(dataIn,dataOut_Rayleigh);
g*'
%%莱斯
%获得莱斯信道函数
Rician_chan=ricianchan(1/10000,100,1);
%将信号通过Rician信道
rxSignal_Rician=filter(Rician_chan,rxSignal_Gauss);
dataOut_Rician=qam_demod(rxSignal_Rician);
[numErrors,ber]=biterr(dataIn,dataOut_Rician);
b.'
holdon
end
xlabel('
信噪比SNR'
),ylabel('
误码率BER'
legend('
高斯'
瑞利'
莱斯,K=5dB'
Location'
NorthEastOutside'
16QAM下的误码率--SXF'
holdoff
16QAM-调制信号星座图--SXF'
附录2
%%----------------------GMSK----------------------%%
n=300;
sps=8;
%每个符号的采样
%创建GMSK调制器
gmskMod=comm.GMSKModulator('
BitInput'
true,'
PulseLength'
4,'
SamplesPerSymbol'
sps);
%创建GMSK解调器
gmskDeMod=comm.GMSKDemodulator('
BitOutput'
%数据调制
modSigGMSK=step(gmskMod,dataIn);
%误码率器
hError=comm.ErrorRate('
ReceiveDelay'
gmskDeMod.TracebackDepth);
forN=-50:
%创建高斯信道器
hAWGN=comm.AWGNChannel('
snr);
rxSignal_Gauss=step(hAWGN,modSigGMSK);
%GMSK解调
dataOut_Gauss=step(gmskDeMod,rxSignal_Gauss);
errorStats=step(hError,dataIn,dataOut_Gauss);
fprintf('
Errorrate=%f\nNumberoferrors=%d\n'
errorStats
(1),errorStats
(2))
figure(3)
plot(snr,errorStats
(1),'
RayleighChan=comm.RayleighChannel(...
%将信号通过瑞利信道
[rxSignal_Rayleigh,PathGains1]=step(RayleighChan,rxSignal_Gauss);
%将通过AWGN信道的信号再通过瑞利信道modSigGMSK
dataOut_Rayleigh=step(gmskDeMod,rxSignal_Rayleigh);
errorStats=step(hError,dataIn,dataOut_Rayleigh);
errorStats
(1),errorStats
(2))
ricianChan=comm.RicianChannel(...
%将信号通过莱斯信道
[rxSignal_Rician,RicianPathGains1]=step(ricianChan,rxSignal_Gauss);
%将通过AWGN信道的信号再通过莱斯信道modSigGMSK
dataOut_Gauss=step(gmskDeMod,rxSignal_Rician);
GMSK下的误码率--SXF'