电子战(Electronic Warfare,EW)作为现代战争中不可或缺的一部分,通过对敌方电子设备、信息系统进行干扰、欺骗、摧毁等手段,削弱敌方的指挥控制、通信、侦察等作战能力,为己方的战略决策提供支持。这一领域已成为各国军事力量竞争中的重要一环,并且随着信息技术、通信技术、雷达技术等快速发展,电子战的形式与手段愈加复杂多变。
电子战的主要目标是利用电磁频谱,通过对敌方的通信、雷达、导航、卫星等设备的干扰与压制,达到控制信息流、压制敌方作战能力的目的。这种技术的应用不仅限于战斗机、导弹、防空系统等领域,还广泛应用于电子侦察、情报搜集、电子对抗等多个军事作战层面。
在电子战的作战模式中,信号干扰技术作为核心技术之一,已成为现代战争中制约敌我双方作战能力的关键因素。信号干扰技术包括噪声干扰、伪信号干扰、射频干扰等多种形式,具体干扰方式如下:
-
噪声干扰:通过生成白噪声或宽频带噪声信号,掩盖目标信号的存在,使得敌方接收到的信号难以识别或解码。这种干扰方式具有广泛的适用性,可用于对敌方通信、雷达信号的干扰。
-
伪信号干扰:通过生成伪随机信号、频率跳变信号等,欺骗敌方系统,使其无法有效区分真实信号和伪信号,造成敌方通信、导航和定位系统的故障或错误。
-
射频干扰:通过强烈的射频信号压制敌方的通信和雷达系统。射频干扰是电子战中常见的干扰方式之一,其目的是通过占用或抑制敌方的频谱资源,使敌方无法正常操作其电子设备,进而失去战场上的信息优势。
而抗干扰技术则是为确保己方系统能够有效运行,避免或减轻干扰的负面影响。抗干扰技术的研究涉及多个领域,包括雷达信号处理、通信信号恢复、导航信号抗干扰等。通过优化信号处理算法、设计自适应滤波器、实现时频分析等手段,可以显著提升系统的抗干扰能力,确保信息系统在复杂电磁环境下的稳定性与可靠性。
近年来,中国航空工业在电子战装备的研发上取得了显著进展,尤其在信号干扰与抗干扰技术的应用方面,走在了世界前列。在珠海航展等国际性军事展览会上,中国展示的J15D电子战战机、J16D电子战战机等装备,成为各界关注的焦点。这些装备不仅具备先进的武器系统,还配备了强大的电子战能力,能够有效实施信息屏蔽、敌方定位干扰和电磁频谱控制等操作,极大地提升了中国海空军的作战效能。
随着国家安全环境的日益复杂,特别是近海防卫、边境监控、导弹防御等领域的战略需求,电子战已成为我国现代化作战体系中不可或缺的组成部分。在信息化战争日益重要的今天,电子战的作用愈发突出,特别是在网络战、信息战等新型战斗模式下,电子战装备的优势将直接决定战场态势的走向。中国航空工业在这一领域的突破,将为未来军事斗争提供更加有力的技术保障。
此外,随着电子战装备的不断升级,未来的电子战将更加依赖智能化、自动化和网络化技术。如何通过先进的信号处理技术提升抗干扰能力,确保关键通信和指挥系统的安全,已成为当前电子战技术研发的重要方向之一。为此,数字信号处理技术在电子战中的应用,特别是信号干扰与抗干扰技术,将对保障信息战中我国作战优势起到至关重要的作用。
本实验中,目标信号是实验中希望从复杂干扰环境中提取的核心信号,其特点是简单、确定性强、易于识别。本实验选择一个 50Hz 的正弦波 作为目标信号,其频率范围在噪声和干扰信号之下,便于设计滤波器进行提取。
用于模拟真实电子战环境中目标信号被多种干扰污染的情况。本部分以三种典型干扰作为本实验干扰源,分别为:高斯白噪声干扰、频率跳变干扰和伪随机噪声干扰
下面为实现代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, lfilter, firwin, freqz, stft, remez, kaiser_atten, kaiser_beta
from scipy.fft import fft, ifft
# 1. 参数定义
fs = 1000 # 采样频率(Hz)
T = 1 # 信号持续时间(秒)
t = np.linspace(0, T, fs, endpoint=False) # 时间向量,1秒钟内的所有采样点
# 目标信号:50Hz正弦波
f_target = 50 # 目标信号的频率
target_signal = np.sin(2 * np.pi * f_target * t) # 生成目标信号:50Hz正弦波
# 2. 干扰信号生成
# 白噪声干扰(Gaussian Noise)
white_noise = np.random.normal(0, 0.5, len(t)) # 均值为0,标准差为0.5的白噪声
noisy_signal_white_noise = target_signal + white_noise # 白噪声干扰到目标信号中
# 频率跳变干扰(Frequency-Hopping Interference)
f_interference = np.sin(2 * np.pi * 0.1 * t) * 50 + 150 # 模拟频率从100Hz到200Hz跳变
interference_signal = np.sin(2 * np.pi * f_interference * t) # 频率跳变的干扰信号
noisy_signal_freq_jump = target_signal + interference_signal # 将干扰信号加入目标信号中
# 伪随机噪声干扰(Pseudo-random Noise)
pseudo_random_noise = np.random.uniform(-1, 1, len(t)) # 均匀分布的伪随机噪声
noisy_signal_random = target_signal + pseudo_random_noise # 伪随机噪声加入目标信号
# 3. FIR低通滤波器设计
def fir_lowpass(cutoff, fs, numtaps=201):
nyquist = 0.5 * fs # 奈奎斯特频率
normal_cutoff = cutoff / nyquist # 归一化截止频率
beta = kaiser_beta(80)
fir_coeff = firwin(numtaps, normal_cutoff, window=('kaiser', beta)) # FIR滤波器的系数
return fir_coeff
'''def fir_lowpass(cutoff, fs, numtaps=201):
nyquist = 0.5 * fs # 奈奎斯特频率
bands = [0, cutoff / nyquist, (cutoff + 20) / nyquist, 0.5] # 通带/阻带分割
desired = [1, 0] # 通带增益 1,阻带增益 0
weight = [1, 10] # 权重:增大阻带权重
fir_coeff = remez(numtaps, bands, desired, weight=weight) # 设计 FIR 滤波器
return fir_coeff'''
def fir_filter(data, fir_coeff):
return lfilter(fir_coeff, 1.0, data) # 应用FIR滤波器
# 设置低通滤波器的截止频率
cutoff_freq = 100 # 截止频率设置为100Hz(去除高频噪声)
fir_coeff = fir_lowpass(cutoff_freq, fs) # 设计FIR滤波器
# 对各种噪声信号进行滤波
filtered_signal_white_noise = fir_filter(noisy_signal_white_noise, fir_coeff)
filtered_signal_freq_jump = fir_filter(noisy_signal_freq_jump, fir_coeff)
filtered_signal_random = fir_filter(noisy_signal_random, fir_coeff)
# 4. 频域去噪(傅里叶变换处理)
def remove_high_freq_noise(signal, fs, cutoff_freq):
N = len(signal) # 信号长度
freq = np.fft.fftfreq(N, d=1/fs) # 计算频率
fft_signal = fft(signal) # 对信号进行傅里叶变换
fft_signal[np.abs(freq) > cutoff_freq] = 0 # 去除高于截止频率的成分
return np.real(ifft(fft_signal)) # 反傅里叶变换恢复信号
# 使用频域处理对信号进行去噪
filtered_signal_white_noise_freq = remove_high_freq_noise(noisy_signal_white_noise, fs, cutoff_freq)
filtered_signal_freq_jump_freq = remove_high_freq_noise(noisy_signal_freq_jump, fs, cutoff_freq)
filtered_signal_random_freq = remove_high_freq_noise(noisy_signal_random, fs, cutoff_freq)
# 5. 同时叠加三种噪声并进行处理
# 三种噪声同时叠加
noisy_signal_all = target_signal + white_noise + interference_signal + pseudo_random_noise
# 对叠加后的信号进行滤波
filtered_signal_all = fir_filter(noisy_signal_all, fir_coeff)
filtered_signal_all_freq = remove_high_freq_noise(noisy_signal_all, fs, cutoff_freq)
#STFT分析
# 未滤波信号
f1, t1, Zxx1 = stft(noisy_signal_all, fs, nperseg=256)
# 滤波后的信号
f2, t2, Zxx2 = stft(filtered_signal_all, fs, nperseg=256)
# 6. 绘制结果
# 时域图:目标信号与干扰信号的比较
plt.figure(figsize=(14, 8))
# 目标信号
plt.subplot(2, 2, 1)
plt.plot(t, target_signal, color='blue', label='Target Signal (50 Hz)', linewidth=2)
plt.title("Target Signal (50 Hz)", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right')
# 白噪声干扰
plt.subplot(2, 2, 2)
plt.plot(t, noisy_signal_white_noise, color='red', label='Noisy Signal with White Noise', linewidth=2)
plt.title("Noisy Signal with White Noise", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right')
# 频率跳变干扰
plt.subplot(2, 2, 3)
plt.plot(t, noisy_signal_freq_jump, color='orange', label='Noisy Signal with Frequency Jump', linewidth=2)
plt.title("Noisy Signal with Frequency Jump", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right')
# 伪随机噪声干扰
plt.subplot(2, 2, 4)
plt.plot(t, noisy_signal_random, color='green', label='Noisy Signal with Pseudo-random Noise', linewidth=2)
plt.title("Noisy Signal with Pseudo-random Noise", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
# 滤波效果对比:干扰前后的信号
plt.figure(figsize=(14, 8))
# 白噪声干扰滤波效果
plt.subplot(2, 2, 1)
plt.plot(t, noisy_signal_white_noise, color='red', label='Noisy Signal (White Noise)', linewidth=2)
plt.plot(t, filtered_signal_white_noise, color='blue', linestyle='--', label='Filtered Signal', linewidth=2)
plt.title("Filtered Signal (White Noise) - Time Domain", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right') # 图例统一放在右上角
# 频率跳变干扰滤波效果
plt.subplot(2, 2, 2)
plt.plot(t, noisy_signal_freq_jump, color='orange', label='Noisy Signal (Freq Jump)', linewidth=2)
plt.plot(t, filtered_signal_freq_jump, color='blue', linestyle='--', label='Filtered Signal', linewidth=2)
plt.title("Filtered Signal (Freq Jump) - Time Domain", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right') # 图例统一放在右上角
# 伪随机噪声干扰滤波效果
plt.subplot(2, 2, 3)
plt.plot(t, noisy_signal_random, color='green', label='Noisy Signal (Random)', linewidth=2)
plt.plot(t, filtered_signal_random, color='blue', linestyle='--', label='Filtered Signal', linewidth=2)
plt.title("Filtered Signal (Pseudo-random Noise) - Time Domain", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right') # 图例统一放在右上角
# 三种噪声同时叠加信号滤波效果
plt.subplot(2, 2, 4)
plt.plot(t, noisy_signal_all, color='purple', label='Noisy Signal (All Interference)', linewidth=2)
plt.plot(t, filtered_signal_all, color='blue', linestyle='--', label='Filtered Signal (All Interference)', linewidth=2)
plt.title("Filtered Signal (All Interference) - Time Domain", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right') # 图例统一放在右上角
plt.tight_layout()
plt.show()
# 三种噪声叠加信号和滤波后的信号
noisy_signal_all = noisy_signal_white_noise + (noisy_signal_freq_jump - target_signal) + (noisy_signal_random - target_signal)
filtered_signal_all = lfilter(fir_coeff, 1.0, noisy_signal_all)
# 找到未滤波和滤波后信号的最大 y 值,用于统一 y 轴范围
y_min = min(np.min(noisy_signal_all), np.min(filtered_signal_all)) * 1.1 # 增加10%的范围
y_max = max(np.max(noisy_signal_all), np.max(filtered_signal_all)) * 1.1 # 增加10%的范围
# 创建一个图表窗口并统一布局
plt.figure(figsize=(14, 8))
# 未滤波的三种噪声叠加信号时域图
plt.subplot(2, 1, 1)
plt.plot(t, noisy_signal_all, color='purple', label='Noisy Signal (All Interference)', linewidth=2)
plt.title("Noisy Signal (All Interference) - Time Domain", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.ylim(y_min, y_max) # 设置 y 轴范围保持一致
plt.grid(True)
plt.legend()
# 滤波后的三种噪声叠加信号时域图
plt.subplot(2, 1, 2)
plt.plot(t, filtered_signal_all, color='blue', label='Filtered Signal (All Interference)', linewidth=2)
plt.title("Filtered Signal (All Interference) - Time Domain", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.ylim(y_min, y_max) # 设置 y 轴范围保持一致
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
# 频域图:信号的频谱分析
plt.figure(figsize=(14, 12))
# 目标信号频域图
plt.subplot(4, 1, 1)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(target_signal)), color='blue', label='Target Signal', linewidth=2)
plt.title("Target Signal - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
# 白噪声干扰信号的频域图
plt.subplot(4, 1, 2)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(noisy_signal_white_noise)), color='red', label='Noisy Signal (White Noise)', linewidth=2)
plt.title("Noisy Signal with White Noise - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
# 频率跳变干扰的频域图
plt.subplot(4, 1, 3)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(noisy_signal_freq_jump)), color='orange', label='Noisy Signal (Freq Jump)', linewidth=2)
plt.title("Noisy Signal with Freq Jump - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
# 伪随机噪声的频域图
plt.subplot(4, 1, 4)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(noisy_signal_random)), color='green', label='Noisy Signal (Random)', linewidth=2)
plt.title("Noisy Signal with Pseudo-random Noise - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
plt.figure(figsize=(14, 8)) # 统一调整窗口大小
# 滤波后的白噪声信号频域图
plt.subplot(3, 1, 1)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(filtered_signal_white_noise_freq)), color='purple', label='Filtered Signal (White Noise)', linewidth=2)
plt.title("Filtered Signal (White Noise) - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
# 滤波后的频率跳变干扰信号频域图
plt.subplot(3, 1, 2)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(filtered_signal_freq_jump_freq)), color='orange', label='Filtered Signal (Freq Jump)', linewidth=2)
plt.title("Filtered Signal (Freq Jump) - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
# 滤波后的伪随机噪声信号频域图
plt.subplot(3, 1, 3)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(filtered_signal_random_freq)), color='green', label='Filtered Signal (Random)', linewidth=2)
plt.title("Filtered Signal (Pseudo-random Noise) - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
noisy_signal_all = noisy_signal_white_noise + (noisy_signal_freq_jump - target_signal) + (noisy_signal_random - target_signal)
# 对叠加后的噪音信号进行滤波
filtered_signal_all = lfilter(fir_coeff, 1.0, noisy_signal_all)
# 创建一个图表窗口并统一布局
plt.figure(figsize=(14, 8))
# 未滤波的三个噪音叠加频谱图
plt.subplot(2, 1, 1)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(noisy_signal_all)), color='purple', label='Unfiltered Signal (All Noises)', linewidth=2)
plt.title("Unfiltered Signal (All Noises) - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
# 滤波后的三个噪音叠加频谱图
plt.subplot(2, 1, 2)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(filtered_signal_all)), color='blue', label='Filtered Signal (All Noises)', linewidth=2)
plt.title("Filtered Signal (All Noises) - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
# 调整子图间距
plt.tight_layout()
plt.show()
# 7. 绘制所设计FIR滤波器的频率响应
plt.figure(figsize=(10, 4))
# 计算滤波器的频率响应
w, h = freqz(fir_coeff, worN=8000)
plt.plot(w * fs / (2 * np.pi), np.abs(h), 'b', label='FIR Filter Frequency Response')
plt.title("Frequency Response of FIR Lowpass Filter", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
# 时频分析
plt.figure(figsize=(10, 8))
# 未滤波信号的时频图
plt.subplot(2, 1, 1)
plt.pcolormesh(t1, f1, np.abs(Zxx1), shading='gouraud', cmap='viridis')
plt.title("STFT of Unfiltered Signal (All Interference)", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Frequency (Hz)", fontsize=12)
plt.colorbar(label='Amplitude')
plt.grid(True)
# 滤波后信号的时频图
plt.subplot(2, 1, 2)
plt.pcolormesh(t2, f2, np.abs(Zxx2), shading='gouraud', cmap='viridis')
plt.title("STFT of Filtered Signal (All Interference)", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Frequency (Hz)", fontsize=12)
plt.colorbar(label='Amplitude')
plt.grid(True)
plt.tight_layout()
plt.show()
def snr(signal, noise):
signal_power = np.mean(signal ** 2)
noise_power = np.mean(noise ** 2)
return 10 * np.log10(signal_power / noise_power)
snr_before = snr(target_signal, noisy_signal_all - target_signal)
snr_after = snr(target_signal, filtered_signal_all - target_signal)
print(f"SNR Before Filtering: {snr_before:.2f} dB")
print(f"SNR After Filtering: {snr_after:.2f} dB")
plt.figure(figsize=(10, 8))
plt.subplot(2, 1, 1)
plt.plot(t, noisy_signal_all, color='purple', label='Noisy Signal (All Interference)', linewidth=2)
plt.title("Noisy Signal (All Interference) - Time Domain", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.ylim(y_min, y_max) # 设置 y 轴范围保持一致
plt.grid(True)
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(np.fft.fftfreq(len(t), 1/fs), np.abs(fft(noisy_signal_all)), color='purple', label='Unfiltered Signal (All Noises)', linewidth=2)
plt.title("Unfiltered Signal (All Noises) - Frequency Domain", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
通过分析前述实验结果不难看出,在两脉冲信号之间的噪声无法被有效滤除。这是由于白噪声的频谱在全频域内均匀分布,即使低通滤波器能去除高频部分,但保留的低频分量仍对目标信号产生干扰。频率跳变干扰可能部分落入低频区域,导致其未被完全滤除。伪随机噪声在频域上较为复杂,可能存在低频成分,且滤波器无法完全抑制。同时也存在部分干扰与目标信号频谱相互重叠,经典滤波器并不能有效地滤除干扰,FIR滤波器是线性相位滤波器,但其设计无法动态适应复杂噪声环境。并且当前滤波器设计基于固定参数,未考虑噪声特性随时间变化的问题。
基于此问题,可以采用自适应滤波器,自适应滤波器是一种根据输入信号动态调整滤波参数的滤波器,非常适合处理复杂、非平稳的噪声环境。常见的自适应滤波器包括LMS自适应滤波器、RLS自适应滤波器、卡尔曼滤波器等。
由于篇幅问题,在此仅对采用LMS自适应滤波器的改进方案进行实现,并于基于FIR滤波器的实现方案进行对比分析。
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import stft
from scipy.fft import fft, ifft
# 1. 参数定义
fs = 1000 # 采样频率(Hz)
T = 1 # 信号持续时间(秒)
t = np.linspace(0, T, fs, endpoint=False) # 时间向量,1秒钟内的所有采样点
# 目标信号:50Hz正弦波
f_target = 50 # 目标信号的频率
target_signal = np.sin(2 * np.pi * f_target * t) # 生成目标信号:50Hz正弦波
# 2. 干扰信号生成
# 白噪声干扰
white_noise = np.random.normal(0, 0.5, len(t)) # 均值为0,标准差为0.5的白噪声
noisy_signal_white_noise = target_signal + white_noise
# 频率跳变干扰
f_interference = np.sin(2 * np.pi * 0.1 * t) * 50 + 150 # 模拟频率从100Hz到200Hz跳变
interference_signal = np.sin(2 * np.pi * f_interference * t)
noisy_signal_freq_jump = target_signal + interference_signal
# 伪随机噪声干扰
pseudo_random_noise = np.random.uniform(-1, 1, len(t)) # 均匀分布的伪随机噪声
noisy_signal_random = target_signal + pseudo_random_noise
# 三种噪声叠加
noisy_signal_all = target_signal + white_noise + interference_signal + pseudo_random_noise
# 3. LMS 滤波器设计
def lms_filter(noisy_signal, desired_signal, mu=0.01, n_taps=32):
n_samples = len(noisy_signal)
w = np.zeros(n_taps) # 滤波器权重初始化
output = np.zeros(n_samples) # 滤波器输出初始化
for n in range(n_taps, n_samples):
x = noisy_signal[n:n - n_taps:-1] # 滑动窗口提取信号
y = np.dot(w, x) # 当前滤波器输出
e = desired_signal[n] - y # 误差信号
w += 2 * mu * e * x # 权重更新公式
output[n] = y # 保存滤波器输出
return output, w
# 使用 LMS 滤波器处理信号
filtered_signal_lms, lms_weights = lms_filter(noisy_signal_all, target_signal, mu=0.01, n_taps=32)
# 4. 绘制结果
# 时域图:原始信号、噪声信号和滤波信号
plt.figure(figsize=(14, 8))
# 原始目标信号
plt.subplot(3, 1, 1)
plt.plot(t, target_signal, color='blue', label='Target Signal', linewidth=2)
plt.title("Target Signal", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right') # 图例统一放在右上角
# 含噪信号
plt.subplot(3, 1, 2)
plt.plot(t, noisy_signal_all, color='purple', label='Noisy Signal (All Interference)', linewidth=2)
plt.title("Noisy Signal (All Interference)", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right') # 图例统一放在右上角
# 滤波后信号
plt.subplot(3, 1, 3)
plt.plot(t, filtered_signal_lms, color='orange', label='Filtered Signal (LMS)', linewidth=2)
plt.title("Filtered Signal (LMS)", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right') # 图例统一放在右上角
plt.tight_layout()
plt.show()
# 5. 时频分析
f1, t1, Zxx1 = stft(noisy_signal_all, fs, nperseg=256) # 未滤波信号
f2, t2, Zxx2 = stft(filtered_signal_lms, fs, nperseg=256) # 滤波后信号
plt.figure(figsize=(14, 8))
# 未滤波信号的 STFT
plt.subplot(2, 1, 1)
plt.pcolormesh(t1, f1, np.abs(Zxx1), shading='gouraud', cmap='viridis')
plt.title("STFT of Noisy Signal (All Interference)", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Frequency (Hz)", fontsize=12)
plt.colorbar(label='Amplitude')
plt.grid(True)
# 滤波后信号的 STFT
plt.subplot(2, 1, 2)
plt.pcolormesh(t2, f2, np.abs(Zxx2), shading='gouraud', cmap='viridis')
plt.title("STFT of Filtered Signal (LMS)", fontsize=14)
plt.xlabel("Time (s)", fontsize=12)
plt.ylabel("Frequency (Hz)", fontsize=12)
plt.colorbar(label='Amplitude')
plt.grid(True)
plt.tight_layout()
plt.show()
# 6. 信噪比计算
def snr(signal, noise):
signal_power = np.mean(signal ** 2)
noise_power = np.mean(noise ** 2)
return 10 * np.log10(signal_power / noise_power)
snr_before = snr(target_signal, noisy_signal_all - target_signal)
snr_after = snr(target_signal, filtered_signal_lms - target_signal)
print(f"SNR Before Filtering: {snr_before:.2f} dB")
print(f"SNR After Filtering: {snr_after:.2f} dB")
# 7. 频谱分析(正负半轴均显示)
# 计算目标信号、噪声叠加信号和滤波信号的频谱
freq = np.fft.fftfreq(len(t), d=1/fs) # 频率向量
target_spectrum = np.abs(fft(target_signal)) # 目标信号频谱
noisy_spectrum = np.abs(fft(noisy_signal_all)) # 含噪信号频谱
filtered_spectrum = np.abs(fft(filtered_signal_lms)) # 滤波后信号频谱
# 绘制频谱图(正负半轴)
plt.figure(figsize=(14, 10))
# 目标信号频谱
plt.subplot(3, 1, 1)
plt.plot(freq, target_spectrum, color='blue', label='Target Signal Spectrum', linewidth=2)
plt.title("Target Signal Spectrum (Full Axis)", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right')
# 含噪信号频谱
plt.subplot(3, 1, 2)
plt.plot(freq, noisy_spectrum, color='purple', label='Noisy Signal Spectrum (All Interference)', linewidth=2)
plt.title("Noisy Signal Spectrum (Full Axis)", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right')
# 滤波后信号频谱
plt.subplot(3, 1, 3)
plt.plot(freq, filtered_spectrum, color='orange', label='Filtered Signal Spectrum (LMS)', linewidth=2)
plt.title("Filtered Signal Spectrum (Full Axis)", fontsize=14)
plt.xlabel("Frequency (Hz)", fontsize=12)
plt.ylabel("Amplitude", fontsize=12)
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
通过波形输出结果与FIR滤波器结果对比,总结出下表:
FIR滤波器 | LMS滤波器 | |
---|---|---|
时域 | FIR滤波器在白噪声和伪随机噪声环境下表现良好,能很好地恢复目标信号波形。但在频率跳变干扰下,由于FIR滤波器无法动态适应干扰的频率变化,滤波效果有限,残留干扰较多。 | LMS滤波器在三种干扰下均表现出较好的时域恢复能力,尤其在频率跳变干扰中,由于LMS滤波器能够实时更新权重,适应频率变化,因此滤波效果明显优于FIR滤波器。 |
频域 | FIR滤波器在固定频段上表现出色,能很好地去除高于100Hz的频率噪声,由于所设计的FIR滤波器为低通滤波器,故对于频段内的频率跳变干扰无力解决。 | LMS滤波器在频域上的优势在于对目标频率的准确保留,以及对频率跳变干扰的有效抑制。这是由于LMS滤波器通过误差最小化机制动态调整权重,具有更强的灵活性。 |
时频 | FIR滤波器对于频率范围内的固定干扰具有较强的抑制能力,但对于动态变化的频率跳变干扰显得无能为力。 | LMS滤波器的自适应特性使其在时频分析中能有效跟踪频率变化,成功抑制了频率跳变干扰的动态成分,同时保留了目标信号的频率特征。 |
信噪比 | FIR滤波器在本实验中的SNR提升为8.72dB | LMS滤波器在本实验中的SNR提升为14.65dB |
复杂度 | FIR滤波器设计简单、运算高效,适用于实时性要求高但干扰特性固定的场景。 | LMS滤波器的运算复杂度较高,尤其在滤波权重更新过程中,但在动态噪声环境中具有明显优势。 |
总结得出,FIR滤波器设计简单、运算高效,适用于实时性要求高但干扰特性固定的场景。LMS滤波器的运算复杂度较高,尤其在滤波权重更新过程中,但在动态噪声环境中具有明显优势。总体而言,采用现代滤波器的设计方案滤波效果远优于FIR滤波器,在此基础上使用自适应步长算法(如NLMS)可进一步提高收敛速度和滤波效果。