发布时间:2023-12-31 18:00
不同于傅里叶变换,变量只有频率ω,小波变换有两个变量:尺度a和平移量 b。尺度a控制小波函数的伸缩,平移量 b控制小波函数的平移。尺度就对应于频率(反比),平移量 b就对应于时间。
1.对于一般的时间序列来说,不是连续变换,而是一种离散信号,这就需要用到离散小波变换,离散小波变换就只是将尺度参数a和平移参数b离散化。小波变换很大程度上弥补了傅立叶分解在非平稳时间序列上的不足,通过将傅立叶分解的正余弦波替换为一组可衰减的正交基,能较好地表达出序列中的突变和非平稳部分。
2.离散小波变换的核心:用不同频率的滤波器分析不同频率的信号,主要是高通滤波器和低通滤波器。
DWT用小波基函数(wavelet fuction)和尺度函数(scale function)来分别分析高频信号和低频信号,也即高通滤波器和低通滤波器。
3.离散小波变换步骤:
经过上述操作,保留了频率的时间位置信息。
# 小波
sampling_rate = 1024
t = np.arange(0, 1.0, 1.0 / sampling_rate)
f1 = 100
f2 = 200
f3 = 300
f4 = 400
data = np.piecewise(t, [t < 1, t < 0.8, t < 0.5, t < 0.3],
[lambda t: 400*np.sin(2 * np.pi * f4 * t),
lambda t: 300*np.sin(2 * np.pi * f3 * t),
lambda t: 200*np.sin(2 * np.pi * f2 * t),
lambda t: 100*np.sin(2 * np.pi * f1 * t)])
wavename = \'cgau8\'
totalscal = 256
fc = pywt.central_frequency(wavename)
cparam = 2 * fc * totalscal
scales = cparam / np.arange(totalscal, 1, -1)
[cwtmatr, frequencies] = pywt.cwt(data, scales, wavename, 1.0 / sampling_rate)
plt.figure(figsize=(8, 4))
plt.subplot(211)
plt.plot(t, data)
plt.xlabel(\"t(s)\")
plt.title(\'shipinpu\', fontsize=20)
plt.subplot(212)
plt.contourf(t, frequencies, abs(cwtmatr))
plt.ylabel(u\"prinv(Hz)\")
plt.xlabel(u\"t(s)\")
plt.subplots_adjust(hspace=0.4)
plt.show()
import pywt
import matplotlib.pyplot as plt
import numpy as np
fs = 1000
N = 200
k = np.arange(200)
frq = k*fs/N
frq1 = frq[range(int(N/2))]
aa = []
for i in range(200):
aa.append(np.sin(0.3*np.pi*i))
for i in range(200):
aa.append(np.sin(0.13*np.pi*i))
for i in range(200):
aa.append(np.sin(0.05*np.pi*i))
y = aa
wavename = \'db5\'
cA, cD = pywt.dwt(y, wavename)
ya = pywt.idwt(cA, None, wavename, \'smooth\') # approximated component
yd = pywt.idwt(None, cD, wavename, \'smooth\') # detailed component
x = range(len(y))
plt.figure(figsize=(12, 9))
plt.subplot(311)
plt.plot(x, y)
plt.title(\'original signal\')
plt.subplot(312)
plt.plot(x, ya)
plt.title(\'approximated component\')
plt.subplot(313)
plt.plot(x, yd)
plt.title(\'detailed component\')
plt.tight_layout()
plt.show()
# 图像单边谱
plt.figure(figsize=(12, 9))
plt.subplot(311)
data_f = abs(np.fft.fft(cA))/N
data_f1 = data_f[range(int(N/2))]
plt.plot(frq1, data_f1, \'red\')
plt.subplot(312)
data_ff = abs(np.fft.fft(cD))/N
data_f2 = data_ff[range(int(N/2))]
plt.plot(frq1, data_f2, \'k\')
plt.xlabel(\'pinlv(hz)\')
plt.ylabel(\'amplitude\')
plt.show()
离散小波变换把信号分成了低频近似和高频细节,分离信号高低频效果还可以。可以设置阈值就可将信号高频分离出来。
以上仅是个人理解!!!可以一起多多交流。