合成孔径雷达成像——算法与实现图【2.2】仿真与解析

下面先分开解决每段问题:

M = 256;                % 矩阵高度
N = 256;                % 矩阵宽度
top = M/8+1;
bottom = M*7/8;
left = N/8+1;
right = N*7/8;
theta = -pi/12;          % 扭曲或旋转角度
alphax = -0.2;             % x轴扭曲常数
alphay = 0;

首先对参数进行设置,准备建立一个正方形矩阵,中间部分为一个元素均为1的正方形矩阵,其他元素为零,1矩阵的长宽为大矩阵的3/4,然后设定旋转角度为-pi/12。
这里说明一下,若旋转角度设为pi/12则旋转角度与书上原图不符,如下图所示:
合成孔径雷达成像——算法与实现图【2.2】仿真与解析_第1张图片
这是由于在整个矩阵中,建立的坐标系是反的,第一象限在右下方,如下图可以说明
合成孔径雷达成像——算法与实现图【2.2】仿真与解析_第2张图片
可以看出绕轴旋转的θ角若为正的,则第一象限会向下扩展,第四象限向上扩展,即与书中仿真图相反,所以认为旋转的角度是一个负值。
然后设定绕x轴扭曲alphax=-0.2,绕y扭曲alphay=0。这里扭曲系数的负值原因与旋转角度一致。

S0 = zeros(M,N);
S0(top:bottom,left:right) = 1;

即在零正方形矩阵的正中心得到一个均为1的正方形矩阵。至此原始矩阵S0建立出来。
zeros()函数的用法:zeros(M,N)为产生一个M行N列的元素均为0的矩阵。

S1 = zeros(M,N);
 for ii = 1:M
     for jj = 1:N
         A=[1 -alphax;-alphay 1]*[ii-M/2 jj-N/2].'; %扭曲、旋转运算要以中心为原点
         xx = round(A(1,1)+M/2);%还原为以左上角为原点的坐标系
         yy = round(A(2,1)+N/2);
         if(xx>=1 && xx<= M && yy>=1 && yy<= N)
             S1(ii,jj) = S0(xx,yy);
         end
     end
 end

首先考虑扭曲信号,先把整个矩阵移动到以原点为中心的矩阵,即为将每个坐标值减去矩阵长或宽的一半。然后利用转移矩阵与原坐标矩阵相乘得到新的扭曲以后的新坐标。扭转后的新坐标再加上矩阵长或宽的一半,即将原本的坐标移动回到原来位置,然后将原矩阵值一一赋值给转换后的矩阵。

S2 = zeros(M,N);
for ii = 1:M
    for jj = 1:N
        A=([cos(theta) -sin(theta);sin(theta) cos(theta)])*[ii-M/2 jj-N/2].';
        xx = round(A(1,1)+M/2);
        yy = round(A(2,1)+N/2);
        if(xx>=1 && xx<= M && yy>=1 && yy<=N)
            S2(ii,jj) = S0(xx,yy);
        end
    end
end

矩阵旋转也是相同的思路,先转换到以原点为中心的矩阵,然后用转换矩阵转换,转换后平移回原位置,最后赋值计算。
round()函数用法:round()函数为取整函数,取四舍五入的值,若为0.5,则取离原点远的值,例如round(4.5)=5,round(-4.5)=-5。

S0_ff = fftshift(fft2(fftshift(S0)));
S0_ff = abs(S0_ff);
S0_ff = S0_ff/max(max(S0_ff));
S0_ff = 20*log10(S0_ff+1e-4);

最后进行傅里叶变换,fftshift作用为将图像移至中心,例如第一个样本频率为0,最后一个样本频率为fs,则用fftshift以后,则频率范围变为-fs/2到fs/2。然后利用fft2做二维傅里叶变换,最后用fftshift再将傅里叶变换后的图像移至中点,用abs()取绝对值,再用矩阵除整个矩阵的最大值进行归一化。
矩阵的最大值要使用两次max函数,即max(max(A))即为矩阵中所有元素中的最大值。
最后将傅里叶变换后的值用分贝表示,k值用分贝表示为20log10(k),+1e-4是因为矩阵中存在log0值,若不加,则整个矩阵最小值变为-lnf,因为有值为0,在用对数函数的时候会得不出来数,若加的值改变其他值,有可能与其他的值相差比较远,导致用imagesc()函数的时候相邻色差变大,因为此函数使用的时候会用到所有颜色,所以最小值离次最小值过远的时候,会出现最小值是一个颜色,而其他值不好分辨的情况,如下图:
合成孔径雷达成像——算法与实现图【2.2】仿真与解析_第3张图片
此图为将最小值改为-1000的情况,可以看出,除左上角值以外,其他值略有不同,但颜色相近不易分辨。
若加上1e-4,则最小值为-80,与其他的值相近。所以可以选取各值加上1e-4。
附上完整的代码:

clear all;clc;close all;

%% 参数设置
M = 256;                % 矩阵高度
N = 256;                % 矩阵宽度
top = M/8+1;
bottom = M*7/8;
left = N/8+1;
right = N*7/8;
theta = -pi/12;          % 扭曲或旋转角度
alphax = -0.2;             % x轴扭曲常数
alphay = 0;
%% 生成信号
% 原始信号
S0 = zeros(M,N);
S0(top:bottom,left:right) = 1;
% 扭曲信号
S1 = zeros(M,N);
 for ii = 1:M
     for jj = 1:N
         A=[1 -alphax;alphay 1]*[ii-M/2 jj-N/2].'; %扭曲、旋转运算要以中心为原点
         xx = round(A(1,1)+M/2);%还原为以左上角为原点的坐标系
         yy = round(A(2,1)+N/2);
         if(xx>=1 && xx<= M && yy>=1 && yy<= N)
             S1(ii,jj) = S0(xx,yy);
         end
     end
 end
 % 旋转信号
S2 = zeros(M,N);
for ii = 1:M
    for jj = 1:N
        A=([cos(theta) -sin(theta);sin(theta) cos(theta)])*[ii-M/2 jj-N/2].';
        xx = round(A(1,1)+M/2);
        yy = round(A(2,1)+N/2);
        if(xx>=1 && xx<= M && yy>=1 && yy<=N)
            S2(ii,jj) = S0(xx,yy);
        end
    end
end
%% 二维傅里叶变换
% 原始信号的二维傅里叶变换
S0_ff = fftshift(fft2(fftshift(S0)));
S0_ff = abs(S0_ff);
S0_ff = S0_ff/max(max(S0_ff));
S0_ff = 20*log10(S0_ff+1e-4);
% 原始信号二维傅里叶变换
S1_ff = fftshift(fft2(fftshift(S1)));
S1_ff = abs(S1_ff);
S1_ff = S1_ff/max(max(S1_ff));
S1_ff = 20*log10(S1_ff+1e-4);
% 原始信号二维傅里叶变换
S2_ff = fftshift(fft2(fftshift(S2)));
S2_ff = abs(S2_ff);
S2_ff = S2_ff/max(max(S2_ff));
S2_ff = 20*log10(S2_ff+1e-4);

%% 画图
figure,set(gcf,'Color','w');colormap jet
subplot(2,3,1),imagesc(S0);axis image off
title('(a)时域,原始信号');
subplot(2,3,4),imagesc(S0_ff);axis image off
title('(b)原始信号频谱');
subplot(2,3,2),imagesc(S1);axis image off
title('(c)时域,扭曲信号');
subplot(2,3,5),imagesc(S1_ff);axis image off
title('(d)扭曲信号频谱');
subplot(2,3,3),imagesc(S2);axis image off
title('(e)时域,旋转信号');
subplot(2,3,6),imagesc(S2_ff);axis image off
title('(f)旋转信号频谱');

结果图如下:
合成孔径雷达成像——算法与实现图【2.2】仿真与解析_第4张图片

参考代码:

https://blog.csdn.net/Destiny0321/article/details/53002789?biz_id=102&utm_term=%E5%90%88%E6%88%90%E5%AD%94%E5%BE%84%E9%9B%B7%E8%BE%BE2.2&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-53002789&spm=1018.2118.3001.4449
https://www.cnblogs.com/heheda-jl/p/13485625.html

你可能感兴趣的:(扩展,matlab,合成孔径雷达,仿真,二维矩阵傅里叶变换)