【雷达】SAR Chirp Scaling(CS)算法+MATLAB代码(转载请标注德雅村支书)

https://blog.csdn.net/Nudt_EE_Wuhao/article/details/86523711

CS算法是SAR成像常见的一种算法,也是常见的SAR成像算法之一;本篇代码从github上下载,本人将在后期添加原理的说明,先给出matlab代码,并感谢原作者的无私分享。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%               正侧视
%                CSA
%              点目标仿真
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 该程序截止到 2014.10.29. 15:48 p.m.
% 点目标仿真


%%
clear;
close all;
clc;

%%
% --------------------------------------------------------------------
% 定义参数
% --------------------------------------------------------------------
R_nc = 20e3;            % 景中心斜距
Vr = 150;               % 雷达有效速度
Tr = 2.5e-6;            % 发射脉冲时宽
Kr = 20e12;             % 距离调频率
f0 = 5.3e9;             % 雷达工作频率
BW_dop = 80;            % 多普勒带宽
Fr = 60e6;              % 距离采样率
Fa = 200;               % 方位采样率
Naz = 1024;          	% 距离线数(即数据矩阵,行数)——这里修改为1024。
Nrg = 320;              % 距离线采样点数(即数据矩阵,列数)
sita_r_c = (0*pi)/180;	% 波束斜视角,0 度,这里转换为弧度
c = 3e8;                % 光速

R0 = R_nc*cos(sita_r_c);	% 与R_nc相对应的最近斜距,记为R0
Nr = Tr*Fr;             % 线性调频信号采样点数
BW_range = Kr*Tr;       % 距离向带宽
lamda = c/f0;           % 波长
fnc = 2*Vr*sin(sita_r_c)/lamda;     % 多普勒中心频率,根据公式(4.33)计算。
La_real = 0.886*2*Vr*cos(sita_r_c)/BW_dop;  % 方位向天线长度,根据公式(4.36)
beta_bw = 0.886*lamda/La_real;              % 雷达3dB波束
La = beta_bw*R0;        % 合成孔径长度
a_sr = Fr / BW_range;   % 距离向过采样因子
a_sa = Fa / BW_dop;     % 方位向过采样因子

Mamb = round(fnc/Fa);   % 多普勒模糊

NFFT_r = Nrg;           % 距离向FFT长度
NFFT_a = Naz;           % 方位向FFT长度

R_ref = R0;             % 参考目标选在场景中心,其最近斜距为 R_ref
fn_ref = fnc;        	% 参考目标的多普勒中心频率

% --------------------------------------------------------------------
% 设定仿真点目标的位置
% 以距离向作为x轴正方向
% 以方位向作为y轴正方向
% -------------------------------------------------------------------- 
delta_R0 = 0;       % 将目标1的波束中心穿越时刻,定义为方位向时间零点。
delta_R1 = 120; 	% 目标1和目标2的方位向距离差,120m
delta_R2 = 80;      % 目标2和目标3的距离向距离差,80m

% 目标1
x1 = R0;            % 目标1的距离向距离
y1 = delta_R0 + x1*tan(sita_r_c);	% 目标1的方位向距离

% 目标2
x2 = x1;            % 目标2和目标1的距离向距离相同
y2 = y1 + delta_R1; % 目标2的方位向距离
% 目标3
x3 = x2 + delta_R2;                 % 目标3和目标2有距离向的距离差,为delta_R2
y3 = y2 + delta_R2*tan(sita_r_c);  	% 目标3的方位向距离
% 定义以下数组,便于处理
x_range = [x1,x2,x3];
y_azimuth = [y1,y2,y3];

% 计算三个目标各自的波束中心穿越时刻
nc_1 = (y1-x1*tan(sita_r_c))/Vr;    % 目标1的波束中心穿越时刻。
nc_2 = (y2-x2*tan(sita_r_c))/Vr;    % 目标2的波束中心穿越时刻。
nc_3 = (y3-x3*tan(sita_r_c))/Vr;    % 目标3的波束中心穿越时刻。
nc_target = [nc_1,nc_2,nc_3];       % 定义该数组,便于处理。

