import numpy as np
import math
import cmath
import pylab
import time
from matplotlib import pyplot as plt##时间统计
time_start = time.time()pylab.mpl.rcParams['font.sans-serif'] = ['SimHei']
pylab.mpl.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
## 参数设置
##--------------------------------------------------------------------
##定义参数
R_nc = 20e3  # 景中心斜距
Vr = 150  # 雷达有效速度
Tr = 2.5e-6  # 发射脉冲时宽
Kr = 20e12  # 距离调频率
f0 = 5.3e9  # 雷达工作频率
BW_dop = 80  # 多普勒带宽
Fr = 60e6  # 距离采样率
Fa = 200  # 方位采样率
Naz = 512  # 距离线数(即数据矩阵,行数)——这里修改为1024。
Nrg = 512  # 距离线采样点数(即数据矩阵,列数)
sita_r_c = (0 * np.pi) / 180  # 波束斜视角,0 度,这里转换为弧度
c = 3e8  # 光速R0 = R_nc * np.cos(sita_r_c)  # 与R_nc相对应的最近斜距,记为R0
Nr = Tr * Fr  # 线性调频信号采样点数
BW_range = Kr * Tr  # 距离向带宽
lamda = c / f0  # 波长
fnc = 2 * Vr * np.sin(sita_r_c) / lamda  # 多普勒中心频率,根据公式(4.33)计算。
La_real = 0.886 * 2 * Vr * np.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长度## 生成单个点目标信号
# 目标位置坐标
delta_R0 = 0  # 将目标1的波束中心穿越时刻,定义为方位向时间零点。
x1 = R0
y1 = delta_R0 + x1 * np.tan(sita_r_c)
nc_1 = (y1 - x1 * np.tan(sita_r_c)) / Vr  # 目标1的波束中心穿越时刻。s_echo = np.mat(np.zeros((Naz, Nrg)))  # 用来存放生成的回波数据
A0 = 1  # 目标回波幅度######################           生成轴
tr = np.array((2 * x1 / c + np.arange(-Nrg / 2, (Nrg / 2), 1) / Fr), ndmin=2)  # 距离时间轴
fr = np.array((np.arange(-NFFT_r / 2, NFFT_r / 2) * (Fr / NFFT_r)), ndmin=2)  # 距离频率轴
ta = np.array((np.arange(-Naz / 2, Naz / 2) / Fa), ndmin=2)  # 方位时间轴
fa = np.array((np.arange(-NFFT_a / 2, NFFT_a / 2) * (Fa / NFFT_a) + fnc), ndmin=2)  # 方位频率轴
tr_mtx = np.ones((Naz, 1)) * tr  # 距离时间轴矩阵,大小:Naz*Nrg
ta_mtx = ta.T * np.ones((1, Nrg))  # 方位时间轴矩阵,大小:Naz*Nrg######################           生成目标回波数据
R_n = np.sqrt(np.power(x1 * np.ones((Naz, Nrg)), 2) + np.power((Vr * ta_mtx - y1 * np.ones((Naz, Nrg))), 2))  # 目标的瞬时斜距
w_range = ((np.abs(tr_mtx - 2 * R_n / c)) <= ((Tr / 2) * np.ones((Naz, Nrg))))
w_azimuth = (np.abs(ta - nc_1) <= (La / 2) / Vr)
w_azimuth = w_azimuth.T * np.ones((1, Nrg))
s_echo = A0 * w_range * w_azimuth * np.exp(-(1j * 4 * np.pi * f0) * R_n / c) * np.exp((1j * np.pi * Kr) * np.power((tr_mtx - 2 * R_n / c), 2))# plt.pcolor(s_echo.real, cmap='jet')
# plt.colorbar()
# pylab.title('s_echo.real')
# plt.show()
#
# plt.pcolor(s_echo.imag, cmap='jet')
# plt.colorbar()
# pylab.title('s_echo.imag')
# plt.show()
#
# plt.pcolor(np.abs(s_echo), cmap='jet')
# plt.colorbar()
# pylab.title('s_echo.abs')
# plt.show()########## 利用回波数据成像
S_range = np.fft.fft(s_echo, NFFT_r)# plt.pcolor(S_range.real, cmap='jet')
# plt.colorbar()
# pylab.title('S_range.real')
# plt.show()
#
# plt.pcolor(abs(S_range), cmap='jet')
# plt.colorbar()
# pylab.title('S_range.abs')
# plt.show()t_ref = np.mat(np.arange(-Nr / 2, Nr / 2, 1) / Fr)  # 用来生成距离MF的距离时间轴
t_ref_mtx = np.dot(np.ones((Naz, 1)), t_ref)  # 矩阵形式
w_ref = np.mat(np.kaiser(Nr, 2.5))  # 距离向,构建Kaiser窗,此为列向量。
w_ref = np.dot(np.mat(np.ones((Naz, 1))), w_ref)  # 构成矩阵形式,每一行都相同的加窗。
s_ref = np.exp((1j * np.pi * Kr) * (np.power(t_ref_mtx, 2)))
# s_ref = np.pad(s_ref, (0, Nrg-int(Nr)), 'constant')  # 对复制脉冲,后端补零。
S_ref = np.fft.fft(s_ref, NFFT_r)
H_range = np.conj(S_ref)  # 距离向匹配滤波器,零频在两端。
S_range_c = S_range * H_range  # 乘以匹配滤波器,零频在两端。s_rc = np.fft.ifft(S_range_c)  # 完成距离压缩,回到二维时域。# plt.pcolor(s_rc.real, cmap='jet')
# plt.colorbar()
# pylab.title('s_rc.real')
# plt.show()
#
# plt.pcolor(abs(s_rc), cmap='jet')
# plt.colorbar()
# pylab.title('s_rc.abs')
# plt.show()#####  处理脉压的弃置区:弃置长度 = N-1
N_rg = int(Nrg - (Nr - 1))  # 保留长度(完全卷积的长度)
s_rc_c = np.zeros((Naz, N_rg))  # 用来存放去除弃置区后的数据
s_rc_c = s_rc[:, 0:N_rg]  # 取前 N_rg列。# plt.pcolor(S_range_c.real, cmap='jet')
# plt.colorbar()
# pylab.title('S_range_c.real')
# plt.show()
#
# plt.pcolor(abs(S_range_c), cmap='jet')
# plt.colorbar()
# pylab.title('S_range_c.abs')
# plt.show()
#
## 截取后的 ##
# plt.pcolor(s_rc_c.real, cmap='jet')
# plt.colorbar()
# pylab.title('s_rc_c.real')
# plt.show()
#
# plt.pcolor(abs(s_rc_c), cmap='jet')
# plt.colorbar()
# pylab.title('s_rc_c.abs')
# plt.show()#############  变换到距离多普勒域,进行距离徙动校正 #############
s_rc_c = s_rc_c * np.exp(-1j * 2 * np.pi * fnc * (ta.T * np.ones((1, N_rg))))  # 数据搬移
S_rd = np.fft.fft(s_rc_c, NFFT_a ,0)  # 方位向傅里叶变换,到距离多普勒域# plt.pcolor(S_rd.real, cmap='jet')
# plt.colorbar()
# pylab.title('S_rd.real')
# plt.show()
#
# plt.pcolor(abs(S_rd), cmap='jet')
# plt.colorbar()
# pylab.title('S_rd.abs')
# plt.show()# ====================================================================
# 设置方位频率轴——关键点!!!
fa =np.array(fnc + np.fft.fftshift(np.arange(-NFFT_a/2, NFFT_a/2, 1))/NFFT_a*Fa, ndmin=2)      # 方位频率轴如此设置。
# =====================================================================#  下面这个是改进的,每一个最近斜距(R0)都随着距离门的不同而改变。
tr_RCMC =np.array(2*x1/c + np.arange(-N_rg/2, (N_rg/2), 1)/Fr, ndmin=2)      # 在新的距离线长度下的时间轴
R0_RCMC = (c/2)*tr_RCMC       # 随距离线变化的R0,记为R0_RCMC,用来计算RCM和Ka。delta_Rrd_fn = np.dot(lamda*lamda*np.power(fa.T, 2),R0_RCMC/(8*Vr*Vr))      # 《合成孔径雷达成像算法与实现》P-146 6.11num_range = c/(2*Fr)        # 一个距离采样单元,对应的长
delta_Rrd_fn_num = delta_Rrd_fn/num_range      # 每一个方位向频率,其RCM对应的距离采样单元数R = 8      # sinc插值核长度
S_rd_rcmc = np.zeros((NFFT_a, N_rg), dtype=complex)         # 用来存放RCMC后的值for p in range(0, NFFT_a):for q in range(0, N_rg):delta_Rrd_fn_p = delta_Rrd_fn_num[p, q]Rrd_fn_p = q + delta_Rrd_fn_pRrd_fn_p_zheng = np.ceil(Rrd_fn_p)     # ceil,向上取整。ii = np.array(np.arange(Rrd_fn_p - (Rrd_fn_p_zheng - R / 2), Rrd_fn_p-(Rrd_fn_p_zheng+R / 2), -1), ndmin=2)rcmc_sinc = np.sinc(ii)# rcmc_sinc = rcmc_sinc / np.sum(rcmc_sinc)   # 插值核的归一化  python 中自动归一化了# 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 = np.array(np.arange(Rrd_fn_p_zheng - R / 2 - N_rg, Rrd_fn_p_zheng+R / 2-N_rg, 1), ndmin=2)else:if (Rrd_fn_p_zheng+R/2-1) > N_rg:       # 部分右溢ll_1 = np.array(np.arange(Rrd_fn_p_zheng - R / 2, N_rg+1, 1), ndmin=2)ll_2 = np.array(np.arange(1, Rrd_fn_p_zheng+R / 2-1-N_rg+1, 1), ndmin=2)ll = np.array(np.append(ll_1, ll_2), ndmin=2, dtype=int)else:if (Rrd_fn_p_zheng+R/2-1) < 1:      # 全左溢(不可能发生,但还是要考虑)ll = np.array(np.arange(Rrd_fn_p_zheng - R / 2 + N_rg, Rrd_fn_p_zheng+R / 2-1+N_rg, 1), ndmin=2, dtype=int)else:if (Rrd_fn_p_zheng-R/2) < 1:    # 部分左溢ll_1 = np.array(np.arange(Rrd_fn_p_zheng-R/2+N_rg, N_rg+1, 1), ndmin=2)ll_2 = np.array(np.arange(1, Rrd_fn_p_zheng+R/2, 1), ndmin=2)ll = np.array(np.append(ll_1, ll_2), ndmin=2, dtype=int)else:ll = np.array(np.arange(Rrd_fn_p_zheng - R / 2, Rrd_fn_p_zheng+R / 2, 1), ndmin=2, dtype=int)rcmc_S_rd = S_rd[[p], ll-1]S_rd_mid= rcmc_sinc*rcmc_S_rdS_rd_rcmc[p, q] = np.sum(S_rd_mid)# plt.pcolor(S_rd_rcmc.real, cmap='jet')
# plt.colorbar()
# pylab.title('S_rd_rcmc.real')
# plt.show()
#
# plt.pcolor(abs(S_rd_rcmc), cmap='jet')
# plt.colorbar()
# pylab.title('S_rd_rcmc.abs')
# plt.show()
# ======= 方位压缩
fa_azimuth_MF = fa      # 方位频率轴,采用和RCMC中所用的频率轴相同。
Ka = 2*Vr*Vr*np.power(np.cos(sita_r_c), 3)/(lamda* R0_RCMC)         # 方位向调频率,是随最近斜距R0变化的。
Ka_1 = 1/Ka                                       # 为了方便计算,先取倒数。
Haz = np.exp(-1j*np.pi*(np.power(fa_azimuth_MF.T, 2)*Ka_1))        # 方位向匹配滤波器
S_rd_c = S_rd_rcmc*Haz      # 乘以匹配滤波器
s_ac = np.fft.ifft(S_rd_c, NFFT_a, 0)plt.pcolor(abs(s_ac), cmap='jet')
plt.colorbar()
pylab.title('s_ac.abs')
plt.show()

