移动通信综合实验16QAM调制解调与信道分析报告.doc
实验报告一、实验名称实验八 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'> %二进制编码、相位偏移0scatterplot<dataMod>title<'未加噪声的星座图'>axis<-4 4 -4 4>在信号中加入噪声% 添加高斯白噪声EbNo = 10; % 当信道SNR计算的EB/N0=10dBsnr = EbNo + 10*log10<k> - 10*log10<numSamplesPerSymbol>% 将信号通过AWGN信道rxSignal = awgn<dataMod,snr,'measured'>显示星座图% 使用scatterplot功能展示星座图sPlotFig = scatterplot<rxSignal ,1,0,'g.'>hold onscatterplot<dataMod,1,0,'k*',sPlotFig>title<'加了噪声的星座图'>使用MATLAB函数qamdemod <>进行QAM的解调% 16-QAM解调dataSymbolsOut = qamdemod<rxSignal ,M,'bin'>% 将整数值信号转为二进制信号dataOutMatrix = de2bi<dataSymbolsOut,k>dataOut = dataOutMatrix<:> %返回的数据列矢量计算解调后的误码率% 计算系统的误码率BERnumErrors,ber = biterr<dataIn,dataOut>fprintf<'nThe binary coding bit error rate = %5.2e, based on %d errorsn', .ber,numErrors>运行效果如图3图 3运行效果图<2> QAM在高斯、莱斯和瑞利信道条件下的误码性能思路:先产生16QAM信号.然后先通过高斯信道引入噪声.再送入莱斯和瑞利信道后输出.通过给定不同的信噪比.画出误码率曲线。效果结果如图4所示.代码见附录1。图 4 16QAM经过各信道的误码率其中用到的各信道模型如下.并可以通过使用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为'measured'.则函数将在加入噪声之前测定信号强度。 y = awgn<x,SNR,SIGPOWER,STATE> 重置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 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噪声的方法'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。KFactorRicianK因子<标量或矢量线性尺度>.该位的默认值3如果KFactor是一个标量.那么第一离散路径是具有Kras系数的Rice k-因子的莱斯衰落过程。剩下的离散路径是独立的瑞利衰落过程。如果KFactor是行向量.则对应于K因子向量的正元素的离散路径是具有由该元素指定的瑞斯K因子的莱斯衰落过程。与K因子向量的零值元素相对应的离散路径是瑞利衰落过程MaximumDopplerShift最大多普勒频移<赫兹>.属性的默认值是0.001赫兹。多普勒频移适用于信道的所有路径。当将最大值DoppReSHIFT设置为0时.通道对整个输入保持静态。可以使用RESET方法生成新的通道实现。DopplerSpectrum多普勒频谱指定所述多普勒频谱的形状<路径>的信道。RandomStream随机数流源.此属性的默认值是Global stream。将随机数流的源指定为Global stream| mt19937ar的种子。Seed初始种子的mt19937ar随机数流.默认值73PathGainsOutputPort输出信道路径增益.此属性默认值是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 errorsn',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 errorsn',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 errorsn',ber,numErrors>plot<snr,ber,'b.'> hold onendxlabel<'信噪比SNR'>,ylabel<'误码率BER'>legend<'高斯','瑞利','莱斯, K=5dB','Location','NorthEastOutside'>title<'16QAM 下的误码率 - SXF'>hold offscatterplot<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 = %fnNumber of errors = %dn',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 = %fnNumber of errors = %dn', 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 = %fnNumber of errors = %dn', errorStats<1>, errorStats<2>>plot<snr,errorStats<1>,'g*'> hold onendxlabel<'信噪比SNR'>,ylabel<'误码率BER'>legend<'高斯','瑞利','莱斯, K=5dB','Location','NorthEastOutside'>title<'GMSK 下的误码率 - SXF'>