(二)SAR成像仿真——RDA点目标仿真

目录

本文仅对 github.com/denkywu/SAR-Synthetic-Aperture-Radar/tree/master/1-SAR成像算法/RD算法 做简单分析。

一、原始数据采集

1、雷达参数

matlab 复制代码
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 = (3.5*pi)/180;	% 波束斜视角,3.5 度,这里转换为弧度
c = 3e8;                    % 光速

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

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

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

(1)最近斜距 R 0 R_0 R0
R 0 = R ( η c ) c o s θ r , c \begin{align} R_0=R(\eta_c)\mathrm{cos}\theta_{r,c} \end{align} R0=R(ηc)cosθr,c其中, θ r , c \theta_{r,c} θr,c为雷达波束中心的斜视角。

(2)多普勒中心频率 f η c f_{\eta_c} fηc

多普勒频率 f η f_\eta fη计算为
f η = 1 2 π d ϕ ( η ) d η = − 2 λ d R ( η ) d η f_\eta=\frac{1}{2\pi}\frac{\mathrm{d}\phi(\eta)}{\mathrm{d}\eta}=-\frac{2}{\lambda}\frac{\mathrm{d}R(\eta)}{\mathrm{d}\eta} fη=2π1dηdϕ(η)=−λ2dηdR(η)其中, ϕ ( η ) \phi(\eta) ϕ(η)和 R ( η ) R(\eta) R(η)分别为相位历程和距离历程。距离历程 R ( η ) R(\eta) R(η)满足:
R 2 ( η ) = R 0 2 + V r 2 η 2 R^2(\eta)=R_0^2+V_r^2\eta^2 R2(η)=R02+Vr2η2两边对 η \eta η求导得
d R ( η ) d η = V r 2 η R ( η ) \frac{\mathrm{d}R(\eta)}{\mathrm{d}\eta}=\frac{V_r^2\eta}{R(\eta)} dηdR(η)=R(η)Vr2η代入 f η f_\eta fη得
f η = − 2 V r 2 η λ R ( η ) f_\eta=-\frac{2V_r^2\eta}{\lambda R(\eta)} fη=−λR(η)2Vr2η多普勒中心频率 f η c f_{\eta_c} fηc计算为
f η c = − 2 V r 2 η c λ R ( η c ) = 2 V r s i n θ r , c λ \begin{align} f_{\eta_c}=-\frac{2V_r^2\eta_c}{\lambda R(\eta_c)}=\frac{2V_r\mathrm{sin}\theta_{r,c}}{\lambda} \end{align} fηc=−λR(ηc)2Vr2ηc=λ2Vrsinθr,c

(3)多普勒带宽 Δ f d o p \Delta f_{dop} Δfdop

目标照射时间是目标处于3dB波束范围内的时间宽度,计算为
T a = 0.886   λ   R ( η c ) L a   V g cos ⁡ θ r , c T_a = 0.886 \, \frac{\lambda \, R(\eta_c)}{L_a \, V_g \cos\theta_{r,c}} Ta=0.886LaVgcosθr,cλR(ηc)其中, L a L_a La为天线的方位向长度, V g V_g Vg为地速,在等效直线几何中 V r = V g V_r=V_g Vr=Vg。

方位向调频率 K a K_a Ka是多普勒频率的变化率:
K a = 2 λ d 2 R ( η ) d η 2 ∣ η = η c = 2 V r 2 cos ⁡ 2 θ r , c λ   R ( η c ) K_a = \left. \frac{2}{\lambda} \frac{\mathrm{d}^2 R(\eta)}{\mathrm{d}\eta^2} \right|{\eta=\eta_c} = \frac{2 V_r^2 \cos^2 \theta{r,c}}{\lambda \, R(\eta_c)} Ka=λ2dη2d2R(η) η=ηc=λR(ηc)2Vr2cos2θr,c

可以得到多普勒带宽:
Δ f d o p = ∣ K a ∣ ⋅ T a = 0.886 2 V r cos ⁡ θ r , c L a \begin{align} \Delta f_{dop}=|K_a|\cdot T_a=0.886\frac{2V_r\cos\theta_{r,c}}{L_a} \end{align} Δfdop=∣Ka∣⋅Ta=0.886La2Vrcosθr,c

2、点目标回波信号

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

% 目标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*x1/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 + ( -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

%% 
% --------------------------------------------------------------------
% 生成点目标原始数据
% --------------------------------------------------------------------
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)));     % 距离向包络,即距离窗
    % =====================================================================    
    % 方位向包络,也就是 天线的双程方向图作用因子。
    % 利用合成孔径长度,直接构造矩形窗(其实这里只是限制数据范围,没有真正加窗)
    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)的回波信号,根据文中公式(4)计算
    
    % 经过几次循环,生成几个点目标的回波信号,相加即可。
    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;
imagesc(abs(s_echo));
title('原始数据');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');


(五)SAR成像原理------回波模型

雷达系统接收到的单个点目标经过解调后的基带信号为
s ( τ , η ) = A 0 w a ( η − η c )   w r  ⁣ ( τ − 2 R ( η ) c ) × exp ⁡ { − j   4 π f 0 R ( η ) c } exp ⁡ { j π K r ( τ − 2 R ( η ) c ) 2 } \begin{align} s(\tau, \eta) &= A_0w_a(\eta - \eta_c) \, w_r\!\left(\tau - \frac{2R(\eta)}{c}\right) \notag \\ &\quad \times \exp\left\{-j\,4\pi f_0 \frac{R(\eta)}{c}\right\} \exp\left\{j\pi K_r \left(\tau - \frac{2R(\eta)}{c}\right)^2\right\} \end{align} s(τ,η)=A0wa(η−ηc)wr(τ−c2R(η))×exp{−j4πf0cR(η)}exp{jπKr(τ−c2R(η))2}只需分别计算目标1、目标2、目标3的距离历程 R 1 ( η ) R_1(\eta) R1(η)、 R 2 ( η ) R_2(\eta) R2(η)、 R 3 ( η ) R_3(\eta) R3(η),代入式(4)分别得到各自的解调后的基带信号 s 1 ( τ , η ) s_1(\tau, \eta) s1(τ,η)、 s 2 ( τ , η ) s_2(\tau, \eta) s2(τ,η)、 s 3 ( τ , η ) s_3(\tau, \eta) s3(τ,η),需要处理的原始数据即为 s echo = s 1 + s 2 + s 3 s_\text{echo}=s_1+s_2+s_3 secho=s1+s2+s3。


二、低斜视角情况

适合小小斜视角及短孔径下的基本RDA处理框图如下图所示。

1、距离压缩

matlab 复制代码
% 距离压缩
% --------------------------------------------------------------------
S_range = fft(s_echo,NFFT_r,2);     % 进行距离向傅里叶变换,零频在两端。