python雷达成像(SAR)仿真:(三)徙动校正+方位压缩(完结)相关推荐

  1. 合成孔径雷达成像matlab,合成孔径雷达成像Matlab仿真研究.doc

    合成孔径雷达成像Matlab仿真研究.doc 合成孔径雷达成像Matlab仿真研究 摘 要: 计算机仿真是现代雷达研究中的重要技术之一,针对合成孔径雷达(SAR)成像中影响仿真结果的因素,从分析SAR ...

  2. 雷达成像 Matlab 仿真 3 —— 多目标检测

    文章目录 1. 多目标信号的回波 1.1 参数设置 1.2 生成回波信号 2. 脉冲压缩 2.1 未加窗 2.2 加 hann 窗 3. 绘制图像 脉冲压缩能够将信号压缩变窄,使得在时域上有重叠的两个 ...

  3. SAR成像系列:【9】合成孔径雷达(SAR)成像算法-波数域(omega-K)成像算法[也叫距离徙动(RM)算法](附Matlab代码)

    波数域()成像算法作为本系列的最后一种成像算法介绍.关于SAR成像的其他的各种改进算法就不一一列举了.在实际成像中,万变不离其踪,最主要的是关注成像的几何模型,再根据指标选择不同的基础成像算法,然后进 ...

  4. 【雷达】SAR距离多普勒成像算法+MATLAB代码(转载请标注德雅村支书)

    https://blog.csdn.net/Nudt_EE_Wuhao/article/details/86523569 RD算法是SAR成像常见的一种算法,也是最简单的SAR成像算法之一: 本篇代码 ...

  5. matlab仿真点目标,sar合成孔径雷达图像点目标仿真报告(附matlab代码).docx

    sar合成孔径雷达图像点目标仿真报告(附matlab代码).docx SAR图像点目标仿真报告徐一凡1SAR原理简介合成孔径雷达(SyntheticApertureRadar,简称SAR)是一种高分辨 ...

  6. SAR成像系列:【5】合成孔径雷达(SAR)成像算法-距离多普勒(RD)算法(附Matlab代码)

    完整的距离多普勒算法主要包括距离压缩.距离徙动矫正(矫正距离走动和距离弯曲).方位压缩等步骤.其中距离走动矫正即可在时域进行也可在频域进行,而距离弯曲矫正一般在多普勒域进行.在距离多普勒域叫作RCMC ...

  7. SAR成像系列:【8】合成孔径雷达(SAR)成像算法-压缩感知(Compressed Sensing,CS)成像算法(附Matlab代码)

    压缩感知(Compressed Sensing,CS)该理论指出:对于满足约束等距条件(Restricted Isometry Property,RIP)的稀疏或可压缩信号,通过低于(甚至远低于)Ny ...

  8. 【雷达】基于RD、RMA、CS三种算法实现雷达成像附matlab代码

    1 简介 基于RD.RMA.CS三种算法实现雷达成像matlab代码​ 2 完整代码 %Chirp Scaling二维成像仿真. %抛物面聚焦,条带测绘,正侧视工作方式. 匹配滤波.%目标为3个散射点 ...

  9. RD算法及其距离徙动校正(原理及matlab仿真)

    RD算法流程图: 图1 RD算法流程图 因为是在word里写的,这里直接上截图了,不然mathtype公式显示不出来. 对于RD算法的原理这里就不展开讨论了,重点分析距离徙动校正的原理. 仿真程序,F ...

  10. SAR成像系列:【4】合成孔径雷达(SAR)距离历程分析

    (1)SAR的距离历程-正侧视 合成孔径雷达(SAR)成像中,所有算法的基础是对距离历程(Range History)的分析."合成孔径"从表面上看是合成了雷达阵列,从信号上看是获 ...

