雷达干扰仿真及其Python代码

来源:http://worthpen.top/#/home/blog?blog=pot-blog7.md

目录

  • 引言
  • 干扰信号
    • 线性调频信号
      • 代码
    • 压制干扰
      • 射频噪声干扰
        • 代码
      • 噪声调幅干扰
        • 代码
      • 噪声调频干扰
        • 代码
      • 噪声调相干扰
        • 代码
    • 欺骗干扰
      • 延时转发干扰
        • 代码
    • 灵巧噪声干扰
      • 噪声卷积调制
        • 代码
      • 噪声乘积调制
        • 代码

引言

雷达干扰,是指扰敌或欺骗敌方雷达设备,使其效能降低或丧失的电子干扰。雷达在现代具有重要作用,因此,雷达干扰及其对抗技术具有重要研究意义。本文对各种雷达干扰进行描述,并给出相应代码。

与其他文章相比,该文章给出了雷达干扰的Python仿真结果,便于利用深度学习架构研究雷达对抗技术。

干扰信号

现代导引头的基础组成一般包括导引头发射机、天线、接收机、信号处理器和终端等几部分。导引头发射的调制电磁波在传播中遇到静止或运动物体后,电磁能量会向脉冲发射方向散射,散射信号称为回波。回波信号的参数受物体相对运动速度、入射角度、物体距离等因素影响。导引头接收机采集到回波后,经过滤波、解调和杂波抑制等预处理,实现对目标物体的距离、速度和方位等信息的检测。

针对导引头的工作原理,发展出了以压制干扰和欺骗干扰为两大门类的多种有源干扰技术,这两类有源干类的区别在于作用机制。压制式干扰通过发射调制后的高能量噪声淹没导引头回波,致盲导引头接收机。欺骗式干扰是通过产生真实回波的孪生信号来迷惑敌方导引头。在导引头的帮助下,我方可以第一时间获取对方动向,占据主动权,一旦导引头受到干扰,会大大削弱我方优势。知己知彼是制胜法宝,因此对干扰特性的充分认识和干扰类型的辨别是赢得电子战的前提和基础。

这里对常见的导引头有源干扰样式进行数学建模。首先,介绍了作为有源干扰作用目标的线性调频导引头的工作原理,便于后续推导有源干扰的数学模型;其次,研究了可以作用于大部分体制导引头的有源压制式干扰,包括射频噪声干扰和三种调制噪声类干扰(分别是幅度调制、频率调制和相位调制);再次,介绍DRFM干扰机工作原理的基础上,研究了产生欺骗式干扰的几种形式,包括延时转发干扰和间歇采样转发干扰的基本原理;然后,分析了单一压制干扰和单一欺骗干扰的局限性,并介绍兼具二者干扰效能的灵巧噪声干扰。对上述所有干扰均做了数学建模并提供相关代码。

线性调频信号

脉冲压缩技术 (Pulse Compress, PC),有效地解决了导引头作用距离和距离分辨率之间的矛盾,还通过匹配滤波器抑制了与原发射信号不匹配的干扰信号。目前脉冲压缩是导引头信号处理体系中普遍采用的处理方案,在接收端使用脉冲压缩技术将大时宽信号压缩成窄脉冲,提高了导引头的距离分辨率,通过发射大带宽的信号也提高了速度分辨率,使导引头对目标速度和距离的测量得到兼顾。
在脉冲压缩导引头系统中,最常使用以线性调频信号 (Linear Frequency Modula-tion, LFM) 为首的导引头发射信号形式。线性调频信号的优点在于不仅易于生成,还可在以高平均发射功率发射宽脉冲的同时保持大的带宽,不降低导引头的距离分辨率。线性调频信号的生成原理是通过调制信号频率,使瞬时频率随时间呈现线性变化趋势,信号带宽得以增加,一个线性调频信号可表示为:
在这里插入图片描述
上式中,A 为线性调频信号的幅度,T 为发射脉冲的脉宽,f0为载波频率,B 为信号带宽,定义 K = B/T 为调频斜率,反映了频率变化的速度,rect(·) 为矩形函数。
雷达干扰仿真及其Python代码_第1张图片
图3 脉冲压缩原理
如图3所示,接收信号通过一个匹配滤波器完成对线性调频信号 s(t) 的脉冲压缩处理。匹配滤波器 h(t) 的脉冲响应是输入信号 s(t) 的复共轭。为提高导引头在多目标环境下的分辨能力,通常会在匹配滤波器后跟一个窗函数 h(t) 来实现旁瓣抑制,以免旁瓣淹没小目标的主瓣。汉宁窗(Hanning)、海明窗和矩形窗等都是常见的窗函数。线性调频信号的仿真结果如图所示。注意,本文所使用的滤波器为理想滤波器。
雷达干扰仿真及其Python代码_第2张图片

图 线性调频信号(时域、频域、脉冲压缩后)

代码

完整代码见文末

class SignalLinearFrequency(BaseSignal):
    def get_signal(self):
        k = self.band / self.t_duration
        output = numpy.exp(1j * 2 * numpy.pi * ((self.f_0 - self.band / 2) * self.t_range + k * self.t_range ** 2 / 2))
        return output

压制干扰

压制式干扰以噪声作为干扰来源,是最易用和最常用的一种有源干扰技术。一方面,压制式干扰的显要优点是不需要提前获悉太多敌方导引头的信号特征和信号处理手段,只需要知道导引头工作所在的频段即可,因此虽然压制式干扰设备较为简单,但对传统体制导引头仍有不错的干扰效果。另一方面,其缺点在于需要连续释放,无法做到有的放矢,且容易暴露自身。

压制式干扰根据产生机制和工作模式有不同分类。按产生机制分,可以分为射频噪声干扰、噪声调幅干扰、噪声调频干扰、噪声调相干扰。射频噪声干扰是把射频噪声通过放大器后直接发射出去,因此另称直接噪声干扰。噪声调幅干扰是指利用噪声调制射频信号的幅度,相对应地,调制射频噪声的频率的干扰称为噪声调频干扰,调制射频噪声的相位的干扰称为噪声调相干扰。

射频噪声干扰

雷达干扰仿真及其Python代码_第3张图片

图 射频噪声干扰(时域、频域)

通常情况下,进入导引头接收机的其他噪声拥有与接收机内部噪声 (服从高斯分布) 相同的统计特性,因此选择射频噪声为基础干扰信号。使用频率为导引头载波频率的带限放大器直接放大低功率准白噪声即可以获得射频噪声干扰,因此又称直接噪声干扰,其波形如上图所示。射频噪声干扰属于窄带高斯过程,可表示为:
在这里插入图片描述
上式中,Un(t) 为幅度包络,服从 Rayleigh 分布,ωj为载频,远大于干扰带宽,相位 ϕ(t) 服从 [0, 2π] 的均匀分布,且与包络函数 Un(t) 互相独立。
射频噪声干扰的优点是对导引头信号的遮蔽性好,缺点是平均功率不高,且由于技术和成本限制难以产生大干扰功率,因此无法作为主要的干扰形式。实际应用中,常使用噪声调幅、调频和调相等调制手段调制载波的方式来产生压制干扰。

代码

完整代码见文末

class JammingDirectNoise(BaseSignal):
    def get_signal(self):
        output = numpy.random.normal(size=self.t_range.shape)
        output_f = fft.fftshift(fft.fft(output))
        filter = get_pass_filter(self.t_range.shape[0], self.f_s, self.f_0 - self.band / 2, self.f_0 + self.band / 2)
        output_f = output_f * filter
        return fft.ifft(fft.ifftshift(output_f))

噪声调幅干扰

雷达干扰仿真及其Python代码_第4张图片

图 噪声调幅干扰(时域、频域)

利用噪声调制发射信号的幅度便可得到噪声调幅干扰。实现噪声调幅干扰首先要产生带限噪声,通常的做法是对高斯白噪声带通滤波,再用得到的带限噪声对信号进行幅度调制。噪声调幅干扰可表示为:
在这里插入图片描述
上式中,U0为载波信号幅度,ωj为载频,Un(t) ∈ [−U0, ∞),是均值为 0,方差为σ2n的广义平稳随机过程,相位 ϕ(t) 服从 [0, 2π] 的均匀分布,与 Un(t) 相互独立。噪声有效调制系数 mAe= σn/U0。噪声调幅干扰的功率谱可以分为载波功率谱和旁瓣功率谱两部分。旁瓣功率谱对称分布于载频两侧,因此噪声调幅信号的干扰功率谱宽度拓宽为调制前的两倍。

