基于gprMax以及Matlab仿真的SFCW雷达信号处理笔记
本人为初学者,且不常使用CSDN,如遇到问题可发送邮件至2538703415@qq.com讨论,这样我能及时看见,但不一定能帮你解决……
当前使用gprMax进行探地雷达仿真主要存在以下两个问题,它们分别是:
gprMax无法直接对一段完整的SFCW信号进行仿真
,若要通过gprMax直接实现SFCW信号的回波仿真,则要将一段完整的SFCW信号拆分成若干段频率单一的余弦信号分别进行仿真,对于拥有上百个频点的SFCW信号而言,需要进行上百次单独的仿真。- 使用自定义波形或gprMax内置波形进行仿真时,
仿真速度偏低且灵活性差,每次在用户需要更改波形时,都要重新开始仿真
。
对于提到的这些问题,包括gprMax开发团队在内的很多研究团体都得出了一些解决方案,这份readme文档将对这些解决方案进行归纳总结。这一仓库中的代码最终实现如下结果:
图一:gprMax模型
图二:Matlab仿真结果
根目录文件 | 文件作用 |
---|---|
main.m | 运行此文件,执行matlab仿真 |
simu_single_step.m | 运行此文件,执行matlab仿真(无图) |
result.mat | 对应bscan_impulse_merged.out的仿真结果 |
result_10m.mat | 对应bscan_impulse_merged_10m.out的仿真结果 |
impulse_lib文件夹 | 文件作用 |
---|---|
bscan_impulse_10m_merged.out | 对应bscan_impulse_10m.in的bscan冲激响应输出结果 |
bscan_impulse_merged.out | 对应bscan_impulse.in的bscan冲激响应输出结果 |
gprMax_source文件夹 | 文件作用 |
---|---|
sfcw_impulse.in | 模型1的输入文件,可用于生成vti,对应bscan子文件夹中的bscan_impulse.in |
sfcw_impulse_10m.in | 模型2的输入文件,可用于生成vti,对应bscan子文件夹中的bscan_impulse_10m.in |
impulse_response_10m.vti | 模型2(对应图一)的vti文件 |
冲激响应法求解回波模型
为了解决gprMax仿真灵活性差,耗时长的问题,可以采用信号与系统中的基础知识,通过将模拟场景视为一个线性时不变系统(LTI system),将输入信号(也就是用户自定义的发射信号)与这一LTI系统的冲激响应h(t)相卷积,从而得到对应于输入信号的模拟场景回波信号。
图三:冲激响应计算y(t)
在通过一次仿真求得系统的冲激响应之后,用户只需要在matlab中将输入信号与此冲激响应相卷积,就可以得到对应的回波模型。gprMax提供了冲激信号波形(impulse),但是没有在对应的参考文献中列出
,此波形可以直接使用,在使用时,其他波形对应的中心频率项对impulse波形不再生效(毕竟冲激信号只有tn=0时有值)。
具体的操作方法不在此处详细列出,对应的生成系统冲激响应的文件在github中可以查看。
这一部分的具体操作可参考:
- https://blog.csdn.net/l_jsaphsj/article/details/127530336?spm=1001.2014.3001.5501
- https://www.youtube.com/watch?v=_FWNeqTr9nc&t=1387s (gprMax官方)
SFCW信号回波的仿真(gprMax & Matlab)
SFCW雷达每次发射和接收的信号为单频连续波信号,其频率变化可表示为:
f
n
=
f
0
+
(
n
−
1
)
Δ
f
f_n = f_0 + (n-1)\Delta f
fn=f0+(n−1)Δf
其中
f
n
f_n
fn 是当前(第n个)频率,
f
0
f_0
f0 是起始频率,
Δ
f
\Delta f
Δf 为频率步长。
发射信号可以被表示为:
T
x
(
n
)
=
s
i
n
(
2
π
f
n
t
)
T_x(n) = sin(2\pi f_nt)
Tx(n)=sin(2πfnt)
其中n为第n个频点。
假设信号在均匀介质中的传播速度为
v
v
v ,则一个距离目标为
R
R
R 的物体所反射的回波信号可以表示为:
R
x
(
n
)
=
A
n
s
i
n
[
2
π
f
n
(
t
−
2
R
v
)
]
R_x(n) = A_nsin[2\pi f_n(t - \frac{2R}{v})]
Rx(n)=Ansin[2πfn(t−v2R)]
其中
A
n
A_n
An 为回波幅度,
2
R
v
\frac{2R}{v}
v2R 是信号的双程走时。
第n个频率的相位变化可对应表示为:
Φ
n
=
2
π
f
n
2
R
v
\Phi_n = 2\pi f_n\frac{2R}{v}
Φn=2πfnv2R
接收到的回波信号由此可以表示为:
R
x
(
n
)
=
A
n
s
i
n
(
2
π
f
n
t
−
Φ
n
)
R_x(n) = A_nsin(2\pi f_nt - \Phi_n)
Rx(n)=Ansin(2πfnt−Φn)
不同的频点对应着不同的相移,这些相位信息对于特定的某个频点而言是一个常数,但是将SFCW信号中的几十至几百甚至更多频点的相位信息结合之后,能够得到一个具有周期性的相位信号,将这个信号进行ifft变换,即可得到对应于距离的时域信息。
图四:雷达系统框图
图四中的I和Q分量可通过如下公式进行计算:
I
n
=
A
n
s
i
n
(
2
π
f
n
t
−
Φ
n
)
∗
s
i
n
(
2
π
f
n
t
)
=
A
n
2
s
i
n
(
4
π
f
n
t
−
Φ
n
)
−
A
n
2
c
o
s
(
Φ
n
)
I_n = A_nsin(2\pi f_nt-\Phi_n)*sin(2\pi f_nt) = \frac{An}{2}sin(4\pi f_nt-\Phi_n) - \frac{A_n}{2}cos(\Phi_n)
In=Ansin(2πfnt−Φn)∗sin(2πfnt)=2Ansin(4πfnt−Φn)−2Ancos(Φn)
I
n
=
A
n
s
i
n
(
2
π
f
n
t
−
Φ
n
)
∗
c
o
s
(
2
π
f
n
t
)
=
A
n
2
s
i
n
(
4
π
f
n
t
−
Φ
n
)
−
A
n
2
s
i
n
(
Φ
n
)
I_n = A_nsin(2\pi f_nt-\Phi_n)*cos(2\pi f_nt) = \frac{An}{2}sin(4\pi f_nt-\Phi_n) - \frac{A_n}{2}sin(\Phi_n)
In=Ansin(2πfnt−Φn)∗cos(2πfnt)=2Ansin(4πfnt−Φn)−2Ansin(Φn)
在通过低通滤波器之后,可以提取出I和Q对应的差频分量为:
I
n
=
−
A
n
2
c
o
s
(
Φ
n
)
I_n = -\frac{A_n}{2}cos(\Phi_n)
In=−2Ancos(Φn)
Q
n
=
−
A
n
2
s
i
n
(
Φ
n
)
Q_n = -\frac{A_n}{2}sin(\Phi_n)
Qn=−2Ansin(Φn)
注意在经过LPF之后需要对两部分差频分量进行组合
,即输入ADC的信号应当为如下形式:
A D C i n ( n ) = I n + j Q n ADC_{in}(n) = I_n + jQ_n ADCin(n)=In+jQn
对于经过IFFT处理后得到的时域信号,其横坐标轴的长度由ADC采样点数决定,其横坐标轴的精度由SFCW信号的带宽决定,设SFCW信号的带宽为
B
B
B ,则其横坐标轴可表示为:
t
=
0
:
1
B
:
N
t
−
1
B
t = 0:\frac{1}{B}:\frac{N_t-1}{B}
t=0:B1:BNt−1
其中
N
t
N_t
Nt是ADC采样点数。
gprMax生成模型时的注意事项
本人设计的in文件中,包含一项time_step_stability_factor参数,这一参数的具体用法可以参考官方文件,其作用主要是将dt进行手动调整(比如设置为1e-11s)。设置这一参数的主要目的是使gprMax中的dt和Matlab中的采样时间间隔dt相同,以方便仿真(两个dt不相同会怎样这个我也没试过,应该也行问题不大)。
gprMax中网格步长参数的设置
根据官方给出的文档,gprmax模型中的网格步长不能大于模型介质中最短波长的十分之一,即:
c
a
l
c
d
x
y
z
≤
1
10
c
f
m
a
x
ϵ
m
a
x
calc_{dxyz} \leq \frac{1}{10}\frac{c}{f_{max}\sqrt{\epsilon_{max}}}
calcdxyz≤101fmaxϵmaxc
这项参数的最大值可以通过func文件夹中的calc_dxyz函数进行快速计算。
拆分后的单频率信号波形设置
在使用冲激响应方法,通过卷积获得输出信号波形时,如果直接输入一个完整的单频正弦信号,会导致卷积结果中包含大量高频噪声
,因此,在设置输入的单频正弦信号时,需要逐渐提升信号幅值,其信号波形如下所示:
图五:单频余弦信号
图五所示的信号在gprMax中对应的波形名称为contsine,其公式如下所示:
T x ( t ) = { k f n t s i n ( 2 π f n t ) k f n t < 1 s i n ( 2 π f n t ) k f n t ≥ 1 T_x(t) = \begin{cases} kf_ntsin(2\pi f_nt) & kf_nt <1\\ \\ sin(2\pi f_nt) & kf_nt \geq 1 \end{cases} Tx(t)=⎩ ⎨ ⎧kfntsin(2πfnt)sin(2πfnt)kfnt<1kfnt≥1
在gprMax的waveforms.py中, k = 0.25 k = 0.25 k=0.25