当前位置:   article > 正文

python雷达成像(SAR)仿真:(三)徙动校正+方位压缩(完结)_sar方位向压缩

sar方位向压缩

  1. import numpy as np
  2. import math
  3. import cmath
  4. import pylab
  5. import time
  6. from matplotlib import pyplot as plt
  7. ##时间统计
  8. time_start = time.time()
  9. pylab.mpl.rcParams['font.sans-serif'] = ['SimHei']
  10. pylab.mpl.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  11. ## 参数设置
  12. ##--------------------------------------------------------------------
  13. ##定义参数
  14. R_nc = 20e3 # 景中心斜距
  15. Vr = 150 # 雷达有效速度
  16. Tr = 2.5e-6 # 发射脉冲时宽
  17. Kr = 20e12 # 距离调频率
  18. f0 = 5.3e9 # 雷达工作频率
  19. BW_dop = 80 # 多普勒带宽
  20. Fr = 60e6 # 距离采样率
  21. Fa = 200 # 方位采样率
  22. Naz = 512 # 距离线数(即数据矩阵,行数)——这里修改为1024
  23. Nrg = 512 # 距离线采样点数(即数据矩阵,列数)
  24. sita_r_c = (0 * np.pi) / 180 # 波束斜视角,0 度,这里转换为弧度
  25. c = 3e8 # 光速
  26. R0 = R_nc * np.cos(sita_r_c) # 与R_nc相对应的最近斜距,记为R0
  27. Nr = Tr * Fr # 线性调频信号采样点数
  28. BW_range = Kr * Tr # 距离向带宽
  29. lamda = c / f0 # 波长
  30. fnc = 2 * Vr * np.sin(sita_r_c) / lamda # 多普勒中心频率,根据公式(4.33)计算。
  31. La_real = 0.886 * 2 * Vr * np.cos(sita_r_c) / BW_dop # 方位向天线长度,根据公式(4.36
  32. beta_bw = 0.886 * lamda / La_real # 雷达3dB波束
  33. La = beta_bw * R0 # 合成孔径长度
  34. a_sr = Fr / BW_range # 距离向过采样因子
  35. a_sa = Fa / BW_dop # 方位向过采样因子
  36. Mamb = round(fnc / Fa) # 多普勒模糊
  37. NFFT_r = Nrg # 距离向FFT长度
  38. NFFT_a = Naz # 方位向FFT长度
  39. ## 生成单个点目标信号
  40. # 目标位置坐标
  41. delta_R0 = 0 # 将目标1的波束中心穿越时刻,定义为方位向时间零点。
  42. x1 = R0
  43. y1 = delta_R0 + x1 * np.tan(sita_r_c)
  44. nc_1 = (y1 - x1 * np.tan(sita_r_c)) / Vr # 目标1的波束中心穿越时刻。
  45. s_echo = np.mat(np.zeros((Naz, Nrg))) # 用来存放生成的回波数据
  46. A0 = 1 # 目标回波幅度
  47. ###################### 生成轴
  48. tr = np.array((2 * x1 / c + np.arange(-Nrg / 2, (Nrg / 2), 1) / Fr), ndmin=2) # 距离时间轴
  49. fr = np.array((np.arange(-NFFT_r / 2, NFFT_r / 2) * (Fr / NFFT_r)), ndmin=2) # 距离频率轴
  50. ta = np.array((np.arange(-Naz / 2, Naz / 2) / Fa), ndmin=2) # 方位时间轴
  51. fa = np.array((np.arange(-NFFT_a / 2, NFFT_a / 2) * (Fa / NFFT_a) + fnc), ndmin=2) # 方位频率轴
  52. tr_mtx = np.ones((Naz, 1)) * tr # 距离时间轴矩阵,大小:Naz*Nrg
  53. ta_mtx = ta.T * np.ones((1, Nrg)) # 方位时间轴矩阵,大小:Naz*Nrg
  54. ###################### 生成目标回波数据
  55. R_n = np.sqrt(np.power(x1 * np.ones((Naz, Nrg)), 2) + np.power((Vr * ta_mtx - y1 * np.ones((Naz, Nrg))), 2)) # 目标的瞬时斜距
  56. w_range = ((np.abs(tr_mtx - 2 * R_n / c)) <= ((Tr / 2) * np.ones((Naz, Nrg))))
  57. w_azimuth = (np.abs(ta - nc_1) <= (La / 2) / Vr)
  58. w_azimuth = w_azimuth.T * np.ones((1, Nrg))
  59. s_echo = A0 * w_range * w_azimuth * np.exp(-(1j * 4 * np.pi * f0) * R_n / c) * np.exp(
  60. (1j * np.pi * Kr) * np.power((tr_mtx - 2 * R_n / c), 2))
  61. # plt.pcolor(s_echo.real, cmap='jet')
  62. # plt.colorbar()
  63. # pylab.title('s_echo.real')
  64. # plt.show()
  65. #
  66. # plt.pcolor(s_echo.imag, cmap='jet')
  67. # plt.colorbar()
  68. # pylab.title('s_echo.imag')
  69. # plt.show()
  70. #
  71. # plt.pcolor(np.abs(s_echo), cmap='jet')
  72. # plt.colorbar()
  73. # pylab.title('s_echo.abs')
  74. # plt.show()
  75. ########## 利用回波数据成像
  76. S_range = np.fft.fft(s_echo, NFFT_r)
  77. # plt.pcolor(S_range.real, cmap='jet')
  78. # plt.colorbar()
  79. # pylab.title('S_range.real')
  80. # plt.show()
  81. #
  82. # plt.pcolor(abs(S_range), cmap='jet')
  83. # plt.colorbar()
  84. # pylab.title('S_range.abs')
  85. # plt.show()
  86. t_ref = np.mat(np.arange(-Nr / 2, Nr / 2, 1) / Fr) # 用来生成距离MF的距离时间轴
  87. t_ref_mtx = np.dot(np.ones((Naz, 1)), t_ref) # 矩阵形式
  88. w_ref = np.mat(np.kaiser(Nr, 2.5)) # 距离向,构建Kaiser窗,此为列向量。
  89. w_ref = np.dot(np.mat(np.ones((Naz, 1))), w_ref) # 构成矩阵形式,每一行都相同的加窗。
  90. s_ref = np.exp((1j * np.pi * Kr) * (np.power(t_ref_mtx, 2)))
  91. # s_ref = np.pad(s_ref, (0, Nrg-int(Nr)), 'constant') # 对复制脉冲,后端补零。
  92. S_ref = np.fft.fft(s_ref, NFFT_r)
  93. H_range = np.conj(S_ref) # 距离向匹配滤波器,零频在两端。
  94. S_range_c = S_range * H_range # 乘以匹配滤波器,零频在两端。
  95. s_rc = np.fft.ifft(S_range_c) # 完成距离压缩,回到二维时域。
  96. # plt.pcolor(s_rc.real, cmap='jet')
  97. # plt.colorbar()
  98. # pylab.title('s_rc.real')
  99. # plt.show()
  100. #
  101. # plt.pcolor(abs(s_rc), cmap='jet')
  102. # plt.colorbar()
  103. # pylab.title('s_rc.abs')
  104. # plt.show()
  105. ##### 处理脉压的弃置区:弃置长度 = N-1
  106. N_rg = int(Nrg - (Nr - 1)) # 保留长度(完全卷积的长度)
  107. s_rc_c = np.zeros((Naz, N_rg)) # 用来存放去除弃置区后的数据
  108. s_rc_c = s_rc[:, 0:N_rg] # 取前 N_rg列。
  109. # plt.pcolor(S_range_c.real, cmap='jet')
  110. # plt.colorbar()
  111. # pylab.title('S_range_c.real')
  112. # plt.show()
  113. #
  114. # plt.pcolor(abs(S_range_c), cmap='jet')
  115. # plt.colorbar()
  116. # pylab.title('S_range_c.abs')
  117. # plt.show()
  118. #
  119. #
  120. # 截取后的 ##
  121. # plt.pcolor(s_rc_c.real, cmap='jet')
  122. # plt.colorbar()
  123. # pylab.title('s_rc_c.real')
  124. # plt.show()
  125. #
  126. # plt.pcolor(abs(s_rc_c), cmap='jet')
  127. # plt.colorbar()
  128. # pylab.title('s_rc_c.abs')
  129. # plt.show()
  130. ############# 变换到距离多普勒域,进行距离徙动校正 #############
  131. s_rc_c = s_rc_c * np.exp(-1j * 2 * np.pi * fnc * (ta.T * np.ones((1, N_rg)))) # 数据搬移
  132. S_rd = np.fft.fft(s_rc_c, NFFT_a ,0) # 方位向傅里叶变换,到距离多普勒域
  133. # plt.pcolor(S_rd.real, cmap='jet')
  134. # plt.colorbar()
  135. # pylab.title('S_rd.real')
  136. # plt.show()
  137. #
  138. # plt.pcolor(abs(S_rd), cmap='jet')
  139. # plt.colorbar()
  140. # pylab.title('S_rd.abs')
  141. # plt.show()
  142. # ====================================================================
  143. # 设置方位频率轴——关键点!!!
  144. fa =np.array(fnc + np.fft.fftshift(np.arange(-NFFT_a/2, NFFT_a/2, 1))/NFFT_a*Fa, ndmin=2) # 方位频率轴如此设置。
  145. # =====================================================================
  146. # 下面这个是改进的,每一个最近斜距(R0)都随着距离门的不同而改变。
  147. tr_RCMC =np.array(2*x1/c + np.arange(-N_rg/2, (N_rg/2), 1)/Fr, ndmin=2) # 在新的距离线长度下的时间轴
  148. R0_RCMC = (c/2)*tr_RCMC # 随距离线变化的R0,记为R0_RCMC,用来计算RCM和Ka。
  149. delta_Rrd_fn = np.dot(lamda*lamda*np.power(fa.T, 2),R0_RCMC/(8*Vr*Vr)) # 《合成孔径雷达成像算法与实现》P-146 6.11
  150. num_range = c/(2*Fr) # 一个距离采样单元,对应的长
  151. delta_Rrd_fn_num = delta_Rrd_fn/num_range # 每一个方位向频率,其RCM对应的距离采样单元数
  152. R = 8 # sinc插值核长度
  153. S_rd_rcmc = np.zeros((NFFT_a, N_rg), dtype=complex) # 用来存放RCMC后的值
  154. for p in range(0, NFFT_a):
  155. for q in range(0, N_rg):
  156. delta_Rrd_fn_p = delta_Rrd_fn_num[p, q]
  157. Rrd_fn_p = q + delta_Rrd_fn_p
  158. Rrd_fn_p_zheng = np.ceil(Rrd_fn_p) # ceil,向上取整。
  159. 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)
  160. rcmc_sinc = np.sinc(ii)
  161. # rcmc_sinc = rcmc_sinc / np.sum(rcmc_sinc) # 插值核的归一化 python 中自动归一化了
  162. # ii是sinc插值过程的变量;
  163. # g(x) = sum(h(ii) * g_d(x - ii)) = sum(h(ii) * g_d(ll));
  164. # 由于S_rd只有整数点取值,且范围有限。因此插值中要考虑它的取值溢出边界问题。
  165. # 这里我采取循环移位的思想,用来解决取值溢出问题。
  166. if (Rrd_fn_p_zheng-R/2) > N_rg:
  167. ll = np.array(np.arange(Rrd_fn_p_zheng - R / 2 - N_rg, Rrd_fn_p_zheng+R / 2-N_rg, 1), ndmin=2)
  168. else:
  169. if (Rrd_fn_p_zheng+R/2-1) > N_rg: # 部分右溢
  170. ll_1 = np.array(np.arange(Rrd_fn_p_zheng - R / 2, N_rg+1, 1), ndmin=2)
  171. ll_2 = np.array(np.arange(1, Rrd_fn_p_zheng+R / 2-1-N_rg+1, 1), ndmin=2)
  172. ll = np.array(np.append(ll_1, ll_2), ndmin=2, dtype=int)
  173. else:
  174. if (Rrd_fn_p_zheng+R/2-1) < 1: # 全左溢(不可能发生,但还是要考虑)
  175. 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)
  176. else:
  177. if (Rrd_fn_p_zheng-R/2) < 1: # 部分左溢
  178. ll_1 = np.array(np.arange(Rrd_fn_p_zheng-R/2+N_rg, N_rg+1, 1), ndmin=2)
  179. ll_2 = np.array(np.arange(1, Rrd_fn_p_zheng+R/2, 1), ndmin=2)
  180. ll = np.array(np.append(ll_1, ll_2), ndmin=2, dtype=int)
  181. else:
  182. ll = np.array(np.arange(Rrd_fn_p_zheng - R / 2, Rrd_fn_p_zheng+R / 2, 1), ndmin=2, dtype=int)
  183. rcmc_S_rd = S_rd[[p], ll-1]
  184. S_rd_mid= rcmc_sinc*rcmc_S_rd
  185. S_rd_rcmc[p, q] = np.sum(S_rd_mid)
  186. # plt.pcolor(S_rd_rcmc.real, cmap='jet')
  187. # plt.colorbar()
  188. # pylab.title('S_rd_rcmc.real')
  189. # plt.show()
  190. #
  191. # plt.pcolor(abs(S_rd_rcmc), cmap='jet')
  192. # plt.colorbar()
  193. # pylab.title('S_rd_rcmc.abs')
  194. # plt.show()
  195. # ======= 方位压缩
  196. fa_azimuth_MF = fa # 方位频率轴,采用和RCMC中所用的频率轴相同。
  197. Ka = 2*Vr*Vr*np.power(np.cos(sita_r_c), 3)/(lamda* R0_RCMC) # 方位向调频率,是随最近斜距R0变化的。
  198. Ka_1 = 1/Ka # 为了方便计算,先取倒数。
  199. Haz = np.exp(-1j*np.pi*(np.power(fa_azimuth_MF.T, 2)*Ka_1)) # 方位向匹配滤波器
  200. S_rd_c = S_rd_rcmc*Haz # 乘以匹配滤波器
  201. s_ac = np.fft.ifft(S_rd_c, NFFT_a, 0)
  202. plt.pcolor(abs(s_ac), cmap='jet')
  203. plt.colorbar()
  204. pylab.title('s_ac.abs')
  205. plt.show()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/67065
推荐阅读
相关标签
  

闽ICP备14008679号