线性调频变标算法(Chirp Scaling Algorithm)——SAR成像算法MATLAB代码实现

原理

线性调频变标算法(Chirp Scaling Algorithm)

代码1:正侧视Chirp Scaling Algorithm

%%  Interpretations
%  不考虑高度
%  正侧视,斜平面成像chirp scaling算法
%%  radar parameters
clear all;
close all;
clc;
c = 3e8; 
lambda = 0.03125;
fc = c/lambda;
Tp = 10e-6; 
B = 180e6; 
gama = B/Tp; 
Fs = 200e6;
H = 0;
Rs = 12.8e3; 
squint_angle = 0;
squint = squint_angle/180*pi ; 
Rb = Rs*cos(squint) ;
Da = 0.4;
L = Rs*tan(lambda/Da/2)*2/cos(squint);
tp_nrn = ceil(Tp*Fs/2)*2;
v = 110;
PRF = 5000/3;
Wg = 1.5e3;
Wa = 4e2;
Pr = c/2/B;
Wr = Wg/cos(squint);
Ts = 2*Wr/c ; 

%%  range parameter
DeltaR = c/2/Fs;
nrn  = ceil((Tp + Ts)*Fs/2)*2;
nrn = 2^ceil(log2(nrn));
Tstart = 2*Rs/c-nrn/2/Fs;
Tnrn = 1/Fs;
Tend = 2*Rs/c+(nrn/2-1)/Fs;
tnrn = [Tstart:Tnrn:Tend].';

%%  azimuth parameter
Rs*lambda/Da/(v/PRF)
DeltaX = v/PRF ;
nan = 8192;
tnan = [-nan/2:nan/2-1]/PRF;
delta_theta = 2*atan((nan*v/PRF)/Rs); 
Pa = lambda/2/delta_theta;
Rq = lambda^2*Rs/32/(Da/2)^2            %  距离弯曲    9.765624999999998
1/8*Rs*(nan*v/PRF/Rs).^2                %  2.854748160000000
delta_Rq = lambda^2*Wr/32/(Da/2)^2      %  距离弯曲差  1.144409179687500 
1/8*Wr*(nan*v/PRF/Rs).^2                %  0.334540800000000  须用 CS 算法

%%  target parameter
point_num = 9; 
Distance_a = 200;           
Distance_g = 300;     
point = [...
         -Distance_a*cos(squint)-Distance_g*sin(squint),-Distance_a*sin(squint)+Distance_g*cos(squint)   ,   0;
                                -Distance_g*sin(squint),                          Distance_g*cos(squint) ,   0;
          Distance_a*cos(squint)-Distance_g*sin(squint), Distance_a*sin(squint)+Distance_g*cos(squint)   ,   0;
       -Distance_a*cos(squint)                         ,-Distance_a*sin(squint)                          ,   0;
                                                      0,                                                0,   0;
        Distance_a*cos(squint)                         , Distance_a*sin(squint)                          ,   0;                       
         -Distance_a*cos(squint)+Distance_g*sin(squint),-Distance_a*sin(squint)-Distance_g*cos(squint)   ,   0;
                                 Distance_g*sin(squint),                         -Distance_g*cos(squint) ,   0;
          Distance_a*cos(squint)+Distance_g*sin(squint), Distance_a*sin(squint)-Distance_g*cos(squint)   ,   0];
point = point + [zeros(size(point,1),1),  ones(size(point,1),1)*Rs,  zeros(size(point,1),1)];    
%%  platform parameter
X_ac = 0; 
Y_ac = 0; 
Z_ac = H ; 

X_a = ones(1,nan)*X_ac + v*tnan; 
Y_a = ones(1,nan)*Y_ac;
Z_a = ones(1,nan)*Z_ac;

%%  echo generation
temp = zeros(nrn,1); 
x0 = zeros(nrn,nan) ;
for k = 1 : nan
    if rem(k,400) == 0
        k
    end
    for m = 1 : point_num 
        R_m(k) = sqrt((X_a(k) - point(m,1)).^2 + (Y_a(k) - point(m,2)).^2 + (Z_a(k) - point(m,3)).^2);
        alpha = asin((point(m,1) - X_a(k))./R_m(k));
%         if (abs(alpha - squint) <= lambda/2/Da) 
            win1 = (abs(tnrn - 2*R_m(k)/c)<=Tp/2);
            temp = win1.*exp(j*pi*gama*(tnrn - 2*R_m(k)/c).^2).*exp(-j*4*pi*(R_m(k))/lambda);
            x0(:,k) = x0(:,k) + temp;
%         end
    end
end
% figure,imagesc(abs(x0))
% figure,imagesc(abs(Range_compress(x0,Fs,Tp,gama)))


%%  Chirp Scaling Algorithm
fa = [-nan/2:nan/2-1]/nan*PRF;
faM = 2*v*cos(squint)/lambda;
fdc = 2*v*sin(squint)/lambda;
afa = 1./sqrt(1-(fa./faM).^2)-1;
theta = asin(fa/faM);
gamafa = 1./(1/gama-Rs*2*lambda*sin(theta).^2./c.^2./cos(theta).^3);
sref1 = exp(-j*2*pi*fdc*tnan);
x = zeros(nrn,nan);
for n = 1:nrn
    x(n,:) = fftshift(fft(fftshift(x0(n,:).*sref1)));
    H1CS = exp(j*pi*gamafa.*afa.*(tnrn(n)-2*Rs*(1+afa)/c).^2);
    x(n,:) = x(n,:).*H1CS;
end

fr = [-nrn/2:nrn/2-1].'/nrn*Fs;
for m = 1:nan
    x(:,m) = fftshift(fft(fftshift(x(:,m))));
    H2 = exp(j*pi./gamafa(m)./(1+afa(m)).*fr.^2).*exp(j*4*pi*Rs*afa(m)/c.*fr);
    x(:,m) = fftshift(ifft(fftshift(x(:,m).*H2)));
end

rs = [-nrn/2:nrn/2-1].'*(c/2/Fs);
for n = 1:nrn
    H3 = exp(j*2*pi*(Rs+rs(n,1))/v*sqrt(faM.^2-fa.^2))...
        .*exp(-j*4*pi/c^2*gamafa.*afa.*(1+afa).*(rs(n).^2));
    x(n,:) = fftshift(ifft(fftshift(x(n,:).*conj(sref1).*H3)));
end
figure,imagesc(abs(x))
x_f0 = fftshift(fft(fftshift(x,1),[],1),1);
x_f0 = fftshift(fft(fftshift(x_f0,2),[],2),2);  %  二维频谱不混叠
figure,imagesc(abs(x_f0))  


%%
Image_f = x;
Interp_num = 8;
pos_row = 2449;
pos_col = 1067;
num_row = 32;
num_col = 100;
data_0 = Interpolate2D(Image_f(pos_row-num_row/2+1:pos_row+num_row/2,pos_col-num_col/2+1:pos_col+num_col/2),Interp_num);
figure,contour(abs(data_0),40)
fig_mesh(Image_f(pos_row+(-8*2:8*2-1),pos_col+(-8*2:8*2-1)),40);

x_r_ori = Image_f(pos_row-num_row/2+1:pos_row+num_row/2,pos_col);
x_r_irf = zeros(num_row*Interp_num,1);
x_r_irf(num_row*Interp_num/2-num_row/2+1:num_row*Interp_num/2+num_row/2,1) = fftshift(fft(fftshift(x_r_ori)));
x_r_irf = fftshift(ifft(fftshift(x_r_irf)));
figure,plot(20*log10(abs(x_r_irf)./max(abs(x_r_irf))))
PSLR(x_r_irf)                        %  -13.242821241643101
ISLR(x_r_irf)                        %  -10.245561162092418
disp('距离向分辨率理论值: (m)')
c/2/B                                %  0.833333333333333
disp('距离向分辨率实际值: (m)')
IRW(x_r_irf)/Interp_num*(c/2/Fs)     %  0.656250000000000

