⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multipath.m

📁 本程序是MIMO-OFDM 系统的信道估计程序
💻 M
字号:
function output = multipath(input,Doppler_freq,factor,frame_Num, frame_idx)

% 函数功能:使用Jakes模型,对输入的信号加上多径效应和多普勒频移. 注意:未加高斯白噪声

% 输入:1) input,输入信号样点序列,行向量,样点间隔20ns(系统基带采样速率假定为50MHz)
%       2) Doppler_freq,多普勒频移(Hz)

%       3) factor, 对输入时域样点序列进行分块,多个时域样点使用1个瑞利衰落系数。 这个变量为块的样点个数。
%       使用Jakes模型产生瑞利衰落序列, 当多普勒频移较小时,时域很多个样点都近似相等。目的是减小运算量和存储空间。
%       如多普勒频移为100Hz, 则相干时间为10ms. 而样点间隔为20ns, 则10ms/20ns = 5*10^5个样点信道变化不大。
%       如果为多载波CDMA系统或OFDM系统,建议factor值为一个OFDM符号的样点数(包括CP)

%       4) frame_Num,为总的仿真的帧数目
%       5) frame_idx,为当前帧的序号,从1到frame_Num

% 输出:output,输出信号样点序列,行向量,样点间隔20ns , 系统带宽50MHz

% 样点间隔20ns
deltaT = 20*10^(-9);

% 每个时域样点块的时间宽度.
T_block = deltaT*factor;

% 信道的功率时延谱
% 城区指数衰落信道,等间隔取0us~ 5us 共6条径
atten_power = exp(-[0:5]);
path_delay = [0:5]*50;     % 20ns样点间隔    

% 求信号幅度衰减,并归一化总功率
atten = sqrt( atten_power );
atten = atten./sqrt(sum(atten.*conj(atten)));

% 输出样值序列
output = zeros( 1,length(input) + max(path_delay) );

% 相干时间对应的样点数
Tc = round( (1/Doppler_freq)/deltaT );    

% 计算如果每个点都加1个瑞利衰落系数,总共需要的瑞利衰落样点数
% 原则: 每条径使用的瑞利衰落系数要独立, 也就是截取Jakes模型时, 径和径之间的截取间隔要等于或
% 大于相干时间对应的样点数. 我们截取时是等于相干时间对应样点数.
len = length(input) + Tc * length(path_delay) * frame_Num;

% 如果考虑分块和需要多产生一些样点以方便截取,调用Jakes模型程序需要产生的瑞利衰落样点数
% 乘15*Tc的目的是为了方便舍去Jakes模型产生的瑞利衰落系数前面幅度较大的部分
fading_len = ceil(( len + 15*Tc)/ factor);

if frame_idx == 1
    % Jakes模型产生瑞利衰落序列
    fading = Tap_Rayleigh_Jakes(Doppler_freq,T_block,fading_len);
    
    % 截取Jakes模型产生瑞利衰落序列 ,舍去Jakes模型产生的瑞利衰落系数前面幅度较大的部分,
    % 从10倍相干时间对应的样点数处开始截取
    fading_trunc =  fading( ceil(( 10*Tc + 1)/factor) : ceil((len + 10*Tc + 1)/factor) );
    
    % 将Jakes模型产生的序列进行功率归一化
    fading_jakes = fading_trunc./sqrt( sum(fading_trunc.*conj(fading_trunc)) / length(fading_trunc) );
    
    % 为程序运行速度考虑,每帧都生成一次衰落系数序列,运行速度比较慢。可以在第1帧生成衰落系数序列
    % 并保存下来,然后每帧,读取保存的数据,截取即可
    save fading_jakes.mat fading_jakes; 
else
    load fading_jakes.mat;
end

for i = 1:length(path_delay)
    % 每条径, 对瑞利衰落序列进行截取. 每条径截取间隔为相干时间, 长度为输入样点长度.
    fading_path = fading_jakes( ceil( ( (i-1)*Tc + (frame_idx-1)*Tc + 1)/ factor ) :...
        ceil( ( (i-1)*Tc + (frame_idx-1)*Tc +  length(input) ) / factor ) );
    
    % 把瑞利衰落序列扩展为每个样点1个衰落系数
    fading_path2 =  reshape( repmat(fading_path ,factor ,1 ), 1 ,length(fading_path)*factor );     
    
    % 输入序列点乘上瑞利衰落序列, 再乘上对应径的幅度衰落因子atten(i)
    tmp_output = atten(i)*fading_path2(1:length(input)).*input;
    
    % 多条径叠加在一起,输出
    output = output + [zeros(1,path_delay(i)) tmp_output zeros(1,max(path_delay)-path_delay(i))];
end





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -