
回复
实现了一种基于最大广义高斯循环平稳性的盲反卷积算法,主要用于从噪声背景中提取周期性脉冲信号。核心功能包括:
通过估计的逆滤波器恢复原始脉冲信号
无需先验知识即可分离混合信号中的周期性脉冲成分
自适应形状参数估计:使用广义高斯分布模型(β参数)描述信号统计特性
循环平稳性优化:最大化输出信号的循环平稳性指标(IGGCSGGS)
循环频率自适应:在指定带宽内搜索最优循环频率
信号预处理(去均值、白化)
迭代优化FIR滤波器:
计算当前输出信号
估计广义高斯形状参数β
构建加权协方差矩阵
求解广义特征值问题更新滤波器
收敛判断(基于循环平稳性指标变化)
旋转机械故障诊断(轴承/齿轮损伤检测)
振动信号分析
周期性脉冲信号提取
强噪声背景下的特征提取
流程图说明:
输入观测信号和算法参数
信号去均值、白化预处理
初始化单位向量作为FIR滤波器起点
信号处理:计算当前滤波器输出
参数估计:自适应估计广义高斯形状参数β
循环分量提取:在指定带宽内搜索最优循环频率
矩阵构建:形成加权协方差矩阵
滤波器更新:通过广义特征值问题求解新滤波器
基于循环平稳性指标(IGGCSGGS)的相对变化
满足误差阈值或达到最大迭代次数时停止
最优逆滤波器
提取的脉冲信号
自适应确定的循环频率
性能指标值
估计的形状参数β
def Periodic(x, alpha, fs, bd):
"""
提取信号中的循环分量
参数:
x: 输入信号
alpha: 目标循环频率
fs: 采样率
bd: 带宽
返回:
p: 循环分量
alpha1: 调整后的循环频率
"""
L = len(x)
f = np.fft.fftfreq(L, 1/fs)
f = f[:L//2] # 只取正频率部分
X = np.fft.fft(x) / L
AX = np.abs(X[:L//2])
t = np.arange(L) / fs
p = np.zeros(L)
alpha1 = []
# 对每个目标频率进行搜索
for k in range(len(alpha)):
# 确定要搜索的目标频率
target_freq = alpha[k] if k == 0 else alpha1[0] * (k + 1)
# 在带宽范围内搜索
idx_start = np.argmin(np.abs(f - (target_freq - bd/2)))
idx_end = np.argmin(np.abs(f - (target_freq + bd/2)))
if idx_end < idx_start:
idx_start, idx_end = idx_end, idx_start
search_range = np.arange(idx_start, min(idx_end + 1, len(f)))
if len(search_range) == 0:
# 如果没有找到合适的频率,使用原始alpha
alpha1.append(alpha[k])
continue
# 寻找最大幅值对应的频率
max_idx = search_range[np.argmax(AX[search_range])]
alpha1.append(f[max_idx])
# 重建循环分量
comp = 2 * np.real(X[max_idx] * np.exp(1j * 2 * np.pi * alpha1[k] * t))
p += comp
# 阈值处理
th = np.percentile(p, 75) # 上四分位数作为阈值
p[p < th] = 0
# 确保没有NaN或inf
p = np.nan_to_num(p, nan=0.0, posinf=0.0, neginf=0.0)
return p, np.array(alpha1)
完整数据和详细注释代码通过知乎学术咨询获得:
https://www.zhihu.com/consult/people/792359672131756032?isMe=1