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

📄 multipath_chann.m

📁 采用正弦波叠加法仿真多径衰落信道
💻 M
字号:
function [output_sig,Hk]=multipath_chann(input_sig,num,var_pow,delay,fd,t_interval,counter,count_begin,cp_n)
%input_sig输入信号矩阵,加了cp后的信号,大小为NL×(子载波个数+cp长度lp);
%num多径数;
%var_pow各径相对主径的平均功率,单位dB;
%delay各径延时,单位s;
%fd最大dopple频率;
%t_interval为离散信道抽样时间间隔,等于OFDM符号长度/(子载波个数+cp长度lp);
%output_sig为经过多径信道的输出信号矢量
%counter各径间隔记录
%count_begin本次产生信道开始记录的初始位置

t_shift=round(delay/t_interval);%归一化各径延时
%theta_shift=2*pi*fc*delay;
[nl,l]=size(input_sig);
output_sig=zeros(size(input_sig));

chann_l=nl*l;%信道采样点数,若一个调制符号采样一个信道点,则信道采样点数等于输入信号中的调制符号个数
selec_ray_chan=zeros(num,chann_l);%初始化频率选择性信道,径数=num
pow_per_channel=10.^(var_pow/10);%各径功率线性化,从dB转变成线性
total_pow_allchan=sum(pow_per_channel(1:num));%各径功率之和
%以下for循环产生相互独立的num条rayleigh信道
for k=1:num
    atts=sqrt(pow_per_channel(k));
    selec_ray_chan(k,:)=atts*rayleigh_fade(chann_l,t_interval,fd,count_begin+k*counter)/sqrt(total_pow_allchan);
    %selec_ray_chan(k,:)=atts*rayleigh_filtered(fd,t_interval,chann_l)/sqrt(total_pow_allchan);
end
%以下计算信道频率响应值,行数与载波数相同,列数与符号个数相同
N_carrier=nl-cp_n;
N_ofdm=l;
selec_ray_channew=zeros(num,chann_l+N_ofdm*(N_carrier+cp_n));
selec_ray_channew(:,1:chann_l)=selec_ray_chan;
Hk=zeros(N_carrier,N_ofdm);
for kk=1:N_ofdm
    for ii=1:N_carrier
        sum1=0;
        for ll=1:num
            sum1=sum1+selec_ray_channew(ll,(kk-1)*(N_carrier+cp_n)+cp_n+ii+t_shift(ll))*exp(-sqrt(-1)*2*pi*(ii-1)*t_shift(ll)/N_carrier);
        end
        Hk(ii,kk)=sum1;
    end
end
% N_carrier=nl-cp_n;
% N_ofdm=l;
% Hk=zeros(N_carrier,N_ofdm);
% for kk=1:N_ofdm-1
%     for ii=1:N_carrier
%         sum1=0;
%         for ll=1:num
%             sum1=sum1+selec_ray_chan(ll,(kk-1)*(N_carrier+cp_n)+cp_n+ii+t_shift(ll))*exp(-sqrt(-1)*2*pi*(ii-1)*t_shift(ll)/N_carrier);
%         end
%         Hk(ii,kk)=sum1;
%     end
% end

for k=1:l
    input_sig_serial(((k-1)*nl+1):k*nl)=input_sig(:,k).';%输入信号矩阵转变成串行序列
end
delay_sig=zeros(num,chann_l);%初始化延时后的送入各径的信号,每径所含符号数为chann_l
%以下for循环为各径的输入信号做延迟处理
for f=1:num
    if t_shift(f)~=0
        delay_sig(f,1:t_shift(f))=zeros(1,t_shift(f));
    end
    delay_sig(f,(t_shift(f)+1):chann_l)= input_sig_serial(1:(chann_l-t_shift(f)));
end
output_sig_serial=zeros(1,chann_l);%初始化输出信号串行序列
%得到各径叠加后的输出信号序列
for f=1:num
        output_sig_serial= output_sig_serial+selec_ray_chan(f,:).*delay_sig(f,:);
end
for k=1:l
    output_sig(:,k)=output_sig_serial(((k-1)*nl+1):k*nl).';%输出信号串行序列转变成与输入信号相同的矩阵形式,做为本函数输出
end
%注意,在本函数中没有为信号叠加白噪声

⌨️ 快捷键说明

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