
回复
实现了二阶同步压缩变换算法,主要用于高分辨率时频分析。核心功能包括:
1. 信号生成:创建具有时变特性的多分量测试信号(含高斯幅度调制和复杂频率调制)
2. 噪声添加:按指定信噪比添加高斯白噪声
3. 时频分析:
短时傅里叶变换(STFT)
标准同步压缩变换(FSST)
二阶同步压缩变换(FSST2)
连续小波变换(CWT)
小波同步压缩变换(WSST)
小波二阶同步压缩变换(WSST2)
4. 可视化:比较不同时频分析方法的能量聚集性和分辨率
算法创新点在于通过引入二阶相位导数校正,显著提高了非平稳信号瞬时频率估计的精度,特别适合分析频率快速变化的信号。
算法步骤详解
信号预处理:
生成测试信号(多分量非平稳信号)
添加高斯白噪声至指定SNR
对信号进行对称填充
STFT路径:
a. 计算短时傅里叶变换
b. 估计瞬时频率(一阶导数)
c. 估计群延迟(时间偏移)
d. 计算相位二阶导数
e. 执行二阶同步压缩:
通过相位导数校正瞬时频率估计
将能量重分配到校正后的频率位置
小波路径:
a. 计算连续小波变换
b. 尺度转频率
c. 估计小波域瞬时频率
d. 计算小波域相位导数
e. 执行二阶同步压缩:
校正小波域频率估计
跨尺度能量重分配
结果可视化:
绘制6种时频分析方法结果
比较能量聚集性和时频分辨率
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, ifft
# =========================================================
# 辅助函数定义
# =========================================================
def amgauss(N, t0=None, T=None):
"""
生成高斯幅度调制信号
Args:
N: 点数
t0: 时间中心 (默认N/2)
T: 时间展宽 (默认2*sqrt(N))
Returns:
y: 高斯幅度调制信号
"""
if t0 is None:
t0 = N / 2
if T is None:
T = 2 * np.sqrt(N)
tmt0 = np.arange(1, N+1) - t0
y = np.exp(-(tmt0 / T)**2 * np.pi)
return y
def cmor(Fb, Fc, xi):
"""
复Morlet小波函数及其导数
Args:
Fb: 带宽参数
Fc: 中心频率
xi: 频率轴向量
Returns:
psih: 小波函数
dpsih: 一阶导数
ddpsih: 二阶导数
"""
psih = np.sqrt(Fb) * np.exp(-Fb**2 * np.pi * (xi - Fc)**2)
dpsih = -2 * Fb**2 * np.pi * (xi - Fc) * psih
ddpsih = 2 * np.pi * Fb**2 * (2 * np.pi * Fb**2 * Fc**2 - 4 * np.pi * Fb**2 * Fc * xi +
2 * np.pi * Fb**2 * xi**2 - 1) * psih
return psih, dpsih, ddpsih
def mypad(s):
"""
对信号进行对称填充
Args:
s: 输入信号
Returns:
N: 填充后长度
x: 填充后信号
n1: 左侧填充点数
"""
n = len(s)
N = 2**(1 + int(np.round(np.log2(n + np.finfo(float).eps))))
n1 = int(np.floor((N - n) / 2))
pad_width = (n1, N - n - n1)
x = np.pad(s, pad_width, mode='symmetric')
return N, x, n1
def sigmerge(x1, x2, ratio):
"""
按指定信噪比合并两个信号
Args:
x1: 主信号
x2: 噪声信号
ratio: 信噪比 (dB)
Returns:
sig: 合并后信号
"""
x1 = np.array(x1).flatten()
x2 = np.array(x2).flatten()
if ratio == np.inf:
return x1
Ex1 = np.mean(np.abs(x1)**2)
Ex2 = np.mean(np.abs(x2)**2)
h = np.sqrt(Ex1 / (Ex2 * 10**(ratio / 10)))
sig = x1 + h * x2
return sig
本文转载自高斯的手稿