如何在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
相关产品推荐
相关产品推荐