%% 
% --------------------------------------------------------------------
% 距离(方位)向时间,频率相关定义
% --------------------------------------------------------------------
% 距离
tr = 2*R0/c + ( -Nrg/2 : (Nrg/2-1) )/Fr;                % 距离时间轴
fr = ( -NFFT_r/2 : NFFT_r/2-1 )*( Fr/NFFT_r );          % 距离频率轴
% 方位
ta = ( -Naz/2: Naz/2-1 )/Fa;                            % 方位时间轴
fa = fnc + fftshift( -NFFT_a/2 : NFFT_a/2-1 )*( Fa/NFFT_a );	% 方位频率轴

% 生成距离(方位)时间(频率)矩阵
tr_mtx = ones(Naz,1)*tr;    % 距离时间轴矩阵,大小:Naz*Nrg
ta_mtx = ta.'*ones(1,Nrg);  % 方位时间轴矩阵,大小:Naz*Nrg
fr_mtx = ones(Naz,1)*fr;    % 距离频率轴矩阵,大小:Naz*Nrg
fa_mtx = fa.'*ones(1,Nrg);  % 方位频率轴矩阵,大小:Naz*Nrg

%% 
% --------------------------------------------------------------------
% 生成点目标原始数据
% --------------------------------------------------------------------
s_echo = zeros(Naz,Nrg);    % 用来存放生成的回波数据

A0 = 1;                     % 目标回波幅度,都设置为1.
for k = 1:3                 % 生成k个目标的原始回波数据
    R_n = sqrt( (x_range(k).*ones(Naz,Nrg)).^2 + (Vr.*ta_mtx-y_azimuth(k).*ones(Naz,Nrg)).^2 );% 目标k的瞬时斜距
    w_range = ((abs(tr_mtx-2.*R_n./c)) <= ((Tr/2).*ones(Naz,Nrg)));     % 距离向包络,即距离窗
    % =====================================================================    
    % 方位向包络,也就是 天线的双程方向图作用因子。
    %{
    % 方式1
    % sinc平方型函数,根据公式(4.31)计算    
    % 用每个目标对应的 波束中心穿越时刻 。
    sita = atan( Vr.*(ta_mtx-nc_target(k).*ones(Naz,Nrg))/x_range(k) );
    w_azimuth1 = (sinc(0.886.*sita./beta_bw)).^2; 
    % w_azimuth1是天线双程方向图。
    % 下面的 w_azimuth2 是和方式2的矩形窗相同的构造方法,目的是:对天线双程
    % 方向图进行数据限制:限制为 1.135 个合成孔径长度。 
    w_azimuth2 = (abs(ta - nc_target(k)) <= (1.135*La/2)/Vr);    
    w_azimuth2 = w_azimuth2.'*ones(1,Nrg);	% 用来对 w_azimuth1 的天线双程方向图作数据限制。
    % 下面将两者相乘,得到仿真中所用的天线加权
    w_azimuth = w_azimuth1.*w_azimuth2;     % 两者相乘,得到仿真中所用的天线加权
    clear w_azimuth1;
    clear w_azimuth2;
    %}
    %
    % 方式2
    % 利用合成孔径长度,直接构造矩形窗(其实这里只是限制数据范围,没有真正加窗)
    w_azimuth = (abs(ta - nc_target(k)) <= (La/2)/Vr);    % 行向量
    w_azimuth = w_azimuth.'*ones(1,Nrg);    % 生成Naz*Nrg的矩阵
    %}
    % =====================================================================     
    s_k = A0.*w_range.*w_azimuth.*exp(-(1j*4*pi*f0).*R_n./c).*exp((1j*pi*Kr).*(tr_mtx-2.*R_n./c).^2);
    % 上式就是生成的某一个点目标(目标k)的回波信号。
    % 经过几次循环,生成几个点目标的回波信号,相加即可。
    if k == 1
        s_1 = s_k;          % 目标1的回波信号
    end
    if k == 2   
        s_2 = s_k;          % 目标2的回波信号
    end
    if k == 3
        s_3 = s_k;          % 目标3的回波信号
    end
    s_echo = s_echo + s_k;  % 所有点目标回波信号之和   
end
% s_echo 就是我们需要的原始数据,点目标回波信号。