代码

完整代码见文末

class JammingNoiseAmplitude(BaseSignal):
    def para_init(self, f_0, band, t_duration, f_s, t_0=0, with_window=False, **kwargs):
        self.carrier_amolitude = kwargs['carrier_amolitude']
        super().para_init(f_0, band, t_duration, f_s, t_0=0, with_window=False)
        return self

    def get_signal(self):
        output = JammingDirectNoise().para_init(f_0=self.f_0, band=self.band, t_duration=self.t_duration,
                                                f_s=self.f_s)
        carrier = self.carrier_amolitude * numpy.exp(1j * 2 * numpy.pi * self.f_0 * self.t_range)
        return output.time_domain + carrier

噪声调频干扰

雷达干扰仿真及其Python代码_第5张图片

图 噪声调频干扰(时域、频域)

利用噪声调制发射信号的频率便可得到噪声调频干扰。噪声调频干扰是压制式干扰中最常见的干扰形式之一,它的特点是干扰带宽较宽和干扰功率较大。噪声调频干扰可表示为:
在这里插入图片描述
上式中,Uj噪声调频信号幅度,ωj为载频,u(t) ∈ [−U0, ∞),是均值为 0,方差为σ2n的广义平稳随机过程,相位 ϕ(t) 服从 [0, 2π] 的均匀分布,与 u(t) 互相独立,KFM为调频斜率。
噪声调频信号的功率谱密度函数 Gj(f) 与调制噪声 pn(u) 的概率密度函数同分布。此外,噪声调频信号的功率PJ与载波功率相等,这说明使用调制噪声功率不会影响已调波的功率。

代码

完整代码见文末

class JammingNoiseFrequency(BaseSignal):
    def para_init(self, f_0, band, t_duration, f_s, t_0=0, with_window=False, **kwargs):
        self.carrier_amolitude = kwargs['carrier_amolitude']
        super().para_init(f_0, band, t_duration, f_s, t_0=0, with_window=False)
        return self

    def get_signal(self):
        output = JammingDirectNoise().para_init(f_0=self.band / 2, band=self.band, t_duration=self.t_duration,
                                                f_s=self.f_s).time_domain
        output = self.band / 2.35 / numpy.std(output.real) * output.real
        # w's integration
        frequency_phase = numpy.zeros(output.shape)
        for i in range(frequency_phase.shape[0] - 1):
            frequency_phase[i + 1] = frequency_phase[i] + (output[i] + output[i + 1]) / 2 * (self.t_range[1] - self.t_0)
        frequency_phase = 2 * numpy.pi * frequency_phase

        phase = 2 * numpy.pi * self.f_0 * self.t_range + frequency_phase
        return self.carrier_amolitude * numpy.exp(1j * phase)

噪声调相干扰

雷达干扰仿真及其Python代码_第6张图片

图 噪声调相干扰(时域、频域)

噪声调相干扰可表示为:
在这里插入图片描述
上式中,Uj为调相信号幅度,ωj为载频,u(t) ∈ [−U0, ∞),是均值为 0,方差为 σ2n的广义平稳随机过程,相位 ϕ(t) 服从 [0, 2π] 的均匀分布,与 u(t) 互相独立,KPM为调相斜率。
噪声调相信号的功率谱由中频处的冲击信号和中频附近的旁瓣组成。当有效相移 D ≪ 1 时,冲击信号占所有能量的大多数,旁瓣分布较为平均;而当 D ≤ 1时,冲激信号能量随 D 的增加而下降,旁瓣能量增大,带宽保持不变。

代码

完整代码见文末

