You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中自定义类Morlet正弦型连续小波并用于pywt.cwt?

自定义正弦版Morlet小波并用于PyWavelets连续小波变换

1. 自定义连续小波类

PyWavelets支持通过继承pywt.ContinuousWavelet类实现自定义连续小波,我们需要实现目标小波的时域函数,并指定中心频率(用于尺度与频率的转换):

import pywt
import numpy as np

class CustomMorletSin(pywt.ContinuousWavelet):
    def __init__(self):
        # 为自定义小波命名
        super().__init__("custom_morlet_sin")
        # 设置中心频率:对应ω0=5,转换为频率f0=5/(2π)
        self.center_frequency = 5 / (2 * np.pi)
    
    def wavelet_function(self, t):
        # 实现目标小波的时域表达式:e^(-t²/2)*sin(5t)
        return np.exp(-t**2 / 2) * np.sin(5 * t)
    
    def scaling_function(self, t):
        # 连续小波不需要尺度函数,直接返回None
        return None

2. 替换原有代码中的小波实例

将原代码里的wavelet = 'morl'替换为自定义小波的实例:

# 实例化自定义小波
wavelet = CustomMorletSin()

3. 尺度计算逻辑(可选优化)

你原代码中使用的0.8125是标准Morlet小波中心频率(≈0.7958)的近似值,对于自定义小波,建议用精准的中心频率值计算尺度,保证尺度与周期的转换准确性:

# 替换原有的widths计算逻辑
widths_364 = wavelet.center_frequency * periods / dt_364_

如果希望保留原近似系数,继续使用0.8125*periods/dt_364_也可,两者结果差异极小。

完整修改后的代码

整合后的可运行代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pywt

class CustomMorletSin(pywt.ContinuousWavelet):
    def __init__(self):
        super().__init__("custom_morlet_sin")
        self.center_frequency = 5 / (2 * np.pi)
    
    def wavelet_function(self, t):
        return np.exp(-t**2 / 2) * np.sin(5 * t)
    
    def scaling_function(self, t):
        return None

# 读取数据
data_364 = pd.read_csv("Intensity_3.64_20220110_136K copy2.csv")
t_364 = data_364['Time'].values
y_364 = data_364['20-2'].values

# 计算时间间隔(可优化为dt_364 = np.diff(t_364),效率更高)
dt_364 = np.array([])
for i in range(len(t_364)-1):
    dt_364 = np.append(dt_364 , t_364[i+1] - t_364[i])

plt.plot(t_364[:-1], dt_364, 'o', markersize=3)
plt.semilogy()
plt.show()

dt_364_ = 1.0656

# 周期范围与分辨率
Tmin = 1e-1
Tmax = 1e3
resolution = 2000

# 信号预处理
sig_364 = y_364 - 1       

# 使用自定义小波
wavelet = CustomMorletSin()
periods = np.geomspace(Tmin, Tmax, resolution)
# 精准计算尺度
widths_364 = wavelet.center_frequency * periods / dt_364_

# 执行连续小波变换
cwtmatr_364, freqs_364 = pywt.cwt(sig_364, widths_364, wavelet, sampling_period=dt_364_)

关键说明

  • 必须指定center_frequency,否则PyWavelets无法完成尺度到频率的转换。
  • 你定义的小波是标准Morlet小波的虚部,两者时频特性高度相似,仅相位存在差异。
  • 若不想使用类继承,也可直接创建pywt.ContinuousWavelet实例并手动绑定小波函数,但继承类的方式更规范易维护。

内容的提问来源于stack exchange,提问作者M Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:05:40