% 作图
% 图1——原始数据
figure;
subplot(2,2,1);
imagesc(real(s_echo));
title('(a)实部');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');
text(300,-70,'图1,原始数据');       % 给图1进行文字说明 
% text 函数:在图像的指定坐标位置,添加文本框

subplot(2,2,2);
imagesc(imag(s_echo));
title('(b)虚部');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');

subplot(2,2,3);
imagesc(abs(s_echo));
title('(c)幅度');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');

subplot(2,2,4);
imagesc(angle(s_echo));
title('(d)相位');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');
% colormap(gray);

figure;
subplot(2,2,1);
imagesc(abs(fft(s_echo,[],1)));
title('RD 频谱幅度');
subplot(2,2,2);
imagesc(angle(fft(s_echo,[],1)));
title('RD 频谱相位');
subplot(2,2,3);
imagesc(abs(fft2(s_echo)));
title('二维频谱幅度');
subplot(2,2,4);
imagesc(angle(fft2(s_echo)));
title('二维频谱相位');
% colormap(gray);

%%
% --------------------------------------------------------------------
% 变换到距离多普勒域,进行“补余RCMC”
% --------------------------------------------------------------------
s_rd = s_echo.*exp(-1j*2*pi*fnc.*(ta.'*ones(1,Nrg))); 	% 数据搬移
S_RD = fft(s_rd,NFFT_a,1);  % 进行方位向傅里叶变换,得到距离多普勒域频谱

D_fn_Vr = sqrt(1-lamda^2.*(fa.').^2./(4*Vr^2));     % 徙动因子,列向量
D_fn_Vr_mtx = D_fn_Vr*ones(1,Nrg);  % 形成矩阵,大小:Nrg*Naz

D_fn_ref_Vr = sqrt(1-lamda^2*fn_ref^2/(4*Vr^2));    % 参考频率fn_ref处的徙动因子,是常数。

K_src = 2*Vr^2*f0^3.*D_fn_Vr.^3./(c*R_ref*(fa.').^2);   % 列向量,使用R_ref处的值 
K_src_mtx = K_src*ones(1,Nrg);  % 形成矩阵
Km = Kr./(1-Kr./K_src_mtx);     % 矩阵,这是变换到距离多普勒域的距离调频率。
                                % 使用 R_ref 处的值

% 下面生成 变标方程 s_sc
s_sc = exp(1j*pi.*Km.*(D_fn_ref_Vr./D_fn_Vr_mtx-1).*(tr_mtx-2*R_ref./(c.*D_fn_Vr_mtx)).^2);

% 下面将距离多普勒域的信号与变标方程相乘,实现“补余RCMC”
S_RD_1 = S_RD.*s_sc;        % 相位相乘,实现“补余RCMC”

% 作图
figure;
imagesc(abs(S_RD));
title('原始数据变换到距离多普勒域,幅度');
figure;
imagesc(abs(S_RD_1));
title('距离多普勒域,补余RCMC后,幅度');

%% 
% --------------------------------------------------------------------
% 变换到二维频域,进行“距离压缩,SRC,一致RCMC”
% --------------------------------------------------------------------
S_2df_1 = fft(S_RD_1,NFFT_r,2);         % 进行距离向FFT,变换到二维频域。距离零频在两端

% 完成距离压缩,SRC,一致RCMC这三者相位补偿的滤波器为:
H1 = exp(1j*pi.*D_fn_Vr_mtx./(D_fn_ref_Vr.*Km).*fr_mtx.^2)...
    .*exp(1j*4*pi/c.*(1./D_fn_Vr_mtx-1/D_fn_ref_Vr).*R_ref.*fr_mtx);
% 上面的H1距离零频在中心
W_ref = ones(Naz,1)*(kaiser(Nrg,3).');	% 距离向,构建Kaiser窗,此为矩阵形式,距离零频在中心。
% H1 = W_ref.*H1;             % 加入距离平滑窗,以抑制旁瓣,距离零频在中心。
% 下面通过fftshift将H1的距离零频调整到两端
H1 = fftshift(H1,2);        % 左右半边互换,距离零频在两端。

S_2df_2 = S_2df_1.*H1;    	% 在二维频域,相位相乘,实现距离压缩,SRC,一致RCMC

S_RD_2 = ifft(S_2df_2,NFFT_r,2);    % 进行距离IFFT,回到距离多普勒域,完成所有距离处理。

% 作图
figure;
imagesc(abs(S_2df_1));
title('变换到二维频域');
figure;
imagesc(abs(S_2df_2));
title('相位相乘,实现距离压缩,SRC,一致RCMC后,二维频域');

figure;
imagesc(abs(S_RD_2));
title('完成距离压缩,SRC,一致RCMC后,距离多普勒域');

%%
% --------------------------------------------------------------------
% 距离多普勒域,完成“方位压缩”和“附加相位校正”
% --------------------------------------------------------------------
R0_RCMC = (c/2).*tr;   % 随距离线变化的R0,记为R0_RCMC,用来计算方位MF。

% 生成方位向匹配滤波器
Haz = exp(1j*4*pi.*(D_fn_Vr*R0_RCMC).*f0./c);       % 方位MF

% 附加相位校正项
H2 = exp(-1j*4*pi.*Km./(c^2).*(1-D_fn_Vr_mtx./D_fn_ref_Vr)...
    .*((1./D_fn_Vr)*R0_RCMC-R_ref./D_fn_Vr_mtx).^2); 	% 附加相位校正项

% 下面进行相位相乘,在距离多普勒域,同时完成方位MF和附加相位校正
S_RD_3 = S_RD_2.*Haz.*H2;           % 距离多普勒域,相位相乘

% 最后通过IFFT回到图像域,完成方位处理
s_image = ifft(S_RD_3,NFFT_a,1); 	% 完成成像过程,得到成像结果为:s_image

% 作图
figure;
imagesc(abs(S_RD_3));
title('距离多普勒域,进行了相位相乘后(方位MF和附加相位校正)');

figure;
imagesc(abs(s_image));
title('成像结果');

%%
% 下面通过调用函数,得到三个点目标各自的切片,并进行升采样
% 同时对点目标中心做距离向切片,方位向切片
% 计算出相应的指标:PSLR,ISLR,IRW
NN = 20;
% 分别得到每个点目标的切片放大;行切片、列切片;和相应的指标

% 目标1,点目标中心在 ( tg_1_x,tg_1_y )
% 由于这里是正侧视,因此有两种方法来计算方位向的位置:
% =========================================================================
% 方式1
% tg_1_x = round(Naz/2);          % 正侧视,目标A的方位向位置就在图像中心。

% 方式2
% 在有斜视角时,方位向位置要通过以下的方式计算。以下程序对于正侧视也兼容,如下:
tg_1_x = rem( R0*tan(sita_r_c)/Vr*Fa , Naz );
if tg_1_x < Naz/2
    tg_1_x = tg_1_x + (Naz/2+1);
else
    tg_1_x = tg_1_x - (Naz/2+1);
end
tg_1_x = round(tg_1_x);    	% 四舍五入,得到整数值,作为点目标的方位中心坐标。
% 这里得到的 tg_1_x 即是点目标中心方位向的位置(坐标)。
% =========================================================================
tg_1_y = round(Nrg/2);
target_1 = target_analysis( s_image(tg_1_x-NN:tg_1_x+NN,tg_1_y-NN:tg_1_y+NN),Fr,Fa,Vr);


% 目标2,点目标中心在 (tg_2_x,target_2_y)
tg_2_x = tg_1_x + delta_R1/Vr*Fa;
tg_2_y = tg_1_y;
target_2 = target_analysis( s_image(tg_2_x-NN:tg_2_x+NN,tg_2_y-NN:tg_2_y+NN),Fr,Fa,Vr);


% 目标3,点目标中心在(tg_3_x,tg_3_y)
tg_3_x = tg_2_x + delta_R2*tan(sita_r_c)/Vr*Fa;
tg_3_x = fix(tg_3_x);
tg_3_y = tg_2_y + 2*delta_R2/c*Fr;
target_3 = target_analysis( s_image(tg_3_x-NN:tg_3_x+NN,tg_3_y-NN:tg_3_y+NN),Fr,Fa,Vr);

转载请标注:德雅村支书,谢谢!

你可能感兴趣的:(radar)