% 生成距离向匹配滤波器
% ====================================================
% 采用方式2
% 时域复制脉冲,末端补零,fft,再取复共轭。
t_ref = ( -Nr/2 : (Nr/2-1) )/Fr;    % 用来生成距离MF的距离时间轴
t_ref_mtx = ones(Naz,1)*t_ref;      % 矩阵形式
w_ref = kaiser(Nr,2.5);             % 距离向,构建Kaiser窗,此为列向量。
w_ref = ones(Naz,1)*(w_ref.');      % 构成矩阵形式,每一行都相同的加窗。

s_ref = exp((1j*pi*Kr).*((t_ref_mtx).^2)); % 复制(发射)脉冲,未加窗。
% s_ref = w_ref.*exp((1j*pi*Kr).*((t_ref_mtx).^2)); % 复制(发射)脉冲,加了窗。

s_ref = [s_ref,zeros(Naz,Nrg-Nr)];      % 对复制脉冲,后端补零。
S_ref = fft(s_ref,NFFT_r,2);            % 复制脉冲的距离傅里叶变换,零频在两端。
H_range = conj(S_ref);                  % 距离向匹配滤波器,零频在两端。
S_range_c = S_range.*H_range;           % 乘以匹配滤波器,零频在两端。    
s_rc = ifft(S_range_c,[],2);            % 完成距离压缩,回到二维时域。
% s_rc的长度为:Naz*Nrg。未去除弃置区。

% 对s_rc进行去除弃置区的操作
% 弃置区长度为:2*(Nr-1)
% 我们截取的长度:(Nrg-Nr+1),记为 N_rg。
N_rg = Nrg-Nr+1;                        % 完全卷积的长度
s_rc_c = zeros(Naz,N_rg);               % 用来存放去除弃置区后的数据
s_rc_c = s_rc(:,1:N_rg);                % 取前 N_rg列。
% ====================================================

% 作图
% 图2------完成距离压缩(二维时域)
figure;    
imagesc(abs(s_rc_c));
title('完成距离压缩');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');

(一)SAR成像原理------线性调频信号的脉冲压缩

Note :频域匹配滤波器的生成

由于SAR中的匹配滤波器一般比较长,故通常在频域实现,频域匹配滤波器的生成方式一般有如下3种:

方式1:将时间反褶后的复制脉冲(发射复制脉冲)取复共枙,计算补零离散傅里叶变换。
方式2 :复制脉冲补零后进行离散傅里叶变换,对结果取复共轭(无时间反褶)。

方式3:根据设定的线性调频特性,直接在频域生成匹配滤波器。

2、距离徙动校正

matlab 复制代码
% 变换到距离多普勒域,进行距离徙动校正
% --------------------------------------------------------------------
s_rc_c = s_rc_c.*exp(-1j*2*pi*fnc.*(ta.'*ones(1,N_rg)));    % 数据搬移
S_rd = fft(s_rc_c,NFFT_a,1);            % 方位向傅里叶变换,到距离多普勒域
% ====================================================================
% 设置方位向频率轴
fa = fnc + fftshift(-NFFT_a/2:NFFT_a/2-1)/NFFT_a*Fa;    % 方位频率轴如此设置。
% =====================================================================
% 下面这个是改进的,每一个最近斜距(R0)都随着距离门的不同而改变。
tr_RCMC = 2*x1/c + ( -N_rg/2 : (N_rg/2-1) )/Fr;   % 在新的距离线长度下的时间轴。

R0_RCMC = (c/2).*tr_RCMC*cos(sita_r_c);   % 随距离线变化的R0,记为R0_RCMC,用来计算RCM和Ka。
delta_Rrd_fn = lamda^2.*((fa.').^2)*(R0_RCMC)/(8*Vr^2); % 需要校正的距离徙动,根据文中公式(5)计算。

num_range = c/(2*Fr);   % 一个距离采样单元,对应的长度
delta_Rrd_fn_num = delta_Rrd_fn./num_range; % 每一个方位向频率,其RCM对应的距离采样单元数

R = 8;  % sinc插值核长度
S_rd_rcmc = zeros(NFFT_a,N_rg); % 用来存放RCMC后的值
for p = 1 : NFFT_a
    for q = 1 : N_rg   % 此时距离向的长度是 (Nrg-Nr+1)=N_rg        
        delta_Rrd_fn_p = delta_Rrd_fn_num(p,q);
        Rrd_fn_p = q + delta_Rrd_fn_p;
        Rrd_fn_p_zheng = ceil(Rrd_fn_p);        % ceil,向上取整。
        ii = ( Rrd_fn_p-(Rrd_fn_p_zheng-R/2):-1:Rrd_fn_p-(Rrd_fn_p_zheng+R/2-1)  );        
        rcmc_sinc = sinc(ii);
        rcmc_sinc = rcmc_sinc/sum(rcmc_sinc);   % 插值核的归一化
        % ii 是sinc插值过程的变量;
        % g(x)=sum(h(ii)*g_d(x-ii)) = sum(h(ii)*g_d(ll));
               
        % 由于S_rd只有整数点取值,且范围有限。因此插值中要考虑它的取值溢出边界问题。
        % 这里我采取循环移位的思想,用来解决取值溢出问题。
        if (Rrd_fn_p_zheng-R/2) > N_rg    % 全右溢
            ll = (Rrd_fn_p_zheng-R/2-N_rg:1:Rrd_fn_p_zheng+R/2-1-N_rg);
        else
            if (Rrd_fn_p_zheng+R/2-1) > N_rg    % 部分右溢
                ll_1 = (Rrd_fn_p_zheng-R/2:1:N_rg);
                ll_2 = (1:1:Rrd_fn_p_zheng+R/2-1-N_rg);
                ll = [ll_1,ll_2];
            else
                if (Rrd_fn_p_zheng+R/2-1) < 1    % 全左溢(不可能发生,但还是要考虑)
                    ll = (Rrd_fn_p_zheng-R/2+N_rg:1:Rrd_fn_p_zheng+R/2-1+N_rg);
                else
                    if (Rrd_fn_p_zheng-R/2) < 1       % 部分左溢
                        ll_1 = (Rrd_fn_p_zheng-R/2+N_rg:1:N_rg);
                        ll_2 = (1:1:Rrd_fn_p_zheng+R/2-1);
                        ll = [ll_1,ll_2];
                    else
                        ll = (Rrd_fn_p_zheng-R/2:1:Rrd_fn_p_zheng+R/2-1);
                    end                    
                end
            end
        end   
        rcmc_S_rd = S_rd(p,ll);
        S_rd_rcmc(p,q) = sum( rcmc_sinc.*rcmc_S_rd );
    end
end
% S_rd_rcmc 就是RCMC后的距离多普勒域频谱。

% 作图
% 图3------未RCMC(距离多普勒域)
figure;
imagesc(abs(S_rd));
title('未RCMC');
xlabel('距离时域(采样点)');
ylabel('方位频域(采样点)');

% 作图
% 图4------完成RCMC(距离多普勒域)
figure;
imagesc(abs(S_rd_rcmc));
title('完成RCMC');
xlabel('距离时域(采样点)');
ylabel('方位频域(采样点)');

需要校正的距离徙动: Δ R ( f η )    =    λ 2   R 0   f η 2 8   V r 2 \begin{equation} \Delta R(f_\eta) \;=\; \frac{\lambda^{2}\,R_0\,f_\eta^{2}}{8\,V_r^{2}} \end{equation} ΔR(fη)=8Vr2λ2R0fη2
(六)SAR成像原理------距离徙动

Note :插值核的归一化

对于截断后的核,需要进行归一化处理,使其增益单位化,否则采样处的权值和不再等于1,并且在不同插值点之间存在差异。在这种情况下,最好令所有插值点上的权值和都等于1。


3、方位压缩

matlab 复制代码
% 方位压缩
% --------------------------------------------------------------------
fa_azimuth_MF = fa;         % 方位频率轴,采用和RCMC中所用的频率轴相同。
Ka = 2*Vr^2*(cos(sita_r_c))^3./(lamda.* R0_RCMC);  	% 方位向调频率,是随最近斜距R0变化的。
Ka_1 = 1./Ka;                                       % 为了方便计算,先取倒数。
Haz = exp( -1j*pi.*(((fa_azimuth_MF).').^2*Ka_1) );	% 方位向匹配滤波器,根据文中公式(6)计算。
% 这里要注意,生成的MF的零频既不是在两端,也不是在中心的。
% 考虑下频率轴是什么样的,间断点在哪里。注意fa的构成。
% 这里的频率轴和距离多普勒域的方位频谱是对应的。

S_rd_c = S_rd_rcmc.*Haz;            % 乘以匹配滤波器
s_ac = ifft(S_rd_c,[],1);       	% 完成方位压缩,变到图像域。结束。

% 作图
% 图5------成像结果(二维时域)
figure;
imagesc(abs(s_ac));
title('成像结果');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');     

方位向匹配滤波器:
H a z ( f η )    =    exp ⁡  ⁣ { − j π   f η 2 K a } \begin{align} H_{\mathrm{az}}(f_\eta) \;=\; \exp\!\left\{ -j\pi\,\frac{f_\eta^{2}}{K_a} \right\} \end{align} Haz(fη)=exp{−jπKafη2}
(三)SAR成像原理------方位向聚焦处理

4、点目标分析

SAR系统是线性的,可以通过冲激响应描述系统的性质。冲激响应是输入为冲激函数时的系统输出。在SAR系统中,它是通过测量地面的一个单一孤立散射体(如角反射器)的系统响应得到的。这种小的孤立散射体称为点目标。许多重要的 SAR 图像质量参数都可以通过测量点目标响应予以估计。由于SAR图像是二维的,所以应在两个方向上对某些质量参数进行测量。

点目标测量给出的最重要质量参数包括:

(1)冲激响应宽度(IRW):冲激响应的3dB主瓣宽度,在SAR处理中又称为图像分辨率。

(2)峰值旁瓣比(PSLR):最大旁瓣与主瓣的高度比。

(3)一维积分旁瓣比(ISLR): ISLR = 10 l g P total − P main P main \text{ISLR}=10\mathrm{lg}\frac{P_{\text{total}}-P_{\text{main}}}{P_{\text{main}}} ISLR=10lgPmainPtotal−Pmain其中, P main P_{\text{main}} Pmain为主瓣功率, P total P_{\text{total}} Ptotal为总功率。

IRW规定了SAR的分辨率,PSLR/ISLR与图像的对比度有关。

matlab 复制代码
NN = 20;
% 分别得到每个点目标的切片放大;行切片、列切片;和相应的指标
% 目标1,点目标中心在 ( tg_1_x,tg_1_y )
tg_1_x = 96;
tg_1_y = round(N_rg/2);
target_1 = target_analysis_2( s_ac(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_2( s_ac(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_2( s_ac(tg_3_x-NN:tg_3_x+NN,tg_3_y-NN:tg_3_y+NN),Fr,Fa,Vr);
matlab 复制代码
function [PSLR_r,ISLR_r,IRW_r, PSLR_a,ISLR_a,IRW_a] = target_analysis_2(s_ac,Fr,Fa,Vr)
% 截止到 2014.10.10 10:34 a.m.
% 
% 2014.10.10. 修改了: 指标计算函数采用更改后的: zhibiao_2( )
% 2014.10.10. 修改了: 二维补零方式更改为第 2 种方法:先对每列补零,再对每行补零。
%
% ===============================================================
% 该程序考虑了大斜视角下,对点目标的扭曲
% 分别考虑距离向和方位向
% 考虑距离向旋转角度,将距离向轴旋转到平行于水平轴,再取出行切片
% 考虑方位向旋转角度,将方位向轴旋转到平行于垂直轴,再取出列切片
% ===============================================================
%
% 输入变量: s_ac  ------是需要进行指标分析的点目标点k,s_ac是它所在的一块矩阵数据。
% 输入变量: Fr  ------ 距离向采样率
% 输入变量: Fa  ------ 方位向采样率
% 输入变量: Vr  ------ 平台速度
% 该函数用来求解点目标k的各项指标
% 点目标中心的行切片(距离向):峰值旁瓣比(PSLR),积分旁瓣比(ISLR),距离分辨率(IRW)。
% 点目标中心的列切片(方位向):峰值旁瓣比(PSLR),积分旁瓣比(ISLR),距离分辨率(IRW)。
% 输出值分别是行切片和列切片的各项指标
%
% 补零方式很关键
% 这里采用的方法是逐行,逐列判断数据最小值位置,然后将在最小值位置处进行补零
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%       取点目标中心 NN*NN 切片,进行升采样
%   再取点目标中心,距离向切片,方位向切片,进行升采样
%                   计算各项性能指标
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%
c = 3e8;                % 光速

% 取点目标的中心切片,NN*NN
% 进行二维升采样
NN = 32;        % 切片总长度,NN*NN
[row,column] = size(s_ac);      % s_ac的矩阵大小
[aa,p] = max(abs(s_ac));           
[bb,q] = max(max(abs(s_ac)));
 
row_max = p(q);    	% 二维矩阵最大值,所在第几行------ row_max。
column_max = q;     % 二维矩阵最大值,所在第几列------ column_max。
s_ac_max = bb;      % 矩阵最大值是------ x_max。

s_ac_test = s_ac(row_max-NN/2:row_max+NN/2-1,column_max-NN/2:column_max+NN/2-1);
% 得到NN*NN的切片

% 下面进行二维升采样
S_ac_test_1 = fft(s_ac_test,[],1);     % 方位向fft
S_ac_test_2 = fft(S_ac_test_1,[],2);   % 距离向fft

% 接下来进行二维补零
% =========================================================================
% 利用两个for循环,在每行和每列最小值的位置处补上7*NN的零,实现高频补零。
%------------------------------------------------------------------
%{
% 第 1 种方法: 先对每行补零,再对每列补零。
S_ac_test_buling_1 = zeros(NN,8*NN);  % 中间变量
S_ac_test_buling = zeros(8*NN,8*NN);
% 下面先对每行补零,再对每列补零
for pp = 1:NN           % 在每行的最小值位置补零
    [C,I] = min(S_ac_test_2(pp,:));
    S_ac_test_buling_1(pp,1:I) = S_ac_test_2(pp,1:I);
    S_ac_test_buling_1(pp,8*NN-(NN-I)+1:8*NN) = S_ac_test_2(pp,I+1:NN);
end
% for qq = 1:8*NN         % 在每列的最小值位置补零
%     [C,I] = min(S_ac_test_buling_1(:,qq));
%     S_ac_test_buling(1:I,qq) = S_ac_test_buling_1(1:I,qq);
%     S_ac_test_buling(8*NN-(NN-I)+1:8*NN,qq) = S_ac_test_buling_1(I+1:NN,qq);
% end
% 由于上面的在每列的最小值位置补零,得到的结果是有问题的,因此下面进行修改
% 修改方法是:
%       直接对每一列,在中间补零
S_ac_test_buling(1:NN/2,:) = S_ac_test_buling_1(1:NN/2,:);
S_ac_test_buling(8*NN-NN/2+1:8*NN,:) = S_ac_test_buling_1(NN/2+1:NN,:);
%}
%------------------------------------------------------------------
%
% 第 2 种方法: 先对每列补零,再对每行补零。
S_ac_test_buling_1 = zeros(8*NN,NN);  % 中间变量
S_ac_test_buling = zeros(8*NN,8*NN);
% 下面先对每列补零,再对每行补零------注意:和上面的先行后列相比,这是有区别的。
for pp = 1:NN           % 在每行的最小值位置补零
    [C,I] = min(S_ac_test_2(:,pp));
    S_ac_test_buling_1(1:I,pp) = S_ac_test_2(1:I,pp);
    S_ac_test_buling_1(8*NN-(NN-I)+1:8*NN,pp) = S_ac_test_2(I+1:NN,pp);
end
for qq = 1:8*NN         % 在每列的最小值位置补零
    [C,I] = min(S_ac_test_buling_1(qq,:));
    S_ac_test_buling(qq,1:I) = S_ac_test_buling_1(qq,1:I);
    S_ac_test_buling(qq,8*NN-(NN-I)+1:8*NN) = S_ac_test_buling_1(qq,I+1:NN);
end   
%}
%------------------------------------------------------------------
% =========================================================================
S_ac_test_1 = ifft(S_ac_test_buling,[],2);
s_ac_test = ifft(S_ac_test_1,[],1);         % 完成二维升采样。

% 作图
figure;
imagesc(abs(s_ac_test));
title('将成像结果做升采样,看效果如何');

%% 
% 下面分别对点目标中心(二维最大值)做行切片,和列切片。
% 每一个切片,都做 16倍 升采样。
% 并分别作出归一化的对数幅度图。
% -------------------------------------------------------
% 考虑图像扭曲
% 将目标进行旋转和扭曲,以使大部分旁瓣对齐至水平轴和垂直轴
% -------------------------------------------------------

%% 
% 取出行切片

% 第一步,找出升采样后点目标中心的位置和大小
[row_test,column_test] = size(s_ac_test);      % s_ac_test的矩阵大小
[aa_test,p_test] = max(abs(s_ac_test));           
[bb_test,q_test] = max(max(abs(s_ac_test)));

row_test_max = p_test(q_test);      % 二维矩阵最大值,所在第几行------ row_test_max。
column_test_max = q_test;           % 二维矩阵最大值,所在第几列------ column_test_max。
s_ac_test_max = bb_test;            % 矩阵最大值是------ x_max。

% 第二步,找出点目标中心左侧2/3长度内的最大值,以此来计算距离旁瓣的扭曲角度
% 注意到,如果直接在左侧2/3长度内寻找最大值,有可能会误判到方位旁瓣上的点;
% 因此,由于斜视角的关系,左侧的距离旁瓣一定是向上倾斜的;
% 因此下面的寻找中,行直接规定为在点目标中心所在行的上方。
[aa_test_2,p_test_2] = max(abs(s_ac_test(1:row_test_max,1:2*column_test_max/3)));           
[bb_test_2,q_test_2] = max(max(abs(s_ac_test(1:row_test_max,1:2*column_test_max/3))));

row_test_max_2 = p_test_2(q_test_2);  % 二维矩阵点目标中心左侧2/3长度的最大值,所在第几行
column_test_max_2 = q_test_2;% 二维矩阵点目标中心左侧2/3长度的最大值,所在第几列

% 第三步,计算距离旁瓣扭曲的转角
range_theta = atan( abs((row_test_max_2-row_test_max)/(column_test_max_2-column_test_max)) );
% 结果是弧度,下面转成角度
range_theta = range_theta/pi*180;   % 这是距离旁瓣扭曲的角度

% 第四步,将升采样的结果s_ac_test以角range_theta进行旋转(这里是逆时针旋转)
s_ac_range = imrotate(s_ac_test,range_theta,'bilinear');% 采用'bilinear',双线性插值的方式
% s_ac_range是旋转后的图像
% 距离向切片就以此来计算。

% 作图
figure;
imagesc(abs(s_ac_range));
title('将距离向旁瓣旋转到平行于水平轴后的成像结果');

% 第五步,找出旋转后的最大值中心,并取出相应的行切片
[aa_test_range,p_test_range] = max(abs(s_ac_range));           
[bb_test_range,q_test_range] = max(max(abs(s_ac_range)));
row_test_max_range = p_test_range(q_test_range); % 旋转后,点目标中心,所在第几行
column_test_max_range = q_test_range;  % 旋转后,点目标中心,所在第几列

s_ac_test_row_max = s_ac_range(row_test_max_range,column_test_max_range/3:5*column_test_max_range/3);
% s_ac_test_row_max是取出的点目标中心行切片。
% 其中,这里并没有把s_ac_range的一行全部取出来,而是将最左右两侧的一部分去除了。

% 下面进行16倍升采样
S_AC_test_row_max_1 = fft(s_ac_test_row_max);   % 变换到频域

% -----------------------------------------------------------------------
% 以下分别是两种补零方式:
% 方式 1 :在高频(中间)补零
 S_AC_test_row_max = [S_AC_test_row_max_1(1,1:length(S_AC_test_row_max_1)/2),...
                        zeros(1, 15*length(S_AC_test_row_max_1)),...
                   S_AC_test_row_max_1(1,length(S_AC_test_row_max_1)/2+1:end)];

% 方式 2 :在最小值处补15倍的零
% S_AC_test_row_max = zeros(1,16*length(S_AC_test_row_max_1));
% [C1,I1] = min(S_AC_test_row_max_1);
% S_AC_test_row_max(1,1:I1) = S_AC_test_row_max_1(1,1:I1);
% S_AC_test_row_max(1,16*length(S_AC_test_row_max_1)+1-(length(S_AC_test_row_max_1)-I1):end) = S_AC_test_row_max_1(1,I1+1:end);
% ------------------------------------------------------------------------- 
% 到这里为止,频域补零完成    
s_ac_test_row_max = ifft(S_AC_test_row_max);  % 进行IFFT,回到时域,得到升采样过后的行切片。
% 到这里为止,升采样完成

% 下面做归一化的对数幅度图
s_ac_test_row_max_abs = abs(s_ac_test_row_max);             % 取幅度
s_ac_test_row_max_abs = 20*log10(s_ac_test_row_max_abs);    % 取对数
s_ac_test_row_max_abs = s_ac_test_row_max_abs - max(s_ac_test_row_max_abs); % 归一化

% 作图
figure;
plot(s_ac_test_row_max_abs);
title('点目标中心,行切片');


%%
% 取出列切片

% 第一步,找出升采样后点目标中心的位置和大小
% (这和取出行切片时相同)

% 第二步,找出点目标中心上方(方位向)2/3长度内的最大值,以此来计算方位旁瓣的扭曲角度
% 注意到,如果直接在上方2/3长度内寻找最大值,由于距离旁瓣较强,所以有可能会误判到距离旁瓣上的点;
% 因此,由于斜视角的关系,上方的方位旁瓣一定是向右倾斜的;
% 因此下面的寻找中,列直接规定为在点目标中心所在列的右侧。
[aa_test_3,p_test_3] = max(abs(s_ac_test(1:2*row_test_max/3,column_test_max:end-10)));           
[bb_test_3,q_test_3] = max(max(abs(s_ac_test(1:2*row_test_max/3,column_test_max:end-10))));

row_test_max_3 = p_test_3(q_test_3);  % 二维矩阵点目标中心上方2/3长度的最大值,所在第几行
column_test_max_3 = q_test_3;% 二维矩阵点目标中心上方2/3长度的最大值,所在第几列,这里要注意!!
% 注意:column_test_max_3 由于是直接在点目标中心所在列的右侧进行判断的,因此这里的值是相对于点目标中心所在列的相对值。

% 第三步,计算方位旁瓣扭曲的转角
azimuth_theta = atan( abs((column_test_max_3)/(row_test_max_3-row_test_max)) );
% 结果是弧度,下面转成角度
azimuth_theta = azimuth_theta/pi*180;   % 这是方位旁瓣扭曲的角度

% 第四步,将升采样的结果s_ac_test以角azimitu_theta进行旋转(这里是逆时针旋转)
s_ac_azimuth = imrotate(s_ac_test,azimuth_theta,'bilinear');% 采用'bilinear',双线性插值的方式
% s_ac_azimuth是旋转后的图像
% 方位向切片就以此来计算。

% 作图
figure;
imagesc(abs(s_ac_azimuth));
title('将方位向旁瓣旋转到平行于垂直轴后的成像结果');

% 第五步,找出旋转后的最大值中心,并取出相应的列切片
[aa_test_azimuth,p_test_azimuth] = max(abs(s_ac_azimuth));           
[bb_test_azimuth,q_test_azimuth] = max(max(abs(s_ac_azimuth)));
row_test_max_azimuth = p_test_azimuth(q_test_azimuth); % 旋转后,点目标中心,所在第几行
column_test_max_azimuth = q_test_azimuth;  % 旋转后,点目标中心,所在第几列。

s_ac_test_column_max = s_ac_azimuth(row_test_max_azimuth/3:5*row_test_max_azimuth/3,column_test_max_azimuth);
% s_ac_test_column_max是取出的点目标中心列切片。
% 其中,这里并没有把s_ac_azimuth的一列全部取出来,而是将最上下两侧的一部分去除了。
s_ac_test_column_max = s_ac_test_column_max.';  % 转为行向量,便于统一处理

% 下面进行16倍升采样
S_AC_test_column_max_1 = fft(s_ac_test_column_max);
% 在最小值处补15倍的零
S_AC_test_column_max = zeros(1,16*length(S_AC_test_column_max_1));
[C2,I2] = min(S_AC_test_column_max_1);
S_AC_test_column_max(1,1:I2) = S_AC_test_column_max_1(1,1:I2);
S_AC_test_column_max(1,16*length(S_AC_test_column_max_1)+1-(length(S_AC_test_column_max_1)-I2):end) = S_AC_test_column_max_1(1,I2+1:end);
s_ac_test_column_max = ifft(S_AC_test_column_max);    	% 升采样过后的列切片。
% 完成16倍升采样   

% 下面做归一化的对数幅度图
s_ac_test_column_max_abs = abs(s_ac_test_column_max);           % 取幅度   
s_ac_test_column_max_abs = 20*log10(s_ac_test_column_max_abs);  % 取对数
s_ac_test_column_max_abs = s_ac_test_column_max_abs - max(s_ac_test_column_max_abs);% 归一化

% 作图
figure;
plot(s_ac_test_column_max_abs);
title('点目标中心,列切片');






三、大斜视角情况

(一)方式2

1、距离压缩

matlab 复制代码
% 距离压缩
% --------------------------------------------------------------------
S_range = fft(s_echo,NFFT_r,2);     % 进行距离向傅里叶变换,零频在两端。

% 生成距离向匹配滤波器
% ====================================================
% 采用方式2
% 时域复制脉冲,末端补零,fft,再取复共轭。
t_ref = ( -Nr/2 : (Nr/2-1) )/Fr;    % 用来生成距离MF的距离时间轴
t_ref_mtx = ones(Naz,1)*t_ref;      % 矩阵形式
w_ref = kaiser(Nr,2.5);             % 距离向,构建Kaiser窗,此为列向量。
w_ref = ones(Naz,1)*(w_ref.');      % 构成矩阵形式,每一行都相同的加窗。

s_ref = exp((1j*pi*Kr).*((t_ref_mtx).^2)); % 复制(发射)脉冲,未加窗。
% s_ref = w_ref.*exp((1j*pi*Kr).*((t_ref_mtx).^2)); % 复制(发射)脉冲,加了窗。

s_ref = [s_ref,zeros(Naz,Nrg-Nr)];      % 对复制脉冲,后端补零。
 
S_ref = fft(s_ref,NFFT_r,2);            % 复制脉冲的距离傅里叶变换,零频在两端。
H_range = conj(S_ref);                  % 距离向匹配滤波器,零频在两端。
S_range_c = S_range.*H_range;           % 乘以匹配滤波器,零频在两端。    
s_rc = ifft(S_range_c,[],2);            % 完成距离压缩,回到二维时域。
% s_rc的长度为:Naz*Nrg。未去除弃置区。

% 对s_rc进行去除弃置区的操作
% 弃置区长度为:2*(Nr-1)
% 我们截取的长度:(Nrg-Nr+1),记为 N_rg。
N_rg = Nrg-Nr+1;                        % 完全卷积的长度
s_rc_c = zeros(Naz,N_rg);               % 用来存放去除弃置区后的数据
s_rc_c = s_rc(:,1:N_rg);                % 取前 N_rg列。
% ====================================================

% 作图
% 图2------完成距离压缩(二维时域)
figure;
imagesc(abs(s_rc_c));
title('完成距离压缩');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');

与基本RDA距离压缩使用的匹配滤波器相同。

2、SRC

matlab 复制代码
% 变换到二维频域,进行SRC
% --------------------------------------------------------------------
s_rc_c = s_rc_c.*exp(-1j*2*pi*fnc.*(ta.'*ones(1,N_rg)));    % 数据搬移
S_2df = fft(s_rc_c,NFFT_a,1);        % 方位向傅里叶变换,到距离多普勒域。

% 作图
figure;
imagesc(abs(S_2df));
title('未SRC');
xlabel('距离时域(采样点)');
ylabel('方位频域(采样点)');

S_2df = fft(S_2df,N_rg,2);   	% 距离向傅里叶变换,到二维频域
% !!!注意:距离向零频在两端。
% ====================================================================
% 设置方位频率轴------这是关键点
fa = fnc + fftshift(-NFFT_a/2:NFFT_a/2-1)/NFFT_a*Fa; 	% 方位频率轴如此设置。
% =====================================================================
D_fn_Vr = sqrt(1-lamda^2.*(fa.').^2./(4*Vr^2));         % 大斜视角下的徙动因子,根据文中公式(9)计算。
K_src = 2*Vr^2*f0^3.*D_fn_Vr.^3./(c*R0*(fa.').^2);      % 列向量,根据文中公式(8)计算。
K_src_1 = 1./K_src;             % 列向量。为了后面能使用矩阵乘法,这里先求倒数
fr = ( -N_rg/2 : N_rg/2-1 )*( Fr/N_rg );        % 去除弃置区后,距离频率轴
H_src = exp(-1j*pi.*K_src_1*(fr.^2));           % 二次距离压缩滤波器,根据文中公式(7)计算。距离向,零频在中间。
% 这是矩阵,大小Naz*N_rg
H_src = fftshift(H_src,2);      % (左右半边互换)距离向,零频在两端。 !!!这很关键!!!

S_2df_src = S_2df.*H_src;       % 这一步点乘时,要注意两者的距离向频率轴应该对应上,不然会出错!!
% 这就是为什么上面的 H_src 要 fftshift 的原因!!

S_rd = ifft(S_2df_src,[],2);    	% 完成二次距离压缩(SRC),回到距离多普勒域。

% 作图
figure;
imagesc(abs(S_rd));
title('完成SRC');
xlabel('距离时域(采样点)');
ylabel('方位频域(采样点)');

SRC滤波器:
H s r c ( f τ )    =    exp ⁡  ⁣ { − j π   f τ 2 K s r c ( R 0 ,   f η ) } \begin{align} H_{\mathrm{src}}(f_\tau) \;=\; \exp\!\left\{ -j\pi\,\frac{f_\tau^{2}}{K_{\mathrm{src}}(R_0,\,f_\eta)} \right\} \end{align} Hsrc(fτ)=exp{−jπKsrc(R0,fη)fτ2}其中,
K s r c ( R 0 ,   f η )    =    2   V r 2   f 0 3   D 3 ( f η ,   V r ) c   R 0   f η 2 \begin{align} K_{\mathrm{src}}(R_0,\,f_\eta) \;=\; \frac{2\,V_r^{2}\,f_0^{3}\,D^{3}(f_\eta,\,V_r)}{c\,R_0\,f_\eta^{2}} \end{align} Ksrc(R0,fη)=cR0fη22Vr2f03D3(fη,Vr)徙动因子 D ( f η ,   V r ) D(f_\eta,\,V_r) D(fη,Vr)计算为 D ( f η ,   V r )    =    1 − λ 2   f η 2 4   V r 2 \begin{align} D(f_\eta,\,V_r) \;=\; \sqrt{1 - \frac{\lambda^{2}\,f_\eta^{2}}{4\,V_r^{2}}} \end{align} D(fη,Vr)=1−4Vr2λ2fη2

3、距离徙动校正

matlab 复制代码
% 距离多普勒域,进行距离徙动校正
% --------------------------------------------------------------------
% 每一个最近斜距(R0)都随着距离门的不同而改变。
tr_RCMC = 2*R0/c + ( -N_rg/2 : (N_rg/2-1) )/Fr;   % 在新的距离线长度下的时间轴。
R0_RCMC = (c/2).*tr_RCMC;   % 随距离线变化的R0,记为R0_RCMC,用来计算RCM和Ka。
delta_Rrd_fn = ((1-D_fn_Vr)./D_fn_Vr)*R0_RCMC;      % 大斜视角下的RCM,根据文中公式(10)计算。

num_range = c/(2*Fr);   % 一个距离采样单元,对应的长度
delta_Rrd_fn_num = delta_Rrd_fn./num_range; % 每一个方位向频率,其RCM对应的距离采样单元数

R = 8;  % sinc插值核长度
S_rd_rcmc = zeros(NFFT_a,N_rg); % 用来存放RCMC后的值
for p = 1 : NFFT_a
    for q = 1 : N_rg   % 此时距离向的长度是 (Nrg-Nr+1)=N_rg        
        delta_Rrd_fn_p = delta_Rrd_fn_num(p,q);
        Rrd_fn_p = q + delta_Rrd_fn_p;
        
        Rrd_fn_p = rem(Rrd_fn_p,N_rg);  % 由于RCM的长度会超过N_rg,所以这样处理一下。
        
        Rrd_fn_p_zheng = ceil(Rrd_fn_p);        % ceil,向上取整。
        ii = ( Rrd_fn_p-(Rrd_fn_p_zheng-R/2):-1:Rrd_fn_p-(Rrd_fn_p_zheng+R/2-1)  );        
        rcmc_sinc = sinc(ii);
        rcmc_sinc = rcmc_sinc/sum(rcmc_sinc);   % 插值核的归一化
        % ii 是sinc插值过程的变量;
        % g(x)=sum(h(ii)*g_d(x-ii)) = sum(h(ii)*g_d(ll));
               
        % 由于S_rd只有整数点取值,且范围有限。因此插值中要考虑它的取值溢出边界问题。
        % 这里我采取循环移位的思想,用来解决取值溢出问题。
        if (Rrd_fn_p_zheng-R/2) > N_rg    % 全右溢
            ll = (Rrd_fn_p_zheng-R/2-N_rg:1:Rrd_fn_p_zheng+R/2-1-N_rg);
        else
            if (Rrd_fn_p_zheng+R/2-1) > N_rg    % 部分右溢
                ll_1 = (Rrd_fn_p_zheng-R/2:1:N_rg);
                ll_2 = (1:1:Rrd_fn_p_zheng+R/2-1-N_rg);
                ll = [ll_1,ll_2];
            else
                if (Rrd_fn_p_zheng+R/2-1) < 1    % 全左溢(不可能发生,但还是要考虑)
                    ll = (Rrd_fn_p_zheng-R/2+N_rg:1:Rrd_fn_p_zheng+R/2-1+N_rg);
                else
                    if (Rrd_fn_p_zheng-R/2) < 1       % 部分左溢
                        ll_1 = (Rrd_fn_p_zheng-R/2+N_rg:1:N_rg);
                        ll_2 = (1:1:Rrd_fn_p_zheng+R/2-1);
                        ll = [ll_1,ll_2];
                    else
                        ll = (Rrd_fn_p_zheng-R/2:1:Rrd_fn_p_zheng+R/2-1);
                    end                    
                end
            end
        end   
        rcmc_S_rd = S_rd(p,ll);
        S_rd_rcmc(p,q) = sum( rcmc_sinc.*rcmc_S_rd );
    end
end
% S_rd_rcmc 就是RCMC后的距离多普勒域频谱。

%
% 作图------距离多普勒域(未RCMC)
figure;
imagesc(abs(S_rd));
title('未RCMC');
xlabel('距离时域(采样点)');
ylabel('方位频域(采样点)');

%
% 作图------距离多普勒域,RCMC后的结果
figure;     
imagesc(abs(S_rd_rcmc));
title('完成RCMC');
xlabel('距离时域(采样点)');
ylabel('方位频域(采样点)');

与基本RDA需要校正的距离徙动不同,改进RDA需要校正的距离徙动为:
Δ R ( f η ) = R 0   1 − D ( f η ,   V r ) D ( f η ,   V r ) \begin{align} \Delta R(f_\eta)=R_0\,\frac{1 - D(f_\eta,\,V_r)}{D(f_\eta,\,V_r)} \end{align} ΔR(fη)=R0D(fη,Vr)1−D(fη,Vr)

4、方位压缩

matlab 复制代码
% 方位压缩
% --------------------------------------------------------------------
fa_azimuth_MF = fa;         % 方位频率轴,采用和RCMC中所用的频率轴相同。
Haz = exp(1j*4*pi.*(D_fn_Vr*R0_RCMC).*f0./c);   % 大斜视角下,改进的方位向MF,根据文中公式(11)计算。
% 这里要注意,生成的MF的零频既不是在两端,也不是在中心的。
% 考虑下频率轴是什么样的,间断点在哪里。注意fa的构成。
% 这里的频率轴和距离多普勒域的方位频谱是对应的。

S_rd_c = S_rd_rcmc.*Haz;            % 乘以匹配滤波器
s_ac = ifft(S_rd_c,[],1);       	% 完成方位压缩,变到图像域。结束。

% 作图------成像结果
figure;
imagesc(abs(s_ac));
title('成像结果');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');     

与基本RDA方位压缩中用到的匹配滤波器不同,改进RDA的方位向匹配滤波器为
H a z ( f η )    =    exp ⁡  ⁣ { j   4 π   R 0   D ( f η ,   V r )   f 0 c } \begin{align} H_{\mathrm{az}}(f_\eta) \;=\; \exp\!\left\{ j\,\frac{4\pi\,R_0\,D(f_\eta,\,V_r)\,f_0}{c} \right\} \end{align} Haz(fη)=exp{jc4πR0D(fη,Vr)f0}

5、点目标分析

与基本RDA点目标分析步骤相同。

(二)方式3

1、距离压缩同时SRC

matlab 复制代码
% 距离压缩,同时进行SRC
% --------------------------------------------------------------------
S_range = fft(s_echo,NFFT_r,2);     % 进行距离向傅里叶变换,零频在两端。

% 生成距离向匹配滤波器
% ====================================================
% 时域复制脉冲,末端补零,fft,再取复共轭。
t_ref = ( -Nr/2 : (Nr/2-1) )/Fr;    % 用来生成距离MF的距离时间轴
t_ref_mtx = ones(Naz,1)*t_ref;      % 矩阵形式
w_ref = kaiser(Nr,2.5);             % 距离向,构建Kaiser窗,此为列向量。
w_ref = ones(Naz,1)*(w_ref.');      % 构成矩阵形式,每一行都相同的加窗。

s_ref = exp((1j*pi*Kr).*((t_ref_mtx).^2)); % 复制(发射)脉冲,未加窗。
% s_ref = w_ref.*exp((1j*pi*Kr).*((t_ref_mtx).^2)); % 复制(发射)脉冲,加了窗。

s_ref = [s_ref,zeros(Naz,Nrg-Nr)];      % 对复制脉冲,后端补零。
 
S_ref = fft(s_ref,NFFT_r,2);            % 复制脉冲的距离傅里叶变换,零频在两端。
H_range = conj(S_ref);                  % 距离向匹配滤波器,零频在两端。

% ------------------------------------------------------------------------
% 在距离频域将 SRC 与 距离压缩 合并处理
% 构造SRC滤波器,如下:
% 在方式3中,SRC滤波器其中的 R0 和 fa 都要取为定值
% R0 取为目标A和B的最近斜距
% fa 取为多普勒中心频率 fnc
D_fn_Vr = sqrt(1-lamda^2*fnc^2/(4*Vr^2));   % 大斜视角下的徙动因子。
% SRC方式3工作在距离频域。此时,忽略方位频率的相关性,将fa取为定值,即采用fnc。
% 要注意的是:后面进行RCMC时,我会重新计算这个徙动因子,那里会随着方位频率而变化。

K_src = 2*Vr^2*f0^3*D_fn_Vr^3/(c*R0*fnc^2);  % 定值
H_src = exp(-1j*pi*(fr.^2)/K_src);   % 二次距离压缩滤波器。距离向,零频在中间!!
H_src = ones(Naz,1)*H_src;
% 这是矩阵,大小 Naz*Nrg
H_src = fftshift(H_src,2);  % (左右半边互换)距离向,零频在两端。 !!!这很关键!!!
% ------------------------------------------------------------------------
S_range_c = S_range.*H_range.*H_src;   	% 乘以匹配滤波器和SRC滤波器,零频在两端。  

s_rc = ifft(S_range_c,[],2);            % 完成距离压缩,回到二维时域。
% s_rc的长度为:Naz*Nrg。未去除弃置区。

% 对s_rc进行去除弃置区的操作
% 弃置区长度为:2*(Nr-1)
% 完全卷积的结果(我们需要的)长度:(Nrg-Nr+1),记为 N_rg。
N_rg = Nrg-Nr+1;                        % 完全卷积的长度
s_rc_c = zeros(Naz,N_rg);               % 用来存放去除弃置区后的数据
s_rc_c = s_rc(:,1:N_rg);                % 取前 N_rg列。
% ====================================================

% 作图------二维时域(完成距离压缩,完成SRC,变回到二维时域)
figure;
imagesc(abs(s_rc_c));
title('完成距离压缩和SRC');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');

SRC滤波器并入距离压缩滤波器中:
H m ( f τ )    =    exp ⁡  ⁣ { j π   f τ 2 K r }   exp ⁡  ⁣ { − j π   f τ 2 K s r c ( R 0 ,   f η ) } H_m(f_\tau) \;=\; \exp\!\left\{ j\pi\,\frac{f_\tau^{2}}{K_r} \right\} \, \exp\!\left\{ -j\pi\,\frac{f_\tau^{2}}{K_{\mathrm{src}}(R_0,\,f_\eta)} \right\} Hm(fτ)=exp{jπKrfτ2}exp{−jπKsrc(R0,fη)fτ2}

2、距离徙动校正

matlab 复制代码
% 距离多普勒域,进行距离徙动校正
% --------------------------------------------------------------------
s_rc_c = s_rc_c.*exp(-1j*2*pi*fnc.*(ta.'*ones(1,N_rg)));    % 数据搬移
S_rd = fft(s_rc_c,NFFT_a,1);        % 方位向傅里叶变换,到距离多普勒域。

% 作图------距离多普勒域(未RCMC)
figure;
imagesc(abs(S_rd));
title('(b)幅度');
xlabel('距离时域(采样点)');
ylabel('方位频域(采样点)');

% ====================================================================
% 设置方位频率轴------关键点!!!
fa = fnc + fftshift(-NFFT_a/2:NFFT_a/2-1)/NFFT_a*Fa;    % 方位频率轴如此设置。
% =====================================================================

% 每一个最近斜距(R0)都随着距离门的不同而改变。
tr_RCMC = 2*R0/c + ( -N_rg/2 : (N_rg/2-1) )/Fr;	% 在新的距离线长度下的时间轴。
R0_RCMC = (c/2).*tr_RCMC;   % 随距离线变化的R0,记为R0_RCMC,用来计算RCM。

D_fn_Vr = sqrt(1-lamda^2.*(fa.').^2./(4*Vr^2)); % 大斜视角下的徙动因子,列向量。
delta_Rrd_fn = ((1-D_fn_Vr)./D_fn_Vr)*R0_RCMC;	% 大斜视角下的RCM。这是矩阵,大小Naz*N_rg。

num_range = c/(2*Fr);   % 一个距离采样单元,对应的长度
delta_Rrd_fn_num = delta_Rrd_fn./num_range; % 每一个方位向频率,其RCM对应的距离采样单元数

R = 8;  % sinc插值核长度
S_rd_rcmc = zeros(NFFT_a,N_rg); % 用来存放RCMC后的值
for p = 1 : NFFT_a
    for q = 1 : N_rg   % 此时距离向的长度是 (Nrg-Nr+1)=N_rg        
        delta_Rrd_fn_p = delta_Rrd_fn_num(p,q);
        Rrd_fn_p = q + delta_Rrd_fn_p;
        
        Rrd_fn_p = rem(Rrd_fn_p,N_rg);  % 由于RCM的长度会超过N_rg,所以这样处理一下(取余)。
        
        Rrd_fn_p_zheng = ceil(Rrd_fn_p);        % ceil,向上取整。
        ii = ( Rrd_fn_p-(Rrd_fn_p_zheng-R/2):-1:Rrd_fn_p-(Rrd_fn_p_zheng+R/2-1)  );        
        rcmc_sinc = sinc(ii);
        rcmc_sinc = rcmc_sinc/sum(rcmc_sinc);   % 插值核的归一化
        % ii 是sinc插值过程的变量;
        % g(x)=sum(h(ii)*g_d(x-ii)) = sum(h(ii)*g_d(ll));
               
        % 由于S_rd只有整数点取值,且范围有限。因此插值中要考虑它的取值溢出边界问题。
        % 这里我采取循环移位的思想,用来解决取值溢出问题。
        if (Rrd_fn_p_zheng-R/2) > N_rg    % 全右溢
            ll = (Rrd_fn_p_zheng-R/2-N_rg:1:Rrd_fn_p_zheng+R/2-1-N_rg);
        else
            if (Rrd_fn_p_zheng+R/2-1) > N_rg    % 部分右溢
                ll_1 = (Rrd_fn_p_zheng-R/2:1:N_rg);
                ll_2 = (1:1:Rrd_fn_p_zheng+R/2-1-N_rg);
                ll = [ll_1,ll_2];
            else
                if (Rrd_fn_p_zheng+R/2-1) < 1    % 全左溢(不可能发生,但还是要考虑)
                    ll = (Rrd_fn_p_zheng-R/2+N_rg:1:Rrd_fn_p_zheng+R/2-1+N_rg);
                else
                    if (Rrd_fn_p_zheng-R/2) < 1       % 部分左溢
                        ll_1 = (Rrd_fn_p_zheng-R/2+N_rg:1:N_rg);
                        ll_2 = (1:1:Rrd_fn_p_zheng+R/2-1);
                        ll = [ll_1,ll_2];
                    else
                        ll = (Rrd_fn_p_zheng-R/2:1:Rrd_fn_p_zheng+R/2-1);
                    end                    
                end
            end
        end   
        rcmc_S_rd = S_rd(p,ll);
        S_rd_rcmc(p,q) = sum( rcmc_sinc.*rcmc_S_rd );
    end
end
% S_rd_rcmc 就是RCMC后的距离多普勒域频谱。

% 作图------距离多普勒域,RCMC后的结果
figure;
imagesc(abs(S_rd_rcmc));
title('完成RCMC');
xlabel('距离时域(采样点)');
ylabel('方位频域(采样点)');

与方式2改进RDA的距离徙动校正相同。

3、方位压缩

matlab 复制代码
% 方位压缩
% --------------------------------------------------------------------
fa_azimuth_MF = fa;         % 方位频率轴,采用和RCMC中所用的频率轴相同。
Haz = exp(1j*4*pi.*(D_fn_Vr*R0_RCMC).*f0./c);   % 大斜视角下,改进的方位向MF
% 这里要注意,生成的MF的零频既不是在两端,也不是在中心的。
% 考虑下频率轴是什么样的,间断点在哪里。注意fa的构成。
% 这里的频率轴和距离多普勒域的方位频谱是对应的。

S_rd_c = S_rd_rcmc.*Haz;            % 乘以匹配滤波器
s_ac = ifft(S_rd_c,[],1);       	% 完成方位压缩,变到图像域。结束。

% 作图------成像结果
figure;
imagesc(abs(s_ac));
title('成像结果');
xlabel('距离时域(采样点)');
ylabel('方位时域(采样点)');     

与方式2改进RDA的方位压缩相同。

4、点目标分析

与基本RDA点目标分析步骤相同。

相关推荐
龙王山气象预报员23 天前
SAR成像——回波模型
sar成像
龙王山气象预报员1 个月前
SAR成像——方位向聚焦处理
sar成像
龙王山气象预报员1 个月前
SAR成像——成像几何
sar成像
sys_rst_n2 年前
【SAR成像】基于RD、CS和ωk算法的合成孔径雷达成像算法原理与实现
sar成像·合成孔径雷达·chirp scaling算法·距离多普勒算法·ωk算法
lightninghenry3 年前
哨兵1号(Sentinel-1)SAR卫星介绍
sentinel·sar成像·合成孔径雷达·sar卫星·哨兵1号