一起聊聊基于相位导数校正的高分辨率时频分析算法 - 二阶同步压缩变换

发布于 2025-8-20 07:28
浏览
0收藏

实现了二阶同步压缩变换算法,主要用于高分辨率时频分析。核心功能包括:

1. 信号生成:创建具有时变特性的多分量测试信号(含高斯幅度调制和复杂频率调制)

2. 噪声添加:按指定信噪比添加高斯白噪声

3. 时频分析

短时傅里叶变换(STFT)

标准同步压缩变换(FSST)

二阶同步压缩变换(FSST2)

连续小波变换(CWT)

小波同步压缩变换(WSST)

小波二阶同步压缩变换(WSST2)

4. 可视化:比较不同时频分析方法的能量聚集性和分辨率

算法创新点在于通过引入二阶相位导数校正,显著提高了非平稳信号瞬时频率估计的精度,特别适合分析频率快速变化的信号。

一起聊聊基于相位导数校正的高分辨率时频分析算法 - 二阶同步压缩变换-AI.x社区

算法步骤详解

信号预处理

生成测试信号(多分量非平稳信号)

添加高斯白噪声至指定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

一起聊聊基于相位导数校正的高分辨率时频分析算法 - 二阶同步压缩变换-AI.x社区

本文转载自​​​​​高斯的手稿​

收藏
回复
举报
回复
相关推荐