CS(Chirp Scaling)算法通过相位相乘的形式避免了插值操作,相比于RD算法极大的提高了SAR的成像效率。
仿真代码如下
close all; clear; clc;
c=3e8;%光速
%% 仿真参数
theta = 45; %下视角
thetac = 0; %斜视角
pd = 3; %地距分辨力为3mxy均为3m
pr0 = 3; %方位向分辨力
pr = pd*cosd(theta); %距离分辨力c/2B=>B>c/2pr
h = 40e3; %飞行高度h=10e3;
gr = h*tand(theta); %地距
Rc = h/cosd(theta)/cosd(thetac); %中心穿越时刻距离(距离场景中心距离,对于波束内部的其他点有所差异)
% widthr = 1000; %测绘带宽为1000m,y方向
% widtha = 1000; %方位向带宽x方向1000m
vs = 7500;
vr = vs/1.06; %卫星比等效速度大6% 参考第90页vr=250;%雷达有效速度
vg = vr/1.06;
vr=vs;
% Rc=30e3;%景中心斜距
Tp=10e-6;%脉冲宽度
B=150e6;%信号带宽
Kr=B/Tp;%距离脉冲调频率
fs=1.2*B;%距离采样率
fc=10e9;%载波频率
lambda=c/fc;%波长
% Ka=2*vr^2/lambda/Rc;%方位向调频率
la=2*pr0;%天线真实孔径
fdwidth=0.886*2*vr/la;%多普勒带宽
prf = 5e3; %脉冲重复频率
im=sqrt(-1);%虚数单位
thetac=0;%斜视角度,正侧视
fd0=2*vr*sin(thetac*pi/180)/lambda;%参考中心频率,取多普勒中心频率f_etac 4.34
ls=0.886*Rc*lambda/la;%合成孔径长度
Ta=ls/vr;%目标照射时间
%% 成像区域[Xc-X0,Xc+X0; Yc-Y0,Yc+Y0]
Xc = sqrt(Rc^2-h^2);
Yc = 0;
Xo = 500;
Yo = 500;
Rmin=sqrt(h^2+(Xc-Xo)^2);%观测场景距飞机的最近距离
Rmax=sqrt(h^2+(Xc+Xo)^2);%观测场景距飞机的最远距离
Ra=ls+2*Yo;%正侧视时雷达在方位向行走距离
centerpos=[gr,0,0];
%% 目标位置
target=[centerpos;gr+50,centerpos(2)+50,0;gr-30,centerpos(2)-20,0;gr+50,centerpos(2),0;gr+150,centerpos(2),0]; %点目标位置(第一个为方位向,第二个为 距离向)
widthr = 1000;widtha=1000;
xylim = [gr-widthr/2,gr+widthr/2;-widtha/2,widtha/2;0,0];%成像区域范围
figure;plot(target(:,1),target(:,2),'r.','Markersize',10);
xlim([xylim(1,1),xylim(1,2)]);ylabel('方位向距离/m');xlabel('距离向距离/m'); ylim([xylim(2,1),xylim(2,2)]);title('目标位置')
%% 生成回波
tm=-Ra/vr/2:1/prf:Ra/vr/2-1/prf;%慢时间轴
tk=2*Rmin/c-Tp/2:1/fs:2*Rmax/c+Tp/2-1/fs;%快时间轴
r=sqrt((tk*c/2).^2-h^2);%距离向横坐标
x=r;
nm=length(tm);%方位向采样点数
nk=length(tk);%距离向采样点数
echoall=zeros(nm,nk);%回波
y=vr*tm;%飞机的位置(注意:慢时间轴不同时表达式不同)
Rtm=zeros(size(target,1),nm);
A0=1;%幅度
bar = waitbar(0,"回波生成...");
radar = [zeros(length(tm),1),y',h*ones(length(tm),1)]; %卫星坐标
% Rtm1 = sqrt(sum((target(1,:)-[0,y(280),h]).^2)); plot(rectpuls(tk-2*Rtm1/c-Tp/2,Tp));
for k=1:size(target,1) %目标数
echo=[];
Rtm = sqrt((target(k,1).*ones(length(tm),1)-radar(:,1)).^2+...
(target(k,2).*ones(length(tm),1)-radar(:,2)).^2+...
(target(k,3).*ones(length(tm),1)-radar(:,3)).^2)*ones(1,length(tk));
echo(:,:,k)=(abs(target(k,2)-y')*ones(1,length(tk))<ls/2).*(abs((ones(length(tm),1)*tk-2.*Rtm/c)/2)<=Tp/2).*...
exp(1j*2*pi*fc.*(-2*Rtm./c)+1j*pi*Kr*(tk-2.*Rtm./c).^2); %回波模型(停走模型)
waitbar(k/size(target,1),bar)
echoall = echo(:,:,k) + echoall;
end
close(bar)
% for i=1:size(target,1)
tk_mat = ones(nm,1)*tk; %距离时间轴矩阵
ta_mtx = tm.'*ones(1,nk); %方位时间轴矩阵
ft_mat = ones(nm,1)*linspace(-fs/2,fs/2,nk); %距离频率轴矩阵
fdc=2*vr*sin(thetac*pi/180)/lambda;%参考中心频率,取多普勒中心频率f_etac 4.34
fd1=fdc+linspace(-prf/2,prf/2,nm).'*ones(1,nk);%方位频率轴矩阵
f=linspace(-fs/2,fs/2,nk);
HFk = rectpuls(f,Kr*Tp).*exp(-1j*pi*(f+0).^2./Kr); %PSP计算已经下变频不需要-fc,若以及移动Tp/2要注意移动+B/2(移动Tp/2)
fd = fdc+linspace(-prf/2,prf/2,nm);
figure,imagesc(tk,tm,abs(echoall)) ;title('原始回波幅度')
figure,imagesc(tk,tm,angle(echoall)) ;title('原始回波相位')
caxis([0 1]);axis xy
%% 方位向傅里叶变换
echoallrd=zeros(nm,nk);
% for i=1:nk
% echoallrd(:,i)= fftshift(fft((echoall(:,i)),nm));%转换到多普勒域
% end
echoallrd= fftshift(fft(echoall,nm,1),1);%转换到多普勒域
figure;imagesc(x,fd,abs(echoallrd));title('原始回波幅度距离多普勒域');xlim([xylim(1,1),xylim(1,2)]);
% figure;
% imagesc(abs(echoallrd));
%% Chirp Scaling 操作
Dfd=sqrt(1-(c*fd1).^2/(4*vr^2*fc^2));%徙动参数7.17
Km=Kr./(1-(Kr*c*Rc*fd1.^2)./(2*vr^2*fc^3*Dfd.^3));%改变后的距离向调频率7.18
Dfdc=sqrt(1-(c*fdc).^2/(4*vr^2*fc^2));%7.18
% tao_pie=tk_mat-2*Rc./(c*Dfd);%新的距离时间7.27
srcm=exp(im*pi*Km.*(Dfdc./Dfd-1).*(tk_mat-2*Rc./(c*Dfd)).^2);%变标方程7.30
echorcm1rd=echoallrd.*srcm;%变标后
%% 距离向傅里叶变换
echorcm1ff=zeros(nm,nk);
echorcm1ff = fftshift(fft(echorcm1rd,[],2),2);%二维频域
%% 距离压缩,SRC,一致RCMC
f_tao=ones(nm,1)*linspace(-fs/2,fs/2,nk);
echorcm2ff=zeros(nm,nk);
echorcm2ff=echorcm1ff.*exp(im*pi.*Dfd./(Dfdc.*Km).*ft_mat.^2).*...
exp(im*4*pi/c*(1./Dfd-1./Dfdc)*Rc.*ft_mat);%7.32
%% 距离向傅里叶逆变换
echorcm2=zeros(nm,nk);
echorcm2=ifft(fftshift(echorcm2ff,2),[],2);%多普勒域
%% 方位向匹配滤波以及附加相位校正
echorcmc1=zeros(nm,nk);
echorcmc1= echorcm2.*exp(im*4*pi*Rc*fc*Dfd/c).*...
exp(im*4*pi*Km/c^2.*(1-Dfd./Dfdc).*(Rc./...
Dfd-Rc./Dfdc).^2);%方位压缩以及附加相位补偿7.32
%% SAR成像结果
res_image=zeros(nm,nk);
% for i = 1:nk
% res_image(:,i) = ifft(echorcmc1(:,i)); %变回SAR图像域
% end
res_image = ifft(echorcmc1,[],1); %变回SAR图像域
figure;[R,Y] = meshgrid(r,y);
mesh(R,Y,abs(( res_image)));view(0,90);xlim([xylim(1,1),xylim(1,2)]);
ylabel('方位向距离/m');xlabel('距离向距离/m'); ylim([xylim(2,1),xylim(2,2)]);title('成像结果')
参考资料《合成孔径雷达成像算法与实现》——lan G. Cumming, et al.