class JammingNoisePhase(BaseSignal):
    def para_init(self, f_0, band, t_duration, f_s, t_0=0, with_window=False, **kwargs):
        self.carrier_amolitude = kwargs['carrier_amolitude']
        super().para_init(f_0, band, t_duration, f_s, t_0=0, with_window=False)
        return self

    def get_signal(self):
        output = JammingDirectNoise().para_init(f_0=self.band / 2, band=self.band, t_duration=self.t_duration,
                                                f_s=self.f_s).time_domain
        phase = 2 * numpy.pi * self.f_0 * self.t_range + 1*output.real/numpy.std(output.real)
        return self.carrier_amolitude * numpy.exp(1j * phase)

欺骗干扰

有源欺骗干扰在作用机理上与有源压制干扰大相径庭,其原理是克隆采集到的真实目标回波生成假目标,再以一定的调制方式发送回导引头接收机,假目标有着和真目标类似的参数和性质,因此能使敌方导引头难辨真假,从而达到扰乱导引头视线和破坏导引头正常工作状态的战略目的。此外,由于欺骗式干扰信号与目标回波信号类似,因此也同样可以受到脉冲压缩处理的增益,故并不需要在大功率下发送干扰,变相提高了干扰释放效率。
按照工作方式分类,欺骗干扰可以分为转发式干扰和回应式干扰。转发式干扰仅仅是 DRFM 设备对导引头信号的放大、调制和转发,干扰信号与原始导引头信号的差别不大。转发式干扰减少了将干扰信号变频、采样量化和拷贝等环节带来的误差,属于较为稳定可靠的工作模式。当 DRFM 设备工作在回应模式下时生成回应式干扰,这种干扰与转发式干扰的区别是在复制真实信号的基础之上还加入了对距离、速度和角度等关键参数的调制,而且这种复制在次数上不存在限制,可通过多次复制产生多个假目标。本章针对线性调频导引头,介绍延时转发干扰,由延时转发干扰代码经过适当修改可以很容易的得到间歇采样转发干扰和 C&I 干扰。

延时转发干扰

雷达干扰仿真及其Python代码_第7张图片

图 延时转发干扰(时域、经过匹配滤波后)

延时转发干扰用来产生距离假目标欺骗干扰,通过控制 DRFM 设备发射存储的导引头发射信号的延迟时间 △t 来输出距离各异的欺骗假目标,还可通过重复发射实现密集假目标干扰。延时转发干扰可以表示为:
在这里插入图片描述
延时干扰经过脉压后的结果等同于 LFM 信号,具有相同的频谱构成,可以受到脉压的处理增益。同时,假目标在时间轴上有 △t 的滞后或超前,因此可以通过累加多个延时干扰来产生密集假目标干扰。
此外,也可以通过移频干扰来产生距离假目标。主要原理是多普勒频移可以使压缩信号的主峰出现偏移。但移频干扰的干扰效率不如延时干扰高,在移频量超过 LFM 信号带宽的二分之一时干扰效果不佳,具有一定的局限性。

代码

完整代码见文末

class JammingDelayTransfer:
    def para_init(self, origin_signal, num_delay):
        self.origin_signal = origin_signal

        num_divide = len(num_delay)
        num_delay_numpy = numpy.array(fill_list(num_delay, -num_divide))
        loc_signal = num_delay_numpy + numpy.arange(num_divide)[:,None]
        max_delay = loc_signal.max()

        t_range_list, time_domain_list = self.divide_signal(num_divide)

        self.t_range = numpy.array([0])
        self.time_domain = numpy.array([])
        for i in range(int(max_delay) + 1):
            if numpy.sum(i == loc_signal):
                for j in range(num_divide):
                    if numpy.sum(i == loc_signal, axis=1)[j]:
                        self.t_range = numpy.append(self.t_range[:-1],
                                                    t_range_list[j] - t_range_list[j][0] + self.t_range[-1])
                        self.time_domain = numpy.append(self.time_domain[:-1], time_domain_list[j])
            else:
                self.t_range = numpy.append(self.t_range[:-1], t_range_list[0] + self.t_range[-1])
                self.time_domain = numpy.append(self.time_domain[:-1], numpy.zeros((time_domain_list[0].shape[0])))
        return self

    def divide_signal(self, num_divide):
        num_interval = self.origin_signal.t_range.shape[0] - 1
        a, b = divmod(num_interval, num_divide)
        interval_list = 4 * [a]
        interval_list[0:b] = [i + 1 for i in interval_list[0:b]]
        t_range_list = []
        time_domain_list = []
        for i in range(num_divide):
            start = sum(interval_list[:i])
            end = sum(interval_list[:i + 1])
            t_range_list.append(self.origin_signal.t_range[start:end])
            time_domain_list.append(self.origin_signal.time_domain[start:end])
        return t_range_list, time_domain_list

