近期针对数据的预处理做了一些工作,主要是针对非线性数据应用小波变化进行了数据的一些预处理工作。
1.怎么根据需要的频段选择性的重构信号?
根据小波的重构原理,通过观察小波树形结构可知,如果分解的层数为n,则最终获取的分支数则为n+1。例如分解了3层,则
wave1,wave2,wave3,wave4 = pywt.wavedec(signal,wavelet,level=level)
想象一下小波数的结构,其中wave1,wave2,wave3,wave4的为从下往上,从左往右的顺序下的对应的枝节,也就是wave1对应cA3(近似参数),cD3(细节参数),cD2(细节参数),cD1(细节参数)。
注意:如果想要重构某一个分支上的数据,正确的做法应该是将不需要的分支上的系数置零,再进行重构。而不是把其他的分支的系数直接扔掉,这样的话会导致重构失败或者出现错误的重构结果。
2.各个小波的系数分别重构的结果直接相加是否等于原信号?
coeffs = pywt.wavedec(signal,wavelet,level=level)
wave_rec1 = pywt.waverec(np.multiply(coeffs, [1,0,0]).tolist(),wavelet=wavelet)
wave_rec2 = pywt.waverec(np.multiply(coeffs, [0,1,0]).tolist(),wavelet=wavelet)
wave_rec3 = pywt.waverec(np.multiply(coeffs, [0,0,1]).tolist(),wavelet=wavelet)
wave_rec = wave_rec1 + wave_rec2 +wave_rec3
结论:通过以下数据经过验证,证明滤波结束各个子频段相加的结果就是原始信号。
针对小波包的重构原理也是类似。
from scipy.signal import istft,stft,welch
from matplotlib import pyplot as plt
signal = np.random.rand(100,1)
wavelet = pywt.Wavelet('sym4')
level = 2
coeffs = pywt.wavedec(signal[:,0],wavelet,level=level)
wave_rec1 = pywt.waverec(np.multiply(coeffs, [1,0,0]).tolist(),wavelet=wavelet)
wave_rec2 = pywt.waverec(np.multiply(coeffs, [0,1,0]).tolist(),wavelet=wavelet)
wave_rec3 = pywt.waverec(np.multiply(coeffs, [0,0,1]).tolist(),wavelet=wavelet)
wave_rec = wave_rec1 + wave_rec2 +wave_rec3
x = list(range(len(signal)))
plt.subplot(311)
plt.plot(x,wave_rec1,label='wave_rec1')
plt.legend()
plt.subplot(312)
plt.plot(x,wave_rec2,label='wave_rec2')
plt.legend()
plt.subplot(313)
plt.plot(x,wave_rec3,label='wave_rec3')
plt.legend()
plt.figure()
plt.subplot(211)
plt.plot(x,signal,label='original_signal')
plt.legend()
plt.subplot(212)
plt.plot(x,wave_rec,label = 'wave_rec1+wave_rec2+wave_rec3')
plt.legend()