?? rayleigh_doppler_singlepath.m
字號:
function y = Rayleigh_Doppler_singlePath(fc,v,startT,endT,deltaT)
%He jian, 2005.3
%產生單徑Rayleigh分布(Doppler Shift),基于Clarke模型
%return 信道復變量
%fc=2000;%載頻(MHz)
%v=50;%絕對時速(km/h)
% startT,endT(s):分別表示信道仿真的開始時間、終止時間,通常startT=0,endT=1s,
% deltaT(ms):時間間隔,通常deltaT=1ms
if (endT-startT<=sectionTime/1000)
'計算時間段必須小于總時長!'
return;
end
if (sectionTime>0&&deltaT>=sectionTime)
'deltaT要小于時間段!'
return;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%6種產生單徑Rayleigh方法,參考如下:
%1&2: A deterministic digital simulation model for Suzuki processes with application to a shadowed Rayleigh channel
%3 : Rayleigh Channel Fading Simulator:Problems and Solutions
%4 : 頻域濾波方法參見rayleigh_Filter_Model.m
%5 : Improved Models for the Generation of Multiple Uncorrelated Rayleigh Fading Waveforms
%6 : Simulation Models With Correct Statistical Properties for Rayleigh Fading Channels
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
method_flag = 6; %1,Suzuki-MEA;?只有正頻率部分 對該方法(一次計算部分)進行了優化處理!
%2,Suzuki-MED;?好象這個有點問題,出來的pdf與rayleigh比較,波動較大,不如MEA!
%3,New model(t);對該方法(一次計算部分)進行了優化處理!
%4,Filter model(f); rayleigh_Filter_Model.m
%5,New model(t) IEEE.2002.06;對該方法(一次計算部分)進行了優化處理!
%6,New model(t) IEEE.2003.06;對該方法進行了優化處理!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%檢查該方法的結果是否為rayleigh的pdf!(幅度|Z(t)|的PDF)
%clear;r=Rayleigh_Doppler_singlePath(2000,30,0,20,1,0);test_rayleigh_pdf(r);
%檢查其相位分布??
%phase=angle(xcorr(r))*180/pi;figure;subplot(2,1,1);plot(phase);subplot(2,1,2);hist(phase,50);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if (method_flag==1)
method_str = ['Suzuki-MEA'];
elseif (method_flag==2)
method_str = ['Suzuki-MED'];
elseif (method_flag==3)
method_str = ['New model(t)'];
elseif (method_flag==4)
method_str = ['Filter model(f)'];
elseif (method_flag==5)
method_str = ['New model(t) IEEE.2002.06'];
elseif (method_flag==6)
method_str = ['New model(t) IEEE.2003.06'];
else
end
sigma_u = sqrt(1/2);%為rayleigh分布pdf的參數
c=3*10^8;%光速(m/s)
fmax = (fc*10^6)*(v*10^3/3600)/c; % Max Doppler Shift (Hz)
fs=1000/deltaT;%抽樣頻率,if fs=1000-->模擬時間間隔=1/1000秒,即1ms
rand('state',sum(100*clock));
%如果涉及fft等計算,在Nfm點數為2的冪次方時,計算效率最高!
%確保2*fmax的頻率范圍內,抽樣點數滿足2的冪次方要求!同時又要超過抽樣點數!
% |---------------|----------------------........----------------------------|
% 0 2*fmax fs
% |<---- Nfm ---->| |
% |<----------------------------- Nfs -------------------------------------->|
tic;
N = 32;%模擬均勻到達的rays數
if(method_flag==1)%MEA
fd = fmax*sin((1:N)*pi/2/N); %cos(2*pi*((1:N)/N))*fmax;
phase = unifrnd(0,2*pi,N,1); %phase = 2*pi*((1:N)/N);%相位 0-2*pi 均勻分布
%phase = unifrnd(-pi,pi,N,1);
Nt = length([startT:deltaT/1000:endT]);
%temp = ones(1,Nt);
%phase = phase(:)*temp;
step = 0;
r1 = zeros(length(startT:deltaT/1000:endT),1);
for t = startT:deltaT/1000:endT
step = step + 1;
r1(step) = sum((exp(i*(2*pi*fd(:)*t + phase(:)))))*sigma_u*sqrt(2/N);%幅度
end
%t = [startT:deltaT/1000:endT];
%r1 = sum((exp(i*(2*pi*fd(:)*t + phase))))*sigma_u*sqrt(2/N);%幅度
%r1 = r1(:);
elseif(method_flag==2)%MED
fd = fmax*(2*(1:N)-1)/(2*N);%fd = fmax*(-N/2:N/2-1)/N;
phase = unifrnd(0,2*pi,N,1); %phase = 2*pi*((1:N)/N);%相位 0-2*pi 均勻分布
cn = sqrt(4*sigma_u*sigma_u*(asin((1:N)/N)-asin(((1:N)-1)/N))/pi);
Nt = length([startT:deltaT/1000:endT]);
step = 0;
for t = startT:deltaT/1000:endT
step = step + 1;
r1(step) = sum(exp(i*(2*pi*fd(:)*t + phase(:))).*cn(:));%幅度
end
r1 = r1(:);
elseif(method_flag==3)%New model(t)
M3 = 16; %>=8即可!
N3 = 4*M3 + 2;
theta = unifrnd(-pi,pi,M3+1,1); %[-pi,pi)均勻分布
fi = unifrnd(-pi,pi,M3+1,1); %[-pi,pi)均勻分布
ys = unifrnd(-pi,pi,M3+1,1); %[-pi,pi)均勻分布
wd = 2*pi*fmax;
wn = wd*cos(2*pi*[0:M3]'/N3+theta(:)/N3);
step = 0;
r1 = zeros(length(startT:deltaT/1000:endT),1);
for t = startT:deltaT/1000:endT
step = step + 1;
Xc = 2/sqrt(N3)*((sqrt(2)*cos(ys(1))*cos(wn(1)*t+fi(1)))+sum(2*cos(ys(2:end)).*cos(wn(2:end)*t+fi(2:end))));
Xs = 2/sqrt(N3)*((sqrt(2)*sin(ys(1))*cos(wn(1)*t+fi(1)))+sum(2*sin(ys(2:end)).*cos(wn(2:end)*t+fi(2:end))));
r1(step) = Xc + i*Xs;%幅度
r1(step) = r1(step) * sigma_u;
end
%r1 = r1(:);
elseif(method_flag==4)%Filter model(f)
r1 = rayleigh_Filter_Model(fmax,fs,(endT-startT)*fs+1);
r1 = r1(:);
elseif(method_flag==5)%New model(t) IEEE.2002.06
M5 = 32;%>=8
%theta = unifrnd(-pi,pi,M5,1); %[-pi,pi)均勻分布
theta = unifrnd(-pi,pi,1,1); %[-pi,pi)均勻分布
fi = unifrnd(-pi,pi,M5,1); %[-pi,pi)均勻分布
ys = unifrnd(-pi,pi,M5,1); %[-pi,pi)均勻分布
a5 = (2*pi*[1:M5]'-pi+theta)/(4*M5);
step = 0;
r1 = zeros(length(startT:deltaT/1000:endT),1);
for t = startT:deltaT/1000:endT
step = step + 1;
Zc = sqrt(2/M5)* sum(cos(2*pi*fmax*t*cos(a5)+fi));
Zs = sqrt(2/M5)* sum(cos(2*pi*fmax*t*sin(a5)+ys));
r1(step) = Zc + i*Zs;%幅度
r1(step) = r1(step) * sigma_u;
end
%r1 = r1(:);
elseif(method_flag==6)%New model(t) IEEE.2003.06
'一次計算中... ...'
M6 = 32;%>=8
%theta = unifrnd(-pi,pi,M6,1); %[-pi,pi)均勻分布
%fi = unifrnd(-pi,pi,M6,1); %[-pi,pi)均勻分布
theta = unifrnd(-pi,pi,1,1); %[-pi,pi)均勻分布
fi = unifrnd(-pi,pi,1,1); %[-pi,pi)均勻分布
ys = unifrnd(-pi,pi,M6,1); %[-pi,pi)均勻分布
a6 = (2*pi*[1:M6]'-pi+theta)/(4*M6);
step = 0;
r1 = zeros(length(startT:deltaT/1000:endT),1);
for t = startT:deltaT/1000:endT
step = step + 1;
Xc = sqrt(4/M6)* sum(cos(ys).*cos(2*pi*fmax*t*cos(a6)+fi));
Xs = sqrt(4/M6)* sum(sin(ys).*cos(2*pi*fmax*t*cos(a6)+fi));
r1(step) = Xc + i*Xs;%幅度
r1(step) = r1(step) * sigma_u;
end
%r1 = r1(:);
else
end
disp(['one rayleigh channel time: ' num2str(toc) '秒']);
plot_flag = 0; %2:-包括own的Welch法,周期圖法(對高采樣率優化plot);
% matlab的periodogram,pwelch,pmtm,pyulear;
% -還可以計算積分功率;
%1:需要一般plot(只有周期圖法)
%0:not plot
if(method_flag==1)
f_lim_range = [-fmax*0.2,fmax*2];
elseif(method_flag==2)
f_lim_range = [-fmax*0.2,fmax*2];
elseif(method_flag==3)
f_lim_range = [-fmax*2,fmax*2];
elseif(method_flag==4)
f_lim_range = [-fmax*2,fmax*2];
elseif(method_flag==5)
f_lim_range = [-fmax*2,fmax*2];
elseif(method_flag==6)
f_lim_range = [-fmax*2,fmax*2];
end
if plot_flag==1
Power_dB = 10*log10(abs(r1).^2);
subplot(2,2,1);plot([startT*1000:deltaT:endT*1000],Power_dB);grid;axis tight;title([num2str(fc), 'MHz,',num2str(v), 'km/h, Max Doppler=',num2str(fmax,'%.2f'),'Hz,',method_str]);xlabel('ms');ylabel('dB值');
%功率譜估計
yw = fft(r1);
yw=fftshift(yw);
yw = abs(yw).^2/length(yw);
len = length(yw);
f_range = [-fs/2:1/(endT-startT):fs/2];%(0:len-1)/len*fs;
subplot(2,2,2);plot(f_range,10*log10(yw));grid;xlim(f_lim_range);title('周期圖法 功率譜 abs()^2/N');xlabel('頻率(Hz)');ylabel('功率譜(dB)');
rt = xcorr(r1,r1);
subplot(2,2,3);plot(10*log10(abs(rt)/length(rt)));grid;axis tight;title(['自相關性']);
clear yw;
yw = xcorr(r1,r1);
len = length(yw);
yw = fft(yw);yw=fftshift(yw);
Pyw = abs(yw)/length(yw);%.^2/length(yw);
subplot(2,2,4);
plot((-len/2:len/2-1)/len*fs,10*log10(Pyw));grid;xlim(f_lim_range);title(['自相關法 功率譜,plot\_flag=',num2str(plot_flag)]);xlabel('頻率(Hz)');ylabel('功率譜(dB)');
elseif plot_flag==2
%功率譜估計
fs = 1000/deltaT;
Nfft = 2^4;
while(Nfft)
if (Nfft < length(r1))
Nfft = 2*Nfft;
else
break;
end
end
Nfft = Nfft/2;%讓數據長度為2的冪,又不超出采樣長度
r2 = r1(1:Nfft);
Power_dB = 20*log10(abs(r2));%dB
figure;
subplot(2,2,1);plot([startT*1000:deltaT:startT*1000+deltaT*(Nfft-1)],Power_dB);grid;axis tight;title([num2str(fc), 'MHz,',num2str(v), 'km/h,Max Doppler=',num2str(fmax,'%.2f'),'Hz,',method_str]);xlabel('ms');ylabel('dB值');
legend(['E(r^2)=',num2str(10*log10(sum(abs(r2).^2)/length(r2)),'%.2f'),' dB']);
clear Power_dB;
% yw = abs(fftshift(fft(r2))).^2/length(r2);
%
% len = length(yw);
% f_range = (-len/2:len/2-1)/len*fs; %[-fs/2:1/(endT-startT):fs/2];%(0:len-1)/len*fs;
% subplot(2,2,2);plot(f_range,10*log10(yw));grid;xlim(f_lim_range);title('周期圖法 功率譜');xlabel('頻率(Hz)');ylabel('功率譜(dB)');
% yw2=yw;f_less=find(f_range<0);f_more=find(f_range>fmax);yw2([f_less,f_more])=[];
% %size(yw2),fmax*len/fs
% %legend(['(0,fmax)mean=',num2str(10*log10(sum(yw2)*fs/len/fmax),'%.2f'),' dB/Hz']);
% legend(['(0,fmax)mean=',num2str(10*log10(mean(yw2)),'%.2f'),' dB/Hz']);
% clear yw2;
%
% subplot(2,2,3);plot(f_range,10*log10(yw));grid;xlim([-fmax*4,fmax*4]);title(['周期圖法 功率譜']);xlabel('頻率(Hz)');ylabel('功率譜(dB)');
% clear yw;
%
% %======= Welch K from 2 to 5 使頻域不至于展開過寬,而分辨不清!=======
% Kmax = 3; K=Kmax+1;
%
% L = 2^4; %每段數據長度,2的冪
% if (1.5*L>=length(r2))
% 'Welch: 數據總長度應> 1.5*L!'
% return;
% end
%
% while (K>Kmax)
% Lmax = floor(length(r2)*2/L)/2*L; %需要從r2中提取的數據總長度
% K = Lmax*2/L-1; %數據分段數
% if (K <= Kmax)
% if (K==1)
% K = 2;
% L = L/2;
% end
% break;
% else
% L = 2*L;
% end
% end
%
% w_hn = hanning(L);
% Pw = [];
% for k=1:1:K
% Pw(k,:) = (abs(fftshift(fft(w_hn.*r2(1+(k-1)*L/2:L+(k-1)*L/2)))).^2)';
% end
%
% Pw = sum(Pw)/(norm(w_hn)^2*K);
% f_range = (-L/2:L/2-1)/L*fs;
%
% subplot(2,2,4);plot(f_range,10*log10(Pw));grid;xlim(f_lim_range);title(['Welch法 功率譜,K=',num2str(K),',L=2\^',num2str(log2(L)),',plot\_flag=',num2str(plot_flag)]);xlabel('頻率(Hz)');ylabel('功率譜(dB)');
% f_less=find(f_range<0);f_more=find(f_range>fmax);Pw([f_less,f_more])=[];
% %legend(['(0,fmax)mean=',num2str(10*log10(sum(Pw)*fs/L/fmax),'%.2f'),' dB/Hz']);
% legend(['(0,fmax)mean=',num2str(10*log10(mean(Pw)),'%.2f'),' dB/Hz']);
% clear Pw;
%
% figure;
% subplot(2,2,1);
% [psd_matlab,f_matlab] = periodogram(r2,[],'twosided',Nfft,fs);%
% psd_matlab = fftshift(psd_matlab);
% len = length(f_matlab);
% plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));xlim(f_lim_range);grid;
% title(['periodogram(),',num2str(fc), 'MHz,',num2str(v), 'km/h,Max Doppler=',num2str(fmax,'%.2f'),'Hz,']);
% xlabel('Hz');ylabel('dB/Hz');
subplot(2,2,2);
clear psd_matlab;clear f_matlab;
[psd_matlab,f_matlab] = pwelch(r2,[],[],'twosided',Nfft,fs);%pwelch(x,window,noverlap,nfft,fs)
psd_matlab = fftshift(psd_matlab);
len = length(f_matlab);
plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
%doppler shift
hold on;
sigma_u4 = sqrt(1/2);fm4 = [-fmax*0.999:fmax/100:fmax*0.999];fc4 = 0;
Sf4 = 1.5*sigma_u4/(pi*fmax).*1./(sqrt(1-((fm4-fc4)./fmax).^2));
plot(fm4,10*log10(Sf4),'-.r',min(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r',max(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r','LineWidth',1.5);
legend('仿真值','理論值');
xlim(f_lim_range);grid;
title('pwelch(),Welch Method');xlabel('Hz');ylabel('dB/Hz');
subplot(2,2,3);
clear psd_matlab;clear f_matlab;
[psd_matlab,f_matlab] = pmtm(r2,4,'twosided',Nfft,fs);
psd_matlab = fftshift(psd_matlab);
len = length(f_matlab);
plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
%doppler shift
hold on;
plot(fm4,10*log10(Sf4),'-.r',min(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r',max(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r','LineWidth',1.5);
legend('仿真值','理論值');
xlim(f_lim_range);grid;
title('pmtm(),Multitaper method(MTM)');xlabel('Hz');ylabel('dB/Hz');
subplot(2,2,4);
clear psd_matlab;clear f_matlab;
[psd_matlab,f_matlab] = pyulear(r2,round(Nfft/20),'twosided',Nfft,fs);
psd_matlab = fftshift(psd_matlab);
len = length(f_matlab);
plot([-flipud(f_matlab(2:len/2+1));f_matlab(1:len/2)],10*log10(psd_matlab));
%doppler shift
hold on;
plot(fm4,10*log10(Sf4),'-.r',min(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r',max(fm4).*ones(1,2),[min(10*log10(psd_matlab)),max(10*log10(Sf4))],'-.r','LineWidth',1.5);
legend('仿真值','理論值');
xlim(f_lim_range);grid;
title('pyulear(),Yule-Walker AR Method');xlabel('Hz');ylabel('dB/Hz');
clear r2;
else
end
y=r1(:);%信道復變量
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -