《用于正弦波频率估计的修正I-Rife算法》,王哲文,2024
DOI: 10. 16337/j. 1004‑9037. 2024. 02. 019
1.1 这篇论文所属的自科基金U21A20500:近5年所承担的重要科研项目表-智能感知系统与安全教育部重点实验室(湖北大学)
ML慢而精确。RIf快,Zoom-FFT, CZT性能很好但无法满足实时解析场景。
我的基本信号处理对象是振动信号,这里生成了一个冲击性振动信号,很简单:
叠加了幅度为信号-20db的高斯噪声。生成代码参见附录B 冲击信号模拟源
这是一个用于天文观测雷达信号的解析库,作为一个完整领域的信号分析库,可以用来对信号处理的可能问题和算法有一个大致的第一印象。
download from: specutils · PyPId
doc:Specutils Documentation — specutils v1.15.1.dev0+gce3f43c.d20240501
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 获取当前脚本文件所在目录的父目录,并构建相对路径 import os import sys current_dir = os.path.dirname(os.path.abspath(__file__)) project_path = os.path.join(current_dir, '..') sys.path.append(project_path) sys.path.append(current_dir) import numpy as np import matplotlib.pyplot as plt from matplotlib import rcParams from scipy.signal import get_window # 设置中文字体 rcParams['font.sans-serif'] = ['SimHei'] # 指定中文字体 rcParams['axes.unicode_minus'] = False # 解决负号问题 # 参数设置 fs = 10000 # 采样频率 (Hz) f_signal = 181.5 # 信号频率 (Hz) rms_signal = 5e-3 # 信号 RMS (m/s) duration = 1 # 信号持续时间 (秒) pulse_duration = 1 / (100 * f_signal) # 脉冲持续时间 (秒) # 生成时间序列 t = np.arange(0, duration, 1/fs) # 生成冲击性振动信号(脉冲信号) pulse_start = int(fs * (duration / 2 - pulse_duration / 2)) pulse_end = int(fs * (duration / 2 + pulse_duration / 2)) signal = np.zeros_like(t) signal[pulse_start:pulse_end] = rms_signal * np.sqrt(2) # 生成高斯噪声 rms_noise = rms_signal * 0.1 noise = rms_noise * np.random.randn(len(t)) # 将信号和噪声相加 signal_with_noise = signal + noise # 绘图 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) plt.plot(t, signal, label='冲击性振动信号') plt.title('冲击性振动信号') plt.xlabel('时间 (秒)') plt.ylabel('幅值') plt.legend() plt.subplot(1, 2, 2) plt.plot(t, signal_with_noise, label='含噪声信号', color='red') plt.title('含噪声的冲击性振动信号') plt.xlabel('时间 (秒)') plt.ylabel('幅值') plt.legend() plt.tight_layout() plt.show()