零记忆非线性变换法(ZMNL:Zero Memory Nonlinearity)的思路清晰,是目前使用最多的经典算法。ZMNL法的基本思路是:首先产生相关的高斯随机序列,然后经某种非线性变换得到需要的相关非高斯随机序列。其过程如下图所示:
图中,先产生不相关的高斯白噪声序列,经过线性滤波器,使其满足谱特性,即经过后得到的杂波序列,其功率谱函数为系统幅频函数的平方,其幅度分布仍然服从高斯分布。杂波序列经过非线性滤波器后得到随机序列,即为所需要的杂波序列。其中滤波器使序列满足特定的幅度分布特性。
该法最关键也是比较困难的地方就是由给定的非高斯序列的相关函数推导得出变换之前的高斯序列的相关函数,而且非线性关系会随杂波幅度分布的不同而不同。
ZMNL方法可以实现对对数正态分布、韦布尔分布、K分布等相关非高斯分布杂波的模拟仿真,且比较容易实现、运算速度快,是杂仿真中常用的方法。
使用的是MATLAB R2016b版本,关于各种分布的理论知识在这里我就不多说了,直接上程序。程序运行出现三种图,分别为:杂波波形图、杂波幅度分布图和杂波功率谱。
瑞利分布
clear all;close all;
azi_num=2000; %取2000个点
fr=1000; %雷达重复频率
lamda0=0.05; %杂波波长
sigmav=1.0; %杂波方差
sigmaf=2*sigmav/lamda0;
rand('state',sum(100*clock)); %产生服从U(0,1)分布的随机序列
d1=rand(1,azi_num);
rand('state',7*sum(100*clock)+3);
d2=rand(1,azi_num);
xi=2*sqrt(-2*log(d1)).*cos(2*pi*d2); %正交且独立的高斯序列N(0,1)
xq=2*sqrt(-2*log(d1)).*sin(2*pi*d2);
%形成滤波器频率响应
coe_num=12; %求滤波器系数,用傅里叶级数展开法
for n=0:coe_num
coeff(n+1)=2*sigmaf*sqrt(pi)*exp(-4*sigmaf^2*pi^2*n^2/fr^2)/fr;
end
for n=1:2*coe_num+1
if n<=coe_num+1
b(n)=1/2*coeff(coe_num+2-n);
else
b(n)=1/2*coeff(n-coe_num);
end
end
%生成高斯谱杂波
xxi=conv(b,xi);
xxq=conv(b,xq);
xxi=xxi(coe_num*2+1:azi_num+coe_num*2);%目的是去掉暂态响应
xxq=xxq(coe_num*2+1:azi_num+coe_num*2);
xisigmac=std(xxi);
ximuc=mean(xxi);
yyi=(xxi-ximuc)/xisigmac;
xqsigmac=std(xxq);
xqmuc=mean(xxq);
yyq=(xxq-xqmuc)/xqsigmac; %归一化
sigmac=1.2 ; %杂波的标准差
yyi=sigmac*yyi; %使瑞利分布杂波具有指定的标准差
yyq=sigmac*yyq; %使瑞利分布虚部杂波
ydata=yyi+j*yyq; %瑞利分布杂波形成
figure;
subplot(211);plot(real(ydata)); %瑞利分布杂波实部
title('瑞利杂波时域波形,实部');
subplot(212);plot(imag(ydata)); %瑞利分布杂波虚部
title('瑞利杂波时域波形,虚部')
num=100; %求概率密度函数的参数
maxdat=max(abs(ydata));
mindat=min(abs(ydata));
NN=hist(abs(ydata),num);
xpdf1=num*NN/((sum(NN))*(maxdat-mindat)); %用直方图估计的概率密度函数
xaxisl=mindat:(maxdat-mindat)/num:maxdat-(maxdat-mindat)/num;
th_val=(xaxisl./sigmac.^2).*exp(-xaxisl.^2./(2*sigmac.^2)); %概率密度函数理论值
figure;
plot(xaxisl,xpdf1); %做出仿真结果的概率密度函数曲线
hold on;plot(xaxisl,th_val,'r:'); %做出理论概率密度函数曲线
title('杂波幅度分布');
xlabel('幅度');ylabel('概率密度');
signal=ydata;
signal=signal-mean(signal); %求功率谱密度,先去掉直流分量
figure;M=256; %用burg法估计功率谱密度
psd_dat=pburg(real(signal),32,M,fr);
psd_dat=psd_dat/(max(psd_dat)); %归一化处理
freqx=0:0.5*M;
freqx=freqx*fr/M;
plot(freqx,psd_dat);title('杂波频谱');
xlabel('频率/HZ');ylabel('功率谱密度');
%做出理想高斯谱曲线
powerf=exp(-freqx.^2/(2*sigmaf.^2));
hold on;plot(freqx,powerf,'r:');
clear all;
close all;
clc
azi_num=2000;
fr=1000;
lamda0=0.05;
sigmav=1.0;
sigmaf=2*sigmav/lamda0;
% rand('state',sum(100*clock));
d1=rand(1,azi_num);
% rand('state',7*sum(100*clock)+3);
d2=rand(1,azi_num);
xi=1*(sqrt(-2*log(d1)).*cos(2*pi*d2));
xq=2*(sqrt(-2*log(d1)).*sin(2*pi*d2));
coe_num=12;
for n=0:coe_num
coeff(n+1)=2*sigmaf*sqrt(pi)*exp(-4*sigmaf^2*pi^2*n^2/fr^2)/fr;
end
for n=1:2*coe_num+1
if n<=coe_num+1
b(n)=1/2*coeff(coe_num+2-n);
else
b(n)=1/2*coeff(n-coe_num);
end
end
xxi=conv(b,xi);
xxi=xxi(coe_num*2+1:azi_num+coe_num*2);
xxq=conv(b,xq);
xxq=xxq(coe_num*2+1:azi_num+coe_num*2);
vmuc=2;
xisigmac=std(xxi);
ximuc=mean(xxi);
xxi=(xxi-ximuc)/xisigmac;
xqsigmac=std(xxq);
xqmuc=mean(xxq);
xxq=(xxq-xqmuc)/xqsigmac;
xdata=xxi+j*xxq;
tmpdat=randn(1,azi_num);
[b,a]=butter(5,0.01);
sk_dat=filter(b,a,tmpdat);
sk_dat=sk_dat/std(sk_dat);
%%%%%%%%%%%%%%下面的程序解非线性方程%%%%%%%%%%%%%%%
max_z=6;
step=0.005;
table_z=0:step:max_z;
table_s=nonline_eq_sirp(table_z,vmuc);
for n=1:azi_num
index=floor(abs(sk_dat(n))/max_z*length(table_z)+1);%length数组长度
sk_dat(n)=table_s(index);
end
ydata=xdata.*sk_dat;
figure,subplot(2,1,1),plot(real(ydata)), title('K分布杂波时域波形,实部');
subplot(2,1,2),plot(imag(ydata)),title('K分布杂波时域波形,虚部');
%%%%%%%%求概率密度函数的参数%%%%%%%%%%%%%%%%%%
num=100;
maxdat=max(abs(ydata));
mindat=min(abs(ydata));
NN=hist(abs(ydata),num);
xpdf1=num*NN/((sum(NN))*(maxdat-mindat));
xaxis1=mindat:(maxdat-mindat)/num:maxdat-(maxdat-mindat)/num;
alpha=sqrt(std(xdata).^2./(2*vmuc));%std()算xdata标准差
th_val=lognpdf(xaxis1,xpdf1);
% xpdf1=getnpdf(abs(xdata),num,maxdat,mindat);
xaxis1=mindat:(maxdat-mindat)/num:maxdat-(maxdat-mindat)/num;
th_val=2*((xaxis1/(2*alpha)).^vmuc).*besselk((vmuc-1),xaxis1/alpha)./(alpha*gamma(vmuc));
figure,plot(xaxis1,xpdf1);
hold,plot(xaxis1,th_val,':r'),title('杂波幅度分布'),xlabel('幅度'),
ylabel('概率密度');
signal=ydata;
signal=signal-mean(ydata);
M=256;
psd_dat=pburg(real(signal),16,M,fr);
psd_dat=psd_dat/(max(psd_dat));
freqx=0:0.5*M;
freqx=freqx*fr/M;
figure,plot(freqx,psd_dat);
title('杂波频谱'),xlabel('频率/Hz'),
ylabel('功率谱密度');
%%%%%%%% 理想高斯曲线%%%%%%%%%%%%
powerf=exp(-freqx.^2/(2*sigmaf.^2));
hold;
plot(freqx,powerf,':r');
function s=nonline_eq_sirp(z,nu)
%
for m=1:length(z)
max_s=10;
min_s=0;
isexistmax=0;
F_z=0.5+0.5*erf(z(m)/sqrt(2));
if (F_z>0.9999999)
s(m)=inf;
else
for k=1:10000
if (gammainc(nu*max_s*max_s,nu)F_z)
max_s=s(m);
else
min_s=s(m);
end
s0=s(m);
s(m)=0.5*(max_s+min_s);
if (abs(s(m)-s0)<0.0001)
break;
end
end
end
end
end
clear all;close all;
azi_num=2000;
fr=1000;
lamda0=0.05;
sigmav=1.0;
sigmaf=2*sigmav/lamda0;
rand('state',sum(100*clock));
d1=rand(1,azi_num);
rand('state',7*sum(100*clock)+3);
d2=rand(1,azi_num);
xi=1*(sqrt(-2*log(d1)).*cos(2*pi*d2));
xq=2*sqrt(-2*log(d1)).*sin(2*pi*d2);
coe_num=12;
for n=0:coe_num
coeff(n+1)=2*sigmaf*sqrt(pi)*exp(-4*sigmaf^2*pi^2*n^2/fr^2)/fr;
end
for n=1:2*coe_num+1
if n<=coe_num+1
b(n)=1/2*coeff(coe_num+2-n);
else
b(n)=1/2*coeff(n-coe_num);
end
end
%Gaussion clutter generation
xxi=conv(b,xi);
xxi=xxi(coe_num*2+1:azi_num+coe_num*2);
xisigmac=std(xxi);
ximuc=mean(xxi);
yyi=(xxi-ximuc)/xisigmac;
muc=1.5;
sigmac=0.6;
yyi=sigmac*yyi+log(muc);
xdata=exp(yyi);
figure,plot(xdata);xlabel('时间');ylabel('幅度');title('对数正态分布杂波时域波形');
num=100;
maxdat=max(abs(xdata));
mindat=min(abs(xdata));
NN=hist(abs(xdata),num);
xpdf1=num*NN/((sum(NN)*(maxdat-mindat)));
xaxis1=mindat:(maxdat-mindat)/num:maxdat-(maxdat-mindat)/num;
th_val=lognpdf(xaxis1,log(muc),sigmac);
figure;plot(xaxis1,xpdf1);
hold,plot(xaxis1,th_val,':r');
title('杂波幅度分布');xlabel('幅度');ylabel('概率密度');
signal=xdata;
signal=signal-mean(signal);
figure,M=128;
psd_dat=pburg(real(signal),16,M,fr);
psd_dat=psd_dat/(max(psd_dat));
freqx=0:0.5*M;
freqx=freqx*fr/M;
plot(freqx,psd_dat);title('杂波频谱');xlabel('频率(Hz)');ylabel('功率谱密度');
powerf=exp(-freqx.^2/(2*sigmaf.^2));
hold;plot(freqx,powerf,':r');
clear all;close all;
azi_num=2000;
fr=1000;
lamda0=0.05;
sigmav=0.7;
sigmaf=2*sigmav/lamda0;
rand('state',sum(100*clock));
d1=rand(1,azi_num);
rand('state',7*sum(100*clock)+3);
d2=rand(1,azi_num);
xi=1*(sqrt(-2*log(d1)).*cos(2*pi*d2));
xq=2*sqrt(-2*log(d1)).*sin(2*pi*d2);
coe_num=12;
for n=0:coe_num
coeff(n+1)=2*sigmaf*sqrt(pi)*exp(-4*sigmaf^2*pi^2*n^2/fr^2)/fr;
end
for n=1:2*coe_num+1
if n<=coe_num+1
b(n)=1/2*coeff(coe_num+2-n);
else
b(n)=1/2*coeff(n-coe_num);
end
end
%Gaussion clutter generation
xxi=conv(b,xi);
xxq=conv(b,xq);
xxi=xxi(coe_num*2+1:azi_num+coe_num*2);
xxq=xxq(coe_num*2+1:azi_num+coe_num*2);
xisigmac=std(xxi);
ximuc=mean(xxi);
yyi=(xxi-ximuc)/xisigmac;
xqsigmac=std(xxq);
xqmuc=mean(xxq);
yyq=(xxq-xqmuc)/xqsigmac;
p=1.5;%形状参数
q=2.2;%尺度参数
sigmac=sqrt((q.^p)/2);
yyi=sigmac*yyi;
yyq=sigmac*yyq;
xdata=(yyi.*yyi+yyq.*yyq).^(1/p);
figure,plot(xdata);xlabel('时间');ylabel('幅度');title('韦布尔分布杂波时域波形');
num=100;
maxdat=max(abs(xdata));
mindat=min(abs(xdata));
NN=hist(abs(xdata),num);
xpdf1=num*NN/((sum(NN)*(maxdat-mindat)));
xaxis1=mindat:(maxdat-mindat)/num:maxdat-(maxdat-mindat)/num;
th_val=p*(xaxis1.^(p-1)).*exp(-(xaxis1/q).^p)./(q.^p);
figure;plot(xaxis1,xpdf1);
hold,plot(xaxis1,th_val,':r');
title('杂波幅度分布');xlabel('幅度');ylabel('概率密度');
signal=xdata;
signal=signal-mean(signal);
figure,M=256;
psd_dat=pburg(real(signal),16,M,fr);
psd_dat=psd_dat/(max(psd_dat));
freqx=0:0.5*M;
freqx=freqx*fr/M;
plot(freqx,psd_dat);title('杂波频谱');xlabel('频率(Hz)');ylabel('功率谱密度');
powerf=exp(-freqx.^2/(2*sigmaf.^2));
hold;plot(freqx,powerf,':r');
上面是各个杂波统计模型的MATLAB程序,对于完整杂波模拟器的下载链接为:
https://pan.baidu.com/share/init?surl=igBqdiO-f5x-xYWrLEWvUg
提取码:qhp1
操作方法:
把所有代码打开,运行主界面代码(Radarclutter.m)即可出现选择界面。