主要问题:如何反转scipy.signal.cwt()
函数。逆小波变换[/ xpost信号处理]
我已经看到Matlab有一个反向连续小波变换函数,它将通过输入小波变换返回数据的原始形式,尽管您可以滤除不想要的切片。
由于SciPy的似乎并不具有相同的功能,我一直在试图找出如何取回数据以相同的形式,同时消除噪声和背景。 我该怎么做? 我试着将它平方去除负值,但是这给了我值大的方法,而不是很正确。
这是我一直在努力:
# Compute the wavelet transform
widths = range(1,11)
cwtmatr = signal.cwt(xy['y'], signal.ricker, widths)
# Maybe we multiple by the original data? and square?
WT_to_original_data = (xy['y'] * cwtmatr)**2
这里是一个完全编译简短的脚本向您展示的数据类型,我试图让和我有什么等:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# Make some random data with peaks and noise
def make_peaks(x):
bkg_peaks = np.array(np.zeros(len(x)))
desired_peaks = np.array(np.zeros(len(x)))
# Make peaks which contain the data desired
# (Mid range/frequency peaks)
for i in range(0,10):
center = x[-1] * np.random.random() - x[0]
amp = 60 * np.random.random() + 10
width = 10 * np.random.random() + 5
desired_peaks += amp * np.e**(-(x-center)**2/(2*width**2))
# Also make background peaks (not desired)
for i in range(0,3):
center = x[-1] * np.random.random() - x[0]
amp = 40 * np.random.random() + 10
width = 100 * np.random.random() + 100
bkg_peaks += amp * np.e**(-(x-center)**2/(2*width**2))
return bkg_peaks, desired_peaks
x = np.array(range(0, 1000))
bkg_peaks, desired_peaks = make_peaks(x)
y_noise = np.random.normal(loc=30, scale=10, size=len(x))
y = bkg_peaks + desired_peaks + y_noise
xy = np.array(zip(x,y), dtype=[('x',float), ('y',float)])
# Compute the wavelet transform
# I can't figure out what the width is or does?
widths = range(1,11)
# Ricker is 2nd derivative of Gaussian
# (*close* to what *most* of the features are in my data)
# (They're actually Lorentzians and Breit-Wigner-Fano lines)
cwtmatr = signal.cwt(xy['y'], signal.ricker, widths)
# Maybe we multiple by the original data? and square?
WT = (xy['y'] * cwtmatr)**2
# plot the data and results
fig = plt.figure()
ax_raw_data = fig.add_subplot(4,3,1)
ax = {}
for i in range(0, 11):
ax[i] = fig.add_subplot(4,3, i+2)
ax_desired_transformed_data = fig.add_subplot(4,3,12)
ax_raw_data.plot(xy['x'], xy['y'], 'g-')
for i in range(0,10):
ax[i].plot(xy['x'], WT[i])
ax_desired_transformed_data.plot(xy['x'], desired_peaks, 'k-')
fig.tight_layout()
plt.show()
该脚本将输出这个图片:
w ^这里第一个图是原始数据,中间图是小波变换,最后一个图是我想要处理的(背景和噪声去除)数据。
有没有人有任何建议?十分感谢你的帮助。
谢谢@MrE我已经看过文档,但并没有真正提供关于发生什么的更多细节。我希望有一个'scipy.signal.icwt'函数可以得到相反的结果,并隐藏所有的数学和技巧,但看起来你必须自己执行。 所以,问题是我不明白如何做'cwt()'函数的逆数学。他们在文档中没有足够的描述如何做到这一点。 – chase
对不起,我误解了你的问题,我以为你没有看到这个功能。 – YXD