最新文章

  1. 和晋叔吹B讨论业务驱动与架构演进
  2. HTML基础第七讲---框架
  3. 15-数据结构探险系列-图篇
  4. 8086寄存器组织结构
  5. Linux中强制结束一个进程的终极方法
  6. python学习day06--01
  7. 阿里云Java虚拟机的安装位置
  8. Linux 中的零拷贝技术
  9. 批处理作业调度问题 ——回溯法详解
  10. respondsToSelector的相关使用
  11. 2017.10.11 Problem c 失败总结
  12. windows系统bat批处理 一键添加共享打印机
  13. 云智慧压测实战分享之JMeter场景设置与监控
  14. 如何在互联网上寻找免费电子书?(其二)
  15. python 读excel每行替换_Python使用openpyxl读写excel文件
  16. SDP PPS SPS分析(spsparser)
  17. LODOP属性和方法
  18. XDOJ 235-月份判断
  19. c语言用键盘弹钢琴,【游戏】用键盘弹钢琴(大家都来试试吧)
  20. 非线性方程的数值解法

热门文章

  1. 《JAVA继承与多态》【Person、Student、Employee类】(注:此题在书上原题基础上有修改)设计一个名为Person的类和它的两个名为Student和Employee子类。
  2. matlab投资组合权重,【原创】投资组合风险-收益关系的Matlab实现
  3. Auto.Js 抖音脚本 性别识别 消息自定义 免ROOT
  4. 软件项目管理MOOC(北邮)——第十章测试答案
  5. 【马克思主义基本原理】--导论
  6. KSO-.NETCore部署CentOS7.5中验证码绘图Bitmap类型报错“The type initializer for ‘Gdip‘ threw an exception ”
  7. ps一点等于多少厘米_PS像素与厘米之间的转换
  8. 一文读懂什么是ICT
  9. java 委托 代理 区别_区分委托,组合和聚合(Java OOdevise)
  10. moments音标_moments是什么意思_moments的翻译_音标_读音_用法_例句_爱词霸在线词典...