灵巧噪声干扰

由于单一压制式干扰或欺骗式干扰各自存在局限性,因此现代干扰技术考虑将假目标脉冲和噪声组合形成一种复合式干扰,一方面利用欺骗干扰的特性使干扰信号绕开敌方导引头对普通噪声干扰的处理增益,又比单一欺骗干扰具有更好的干扰效能。这种干扰技术称之为灵巧噪声干扰 (Smart Noise Jamming),是一种兼备压制式干扰和欺骗式干扰优点的新型干扰。灵巧噪声干扰可由 DRFM 设备将截获并存储的导引头信号用视频噪声在时域上进行卷积调制,产生在时域上覆盖目标回波和在频域上与目标回波重叠的干扰信号,其本质是使干扰中的所有分量均获得导引头接收机匹配滤波的处理增益,从而最大化每一个分量的功率利用率,提高整体干扰效率。本小节介绍灵巧干扰的两种常见调制方法,即噪声卷积调制和噪声乘积调制。

噪声卷积调制

雷达干扰仿真及其Python代码_第8张图片

图 噪声卷积调制(时域、频域、经过匹配滤波后)

卷积调制灵巧噪声干扰的产生方法是:先利用带通滤波器 Fband(t) 处理高斯白噪声 n(t) 产生一个窄带噪声,对其作希尔伯特变换后形成一个复数信号,再将其与 DRFM 设备存储的导引头发射波形 s(t) 作卷积即可,可以表示为:
在这里插入图片描述

代码

完整代码见文末

class JammingNoiseConv:
    def para_init(self, origin_signal, f_trans=0e6):
        self.origin_signal = copy.copy(origin_signal)
        self.origin_signal.time_domain = self.origin_signal.time_domain * numpy.exp(
            1j * 2 * numpy.pi * f_trans * self.origin_signal.t_range)

        f_s = self.origin_signal.f_s
        band = self.origin_signal.band
        t_duration = self.origin_signal.t_duration

        self.jamming = JammingDirectNoise().para_init(f_0=band / 2, band=band, t_duration=t_duration,
                                                 f_s=f_s)
        output = signal_conv(self.jamming, self.origin_signal)
        self.t_range = output.t_range
        self.f_range = numpy.linspace(-f_s / 2, f_s / 2 - f_s / self.t_range.shape[0], self.t_range.shape[0])
        self.time_domain = output.time_domain
        return self

噪声乘积调制

雷达干扰仿真及其Python代码_第9张图片

图 噪声卷积调制(时域、经过匹配滤波后)

噪声乘积干扰在脉压后可以在真实目标周围产生大量完全随机的干扰信号脉冲。产生方法是:先利用白噪声 n(t) 产生相位随机变换的余弦信号,然后用带通滤波器 Fband(t) 滤波产生一个窄带噪声,再将其与 DRFM 设备存储的导引头发射波形 s(t) 作乘积即可,可以表示为:
在这里插入图片描述

代码

完整代码见文末

class JammingNoiseMulti:
    def para_init(self, origin_signal, amolitude=1):
        self.origin_signal = origin_signal

        noise = CosNoise().para_init(f_0=self.origin_signal.band/2, band=self.origin_signal.band,
                                     t_duration=self.origin_signal.t_duration, f_s=self.origin_signal.f_s,
                                     t_0=self.origin_signal.t_0, amolitude=amolitude)

        self.t_range = origin_signal.t_range
        self.f_range = origin_signal.f_range
        self.time_domain = noise.time_domain.real * self.origin_signal.time_domain.real
        return self

完整代码分为多个文件,数量较多,无法放在文章中。完整代码在公众号(沸腾的火锅资源号)中自取。

你可能感兴趣的:(python,开发语言)