45827《MIMOOFDM系统原理应用及仿真》李莉实例代码Word格式文档下载.docx
- 文档编号:18094196
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:67
- 大小:426.84KB
45827《MIMOOFDM系统原理应用及仿真》李莉实例代码Word格式文档下载.docx
《45827《MIMOOFDM系统原理应用及仿真》李莉实例代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《45827《MIMOOFDM系统原理应用及仿真》李莉实例代码Word格式文档下载.docx(67页珍藏版)》请在冰豆网上搜索。
end
xlabel('
x'
),ylabel('
Occurrence'
)
legend('
Rayleigh'
'
Rician,K=-40dB'
Rician,K=0dB'
Rician,K=15dB'
%瑞利信道模型子程序,子程序程序名称:
Ray_model.m
functionH=Ray_model(L)
%输入参数L:
仿真信道个数,为N=200000
%输出参数H:
返回瑞利信道矩阵
H=(randn(1,L)+j*randn(1,L))/sqrt
(2);
%产生实部为高斯分布、虚部为高斯分布、包络为瑞利分布的信道系数。
实部功率为1/2,虚部功率为1/2,因
%此该行指令返回单位功率的或称归一化功率的瑞利信道幅度系数。
%莱斯信道模型子程序,子程序程序名称:
Ric_model.m
functionH=Ric_model(K_dB,L)
%输入参数:
K_dB为莱斯因子,L为仿真信道个数
%输出参数H:
返回莱斯信道矩阵
K=10^(K_dB/10);
%将dB值描述的莱斯因子转换为幅度值
H=sqrt(K/(K+1))+sqrt(1/(K+1))*Ray_model(L);
%产生莱斯信道幅度系数。
莱斯信道模型中包含视距通信,收发之间有直通路径。
程序仿真结果见图2-9。
实例2-2两径信道与指数信道模型
产生一个两径信道和一个指数衰减的多径信道。
Example2_2
clear,clf
scale=1e-9;
%纳秒量级
Ts=10*scale;
%抽样时间间隔为10ns,在这个程序中这个量也为指数信道路径间隔
t_rms=30*scale;
%RMS时延扩展为30ns
num_ch=10000;
%仿真信道个数
%两径信道模型
%产生并绘制了理想的两径信道模型和瑞利分布两径信道模型。
pow_2=[0.50.5];
delay_2=[0t_rms*2]/scale;
%给出理想两径信道功率均为0.5,延时为0和60ns
H_2=[Ray_model(num_ch);
Ray_model(num_ch)].'
*diag(sqrt(pow_2));
%产生瑞利两径信道幅度系数。
通过调用子程序Ray_model产生归一化功率的瑞利两径信道幅度系数。
avg_pow_h_2=mean(H_2.*conj(H_2));
%计算瑞利分布两径信道每一径的平均功率。
在这里可以看到上一条语句中diag(sqrt(pow_2))的作用。
%当通过对幅度系数进行
运算计算功率时,sqrt(pow_2)可以使每一径的功率为pow_2,即每一径的功率为0.5。
subplot(121)
stem(delay_2,pow_2,'
ko'
),holdon,stem(delay_2,avg_pow_h_2,'
k.'
);
xlabel('
Delay[ns]'
ChannelPower[linear]'
title('
2-rayModel'
legend('
Ideal'
Simulation'
axis([-1014000.7]);
%指数信道模型
%产生并绘制理想的指数信道模型和瑞利分布的指数信道模型。
pow_e=exp_PDP(t_rms,Ts);
%通过调用exp_PDP子程序,计算理想指数信道每一径上的功率。
delay_e=[0:
length(pow_e)-1]*Ts/scale;
%计算指数信道每一径的延时,单位为ns
fori=1:
length(pow_e)
H_e(:
i)=Ray_model(num_ch).'
*sqrt(pow_e(i));
end
%计算瑞利分布的指数信道幅度系数。
通过调用Ray_model产生归一化功率的瑞利分布幅度系数,%sqrt(pow_e(i))的作用类似于diag(sqrt(pow_2))。
avg_pow_h_e=mean(H_e.*conj(H_e));
%计算瑞利分布指数信道的平均功率。
%由于sqrt(pow_e(i))的存在,瑞利分布指数信道每一径的平均功率也为pow_e(i),即与理想指数信道
%每一径功率相同。
subplot(122)
stem(delay_e,pow_e,'
),holdon,stem(delay_e,avg_pow_h_e,'
ExponentialModel'
axis([-1014000.7])
%瑞利信道模型子程序,子程序程序名称:
functionH=Ray_model(L)
H=(randn(1,L)+j*randn(1,L))/sqrt
(2);
%指数信道PDP子程序,子程序名称:
exp_PDP.m
functionPDP=exp_PDP(tau_d,Ts,A_dB,norm_flag)
%输入参数:
%tau_d:
RMS延时扩展,单位为s
%Ts:
抽样时间间隔,在这里也为指数信道路径间隔,单位为s
%A_dB:
最小不可忽略径[dB]
%norm_flag:
标准化标志
%输出参数:
%PDP:
输出指数信道PDP矢量
ifnargin<
4,norm_flag=1;
end%判断子程序调用参数个数,小于4,则norm_flag=1。
3,A_dB=-20;
end%判断子程序调用参数个数,小于4,则A_dB=-20。
%由于主程序中调用该子程序时,只有两个参数,所以上两条语句实际是幅值norm_flag=1和A_dB=-20。
sigma_tau=tau_d;
A=10^(A_dB/10);
lmax=ceil(-tau_d*log(A)/Ts);
%计算最大路径序号,参见式(2-34)。
%以下参见式(2-36)
ifnorm_flag
p0=((1-exp(-(lmax+1)*Ts/sigma_tau))/(1-exp(-Ts/sigma_tau)))/30;
elsep0=1/sigma_tau;
%计算式(2-37)中的P0
%指数信道PDP
l=0:
lmax;
PDP=p0*exp(-l*Ts/sigma_tau);
%参见式(2-37)
程序仿真结果如图2-17所示。
图2-17(a)为理想两径信道和瑞利两径信道的PDP曲线,图2-17(b)为离散指数信道和瑞利指数信道的PDP曲线。
(a)(b)
图2-17两径与指数信道模型
实例2-3IEEE802.11信道PDP与频谱分布
实现IEEE802.11信道仿真,画出IEEE802.11信道的PDP曲线与频谱图。
Example2_3.m
scale=1e-9;
%纳秒量级
Ts=50*scale;
%抽样时间间隔,50ns
t_rms=25*scale;
%RMS实验扩展,25ns
num_ch=10000;
%信道数
N=128;
%FFT长度
PDP=IEEE802_11_model(t_rms,Ts);
调用IEEE802_11_model子程序,计算IEEE802.11信道的PDP。
fork=1:
length(PDP)
h(:
k)=Ray_model(num_ch).*sqrt(PDP(k));
avg_pow_h(k)=mean(h(:
k).*conj(h(:
k)));
H=fft(h(1,:
),N);
subplot(121)
stem([0:
length(PDP)-1],PDP,'
),holdon,
length(PDP)-1],avg_pow_h,'
channeltapindex,p'
AverageChannelPower[linear]'
title('
IEEE802.11Model,\sigma_\tau=25ns,T_S=50ns'
axis([-1701]);
subplot(122)
plot([-N/2+1:
N/2]/N/Ts/1e6,10*log10(H.*conj(H)),'
k-'
Frequency[MHz]'
Channelpower[dB]'
Frequencyresponse,\sigma_\tau=25ns,T_S=50ns'
%IEEE802.11信道模型PDP产生子程序,子程序名称:
IEEE802_11_model.m
functionPDP=IEEE802_11_model(sigma_t,Ts)
%sigma_t:
RMS延时扩展
抽样时间间隔
IEEE802.11信道PDP矩阵
lmax=ceil(10*sigma_t/Ts);
%计算最大路径序号,参见式(2-38)
sigma02=(1-exp(-Ts/sigma_t))/(1-exp(-(lmax+1)*Ts/sigma_t));
%参见式(2-41)
l=0:
PDP=sigma02*exp(-l*Ts/sigma_t);
%参见式(2-40)
仿真结果参见图2-11。
实例2-4滤波白噪声模型
产生滤波白噪声信道模型,画出信道幅度系数及其包络的概率密度函数与相位的概率密度函数。
Example2_4.m
fm=100;
%最大多普勒频率
scale=1e-6;
%微秒量级
ts_mu=50;
ts=ts_mu*scale;
fs=1/ts;
%抽样时间与抽样频率
Nd=1e6;
%抽样个数
%获得复信道系数
[h,Nfft,Nifft,doppler_coeff]=FWGN_model(fm,fs,Nd);
subplot(211)
plot([1:
Nd]*ts,10*log10(abs(h)))%画信道幅度系数
str=sprintf('
Clarke/GanModel,f_m=%d[Hz],T_s=%d[us]'
fm,ts_mu);
title(str),axis([00.5-305])
subplot(223)
hist(abs(h),50)%画信道包络概率密度函数,包络一维概率密度函数呈瑞利分布。
subplot(224)
hist(angle(h),50)%画信道相位概率密度函数,相位一维概率密度函数呈均匀分布。
%滤波白噪声信道子程序(Clarke/Gan模型),子程序名称:
FWGN_model.m
function[h,Nfft,Nifft,doppler_coeff]=FWGN_model(fm,fs,N)
fm为最大多普勒频率,fs为抽样频率,N为抽样个数
h为复信道系数
Nfft=2^nextpow2(2*fm/fs*N);
Nifft=ceil(Nfft*fs/(2*fm));
%产生独立的复高斯随机过程,参见图2-12
GI=randn(1,Nfft);
GQ=randn(1,Nfft);
%求实信号的FFT,以获得Hermitian对称
CGI=fft(GI);
CGQ=fft(GQ);
%将高斯随机过程转换到频域。
%多普勒谱产生,仿真多普勒滤波器
doppler_coeff=Doppler_spectrum(fm,Nfft);
%将转换到频域的高斯过程加入到多普勒滤波器,频域内乘积。
f_CGI=CGI.*sqrt(doppler_coeff);
f_CGQ=CGQ.*sqrt(doppler_coeff);
%补零,使多普勒滤波器输出数据长度为Nifft,以备求ifft。
Filtered_CGI=[f_CGI(1:
Nfft/2)zeros(1,Nifft-Nfft)f_CGI(Nfft/2+1:
Nfft)];
Filtered_CGQ=[f_CGQ(1:
Nfft/2)zeros(1,Nifft-Nfft)f_CGQ(Nfft/2+1:
%求ifft,将多普勒滤波器输出频域信号转换到时域
hI=ifft(Filtered_CGI);
hQ=ifft(Filtered_CGQ);
%计算实部的平方加虚部的平方开平方,即呈瑞利分布的包络
rayEnvelope=sqrt(abs(hI).^2+abs(hQ).^2);
%计算包络的均方根值
rayRMS=sqrt(mean(rayEnvelope(1:
N).*rayEnvelope(1:
N)));
%图2-12最终输出的Clarke/Gan模型信道冲激响应。
h=complex(real(hI(1:
N)),-real(hQ(1:
N)))/rayRMS;
%多普勒谱子程序,子程序名称:
Doppler_spectrum.m
%对经典多普勒谱的仿真,参见式(2-25)。
functiony=Doppler_spectrum(fd,Nfft)
%输入参数:
fd为最大多普勒频移,Nfft为频域样值点个数。
%输出参数:
y返回多普勒谱
df=2*fd/Nfft;
%计算频率间隔
%计算f=0时多普勒谱
f
(1)=0;
y
(1)=1.5/(pi*fd);
%计算其他频率多普勒谱。
计算了多普勒谱从第2个样值到Nfft/2个样值以及第Nfft/2+2个样值到第Nfft个%样值。
fori=2:
Nfft/2,
f(i)=(i-1)*df;
%根据频率序号及频率间隔计算频率
y([iNfft-i+2])=1.5/(pi*fd*sqrt(1-(f(i)/fd)^2));
%计算式(2-25),注意randn产生的高斯噪声方差为1。
%计算多普勒谱的Nfft/2+1点样值。
用四点样值构成多项式,之后求出多项式在Nfft/2+1点的样值。
这个多%重相当于内插。
nFitPoints=3;
kk=[Nfft/2-nFitPoints:
Nfft/2];
%四点样值序号为Nfft/2-3到Nfft/2
polyFreq=polyfit(f(kk),y(kk),nFitPoints);
%形成多项式
y((Nfft/2)+1)=polyval(polyFreq,f(Nfft/2)+df);
%从多项式求Nfft/2点值。
仿真结果见图2-13。
3.7仿真实例
实例3-1OFDM信号的产生与解调
(1)通过对OFDM信号各个子载波赋共轭对称的数据产生一个实OFDM符号;
(2)给OFDM符号加循环前缀与循环后缀;
(3)给OFDM符号加窗。
在程序中加入的是升余弦窗,可以通过改变升余弦窗的滚降系数观察加入不同升余弦窗,对OFDM信号频谱的影响;
(4)信道采用加性高斯白噪声信道。
可以通过改变信噪比改变信道环境,从而在接收端通过误码率或星座图观察信道对OFDM信号传输的影响;
(5)去除循环前缀与循环后缀,对OFDM信号进行解调。
Example3_1.m
clearall;
closeall;
carrier_count=200;
%这个程序中OFDM子载波个数为512,其中400即carrier_count*2为数据符号,其余赋0值。
symbols_per_carrier=20;
%每个子载波上的符号数,在这里即为OFDM符号的个数。
bits_per_symbol=4;
%OFDM符号的每个子载波上传输的比特数。
4比特通常采用16QAM调制。
IFFT_bin_length=512;
%FFT长度,也即一个OFDM符号的子载波的个数。
PrefixRatio=1/4;
%循环前缀的比率,即循环前缀与OFDM符号长度的比值,通常在1/6~1/4之间。
GI=PrefixRatio*IFFT_bin_length;
%保护间隔的长度,这里为128。
beta=1/32;
%升余弦窗的滚降系数。
GIP=beta*(IFFT_bin_length+GI);
%循环后缀的长度,这里为20
SNR=30;
%本程序考虑加性高斯白噪声信道,这里信噪比为30dB。
%===============================OFDM信号产生=============================
baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol;
%计算传输数据总的比特数,为200*20*4=16000比特。
16000比特的构成为20个OFDM符号,每个OFDM
%符号200个子载波,每个子载波传输4比特信息。
carriers=(1:
carrier_count)+(floor(IFFT_bin_length/4)–floor(carrier_count/2));
%计算OFDM符号子载波的序号,carriers中存放的序号是29~228。
conjugate_carriers=IFFT_bin_length-carriers+2;
%计算OFDM符号子载波的序号,conjugate_carriers中存放的序号是282~481。
rand('
twister'
0);
baseband_out=round(rand(1,baseband_out_length));
%产生16000比特待传输的二进制比特流。
这里存放的是发送的二进制信号与后面解调后的二进制信号比
%较,可以计算误码率。
%16QAM调制并绘制星座图
complex_carrier_matrix=qam16(baseband_out);
%调用子程序qam16进行16QAM调制。
将baseband_out中的二进制比特流,每4比特转换为一个16QAM信
%号,即将二进制比特流每4比特转换为-3-3j、-3+3j、3-3j、3+3j、-1-3j、-1+3j、1-3j、1+3j、%-3-j、-3+j、3-j、3+j、-1-j、-1+j、1-j、1+j中的一个。
转换后complex_carrier_matrix为%1*4000矩阵。
complex_carrier_matrix=reshape…
(complex_carrier_matrix'
carrier_count,symbols_per_carrier)'
%转换complex_carrier_matrix中的数据为carrier_count*symbols_per_carrier矩阵,这里为%20*200矩阵。
figure
(1);
plot(complex_carrier_matrix,'
*r'
%绘制16QAM星座图
axis([-4,4,-4,4]);
16QAM调制后星座图'
gridon
%IFFT,即进行OFDM调制。
IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);
%将symbols_per_carrier*IFFT_bin_length矩阵赋0值,这里将20*512矩阵赋0值。
这里512是%IFFT的长度,也是OFDM符号子载波的个数。
IFFT_modulation(:
carriers)=complex_carrier_matrix;
%将20*200的complex_carrier_matrix的数据赋给IFFT_modulation的第29~228列,即给512个子%载波中的29~229个子载波赋值。
IFFT_modulation(:
conjugate_carriers)=conj(complex_carrier_matrix);
%将20*200的complex_carrier_matrix的数据赋给512个子载波中的第282~481个子载波。
%这段程序构造了512个子载波的OFDM符号,并且各个子载波上的数据是共轭对称的。
这样做的目的是经过%IFFT后形成的OFDM符号均为实数。
另外,在512个子载波中,仅有400个子载波为数据,其余为0值。
相%当于补零,补零的目的是通常IFFT的长度应该为2的整数次幂。
signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);
%IFFT实现OFDM调制。
time_wave_matrix=signal_after_IFFT;
%
figure
(2);
plot(0:
IFFT_bin_length-1,time_wave_matrix(2,:
));
%画一个OFDM信号的时域表现
axis([0,512,-0.4,0.4]);
gridon;
ylabel('
Amplitude'
Time'
OFDMTimeSignal,OneSymbolPeriod'
%添加循环前缀与循环后缀
XX=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);
%IFFT_bin_length+GI+GIP为OFD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MIMOOFDM系统原理应用及仿真 45827 MIMOOFDM 系统 原理 应用 仿真 实例 代码