x_a_ori = Image_f(pos_row,pos_col-num_col/2+1:pos_col+num_col/2);
x_a_irf = zeros(1,num_col*Interp_num);
x_a_irf(1,num_col*Interp_num/2-num_col/2+1:num_col*Interp_num/2+num_col/2) = fftshift(fft(fftshift(x_a_ori)));
x_a_irf = fftshift(ifft(fftshift(x_a_irf)));
figure,plot(20*log10(abs(x_a_irf)./max(abs(x_a_irf))))
PSLR(x_a_irf)                        %  -13.252399419473232
ISLR(x_a_irf)                        %  -10.242338896862037
disp('方位向分辨率理论值: (m)')
lambda/2/(v*nan/PRF/Rs)              %  0.369910037878788
disp('方位向分辨率实际值: (m)')
IRW(x_a_irf)/Interp_num*(v/PRF)      %  0.330000000000000

Interpolate2D.m

function a_final=Interpolate2D(x,Interp_num)
[range_num,azimuth_num] = size(x);
a_temp = zeros(range_num*(2*Interp_num+1),azimuth_num);
a_final = zeros(range_num*(2*Interp_num+1),azimuth_num*(2*Interp_num+1));
for k = 1:azimuth_num
    data_f = fftshift(fft(x(:,k)));
    data = [zeros(1,range_num*Interp_num),data_f.',zeros(1,range_num*Interp_num)];
    a_temp(:,k) = ifft(data).';
end
for k = 1:range_num*(2*Interp_num+1)
    data_f = fftshift(fft(a_temp(k,:)));
    data = [zeros(1,azimuth_num*Interp_num),data_f,zeros(1,azimuth_num*Interp_num)];
    a_final(k,:) = ifft(data);
end
clear a_temp;

PSLR.m

function [ratio] = PSLR(s)
n = length(s);
x = abs(s).^2;
[peak,position] = max(x);
for loop = position:-1:1
    if x(loop)>x(loop-1)
       x(loop) = 0;
    else
       break; 
    end
end
for loop = position+1:n
    if x(loop)>x(loop+1)
       x(loop) = 0;
    else
       break;
    end
end
side = max(x);
ratio = 10*log10(side/peak);

ISLR.m

function [Ratio] = ISLR(s)
[M,N] = size(s);
if N==1
    s = s.';
else 
    s = s;
end
L = length(s);
x = abs(s).^2;
ss = x;
[peak,position] = max(x);
 for loop = position:-1:1
     if x(loop)>x(loop-1)
        x(loop) = 0;
     else
        num = loop;
        break; 
     end
end
for loop = position+1:L
    if x(loop)>x(loop+1)
       x(loop) = 0;
    else
        Num = loop;
       break; 
    end
end
y = zeros(1,L);
y(1,num:1:Num) = ss(1,num:1:Num);
Ratio = 10*log10(abs(sum(ss,2)-sum(y,2))/sum(y,2));

IRW.m

function width = IRW(s)
L = length(s);
x = abs(s).^2;
[peak,position] = max(x);
y = x/peak;
bounds = 0.5; 
for k = position:-1:1
    if y(k)>=bounds
        half_num_1 = k;
    else
        break
    end
end
half_num_2 = half_num_1-1;
if abs(y(half_num_1)-bounds)>abs(y(half_num_2)-bounds)
    half_num = half_num_2;
else
    half_num = half_num_1;
end
for k = position:1:L
    if y(k)>=bounds
        half_num_3 = k;
    else 
        break
    end
end
half_num_4 = half_num_3+1;
if (y(half_num_3)-bounds)>(y(half_num_4)-bounds)
    Half_num = half_num_3;
else
    Half_num = half_num_4;
end
width = Half_num-half_num;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值