高分辨率自适应频率切片小波变换时频分析与信号重构算法(Python)

360影视 动漫周边 2025-09-11 16:08 3

摘要:该算法实现了一种先进的时频分析方法——频率切片小波变换FSWT,专门设计用于非平稳信号的分析与处理。算法首先对输入信号进行预处理,消除直流分量,然后设置特定的观测频率范围。核心部分通过频率切片小波变换,在时频平面上对信号进行高分辨率分析,使用自定义的频率切片函

该算法实现了一种先进的时频分析方法——频率切片小波变换FSWT,专门设计用于非平稳信号的分析与处理。算法首先对输入信号进行预处理,消除直流分量,然后设置特定的观测频率范围。核心部分通过频率切片小波变换,在时频平面上对信号进行高分辨率分析,使用自定义的频率切片函数(有理函数或指数函数形式)来提取信号的时频特征。变换过程中,算法通过时频分辨率因子灵活调整时频分辨率,实现对信号局部特征的精确捕捉。完成变换后,算法能够从特定的频率切片中重构原始信号,验证变换的可逆性和准确性。最后,算法提供多种可视化方式展示分析结果,包括原始信号与重构信号的对比、频率切片包络谱、二维时频谱和三维时频谱,全面展现信号的时频特性。这种方法特别适用于旋转机械故障诊断、生物医学信号处理和非平稳信号分析等领域。

开始│├─ 信号预处理│ ├─ 加载或生成信号│ ├─ 消除直流分量│ └─ 设置观测频率范围│├─ 频率切片小波变换(FSWT)│ ├─ 对信号进行FFT│ ├─ 遍历观测频率范围│ │ ├─ 计算频率切片参数│ │ ├─ 应用频率切片函数│ │ └─ 存储变换结果│ └─ 调整相位并返回结果│├─ 逆频率切片小波变换│ ├─ 遍历频率切片│ │ ├─ 对时间维度求和│ │ └─ 重构频谱│ ├─ 执行逆FFT│ └─ 返回重构信号│├─ 结果后处理│ ├─ 计算变换幅度│ ├─ 归一化处理│ └─ 准备可视化数据│└─ 结果可视化├─ 绘制原始与重构信号对比├─ 绘制频率切片包络谱├─ 绘制二维时频谱└─ 绘制三维时频谱│结束

算法详细步骤

1. 信号准备阶段:首先生成或加载待分析的信号数据,对信号进行预处理,消除直流分量,确保信号零均值,为后续的频率分析奠定基础。

2. 参数设置阶段:根据分析需求设定观测频率范围,将连续频率离散化,确定时频分辨率因子和时域采样点数,这些参数直接影响时频分析的质量和精度。

3. 频率切片变换阶段:对信号进行快速傅里叶变换,将信号从时域转换到频域,然后在设定的观测频率范围内,依次对每个频率点应用频率切片函数,计算信号在该频率切片上的时频表示。

4. 信号重构阶段:通过逆频率切片小波变换过程,从特定的频率切片中重构原始信号,验证变换过程的准确性和可逆性,确保时频分析没有丢失重要信息。

5. 结果处理阶段:计算频率切片小波变换结果的幅度信息,进行归一化处理,为后续的可视化展示准备数据,确保不同信号之间的可比性。

6. 可视化展示阶段:通过四种不同的图形展示分析结果,包括时域信号对比图、频域包络谱图、二维时频谱图和三维时频谱图,从多个角度全面展示信号的时频特性。

# 主程序if __name__ == "__main__":# 生成模拟信号Fs = 12800 # 采样频率N = 2048 # 信号长度t = np.arange(N) / Fs # 时间向量# 创建包含多个频率成分的模拟信号f1, f2, f3 = 100, 500, 2000 # 三个频率成分s = 0.5 * np.sin(2 * np.pi * f1 * t) + \0.8 * np.sin(2 * np.pi * f2 * t) + \0.3 * np.sin(2 * np.pi * f3 * t) # 合成信号# 消除直流分量s = s - np.mean(s)# 设置观测频率范围f1_obs = 1000 # 观测频率下界f2_obs = 5000 # 观测频率上界# 计算观测频率的离散形式k1 = int(f1_obs * N / Fs - 0.5)k2 = int(f2_obs * N / Fs - 0.5)if k2 > N/2 + 1:k2 = int(N/2 + 1)df = 1 # 观测频率步长fp = np.arange(k1, k2, df) # 观测频率离散形式nl = len(fp) # 观测频率数量kapa = np.sqrt(2) / 2 / 0.025 # 时频分辨率因子Tn = 2048 # 时域的样本点数# 执行频率切片小波变换A = GetFSWT(s, Fs, fp, kapa, Tn)# 从选定频带恢复信号ss = GetInvFSWT(N, A, fp)# 计算变换结果的幅度 - 修改这里:先取绝对值,然后再进行归一化B = np.abs(A) # 直接计算幅度mx = np.max(B)B = np.floor(B * 128 / mx) # 归一化并缩放# 创建时间向量t_plot = np.arange(Tn) * N / Fs / Tn# 绘制结果plt.figure(figsize=(15, 10))# 子图1: 原始信号与恢复信号plt.subplot(2, 2, 1)plt.plot(t, s, 'r', label='Original')plt.plot(t, ss, 'b', label='Reconstructed')plt.xlabel('Time/s')plt.ylabel('Amplitude')plt.title('Original and Reconstructed Signals')plt.legend# 子图2: 频率切片包络谱plt.subplot(2, 2, 2)Y = np.fft.fft(s, N)z = np.abs(Y) # 直接计算幅度z[0:2] = 0 # 去除直流和前两个频率分量K1 = int(f2_obs * N / Fs)fp1 = np.arange(K1) / N * Fsplt.plot(fp1, z[:K1])plt.xlabel('Frequency/Hz')plt.ylabel('Amplitude')plt.title('Frequency Slice Envelope Spectrum')# 子图3: 频率切片二维时频谱plt.subplot(2, 2, 3)plt.imshow(B.T, aspect='auto', extent=[t_plot[0], t_plot[-1], fp[0]*Fs/N, fp[-1]*Fs/N], origin='lower')plt.xlabel('Time/s')plt.ylabel('Frequency/Hz')plt.title('2D Time-Frequency Spectrum')plt.colorbar# 子图4: 频率切片三维时频谱ax = plt.subplot(2, 2, 4, projection='3d')X, Y = np.meshgrid(t_plot, fp*Fs/N)Z = B.Tax.plot_surface(X, Y, Z, cmap='viridis')ax.set_ylabel('Frequency/Hz')ax.set_xlabel('Time/s')ax.set_zlabel('Amplitude')plt.title('3D Time-Frequency Spectrum')plt.tight_layoutplt.show

完整代码通过知乎学术咨询获取:

https://www.zhihu.com/consult/people/792359672131756032?isMe=1

工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任

《中国电机工程学报》《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》,《宇航学报》等EI期刊审稿专家,担任《计算机科学》,《电子器件》 ,《现代制造过程》 ,《电源学报》,《船舶工程》 ,《轴承》 ,《工矿自动化》 ,《重庆理工大学学报》 ,《噪声与振动控制》 ,《机械传动》 ,《机械强度》 ,《机械科学与技术》 ,《机床与液压》,《声学技术》,《应用声学》等中文核心审稿专家。

擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

来源:小宇科技观

相关推荐