?? multipath_chann.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 + -