Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from pylab import *
- import pywt as pw
- from numpy import *
- SCALE = 3
- N = 2 ** SCALE
- def f1(x):
- return np.sin(2 * x)
- def f2(x):
- return np.sin(x ** 2)
- def f3():
- return np.sin(2 * np.pi * (2 ** np.linspace(2, 10, 1024)) * np.arange(1024) / 48000) + np.random.normal(0, 1, 1024) * 0.15
- def check_level(level):
- max_level = int(np.log2(N))
- if level is None:
- return max_level
- elif level < 0:
- raise ValueError("Level value of %d is too low. Minimum level is 0 ." % level)
- elif level > max_level:
- print(("Level value of {0} is too high. The maximum level value of {1} will be used.").format(level, max_level))
- return max_level
- return level
- def dwt(data):
- size = len(data) // 2
- cA = np.zeros(size)
- cD = np.zeros(size)
- for i, j in zip(range(0, len(data), 2), range(size)):
- c = 2 * (data[i] + data[i + 1]) / np.sqrt(N)
- cA[j] = c
- for i, j in zip(range(0, len(data), 2), range(size)):
- c = 2 * (data[i] - data[i + 1]) / np.sqrt(N)
- cD[j] = c
- return cA, cD
- def wavedec (data, level = None):
- coeffs_list = []
- level = check_level(level)
- if level == 0:
- return[np.array(data)]
- a = data
- for i in range(level):
- a, d = dwt(a)
- coeffs_list.append(d)
- coeffs_list.append(a)
- coeffs_list.reverse()
- return coeffs_list
- def idwt(a, d):
- res = []
- for i in range(len(a)):
- x = (a[i] + d[i]) * np.sqrt(N) / 4
- y = (a[i] - d[i]) * np.sqrt(N) / 4
- res.extend([x, y])
- return np.array(res)
- def waverec(coeffs):
- if len(coeffs) < 1:
- raise ValueError("Coefficient list too short (minimum 1 arrays required).")
- elif len(coeffs) == 1:
- return coeffs[0]
- a, ds = coeffs[0], coeffs[1:]
- for d in ds:
- a = idwt(a, d)
- return a
- x = linspace(0, 8, num = 1024)
- chirp_signal = np.sin(2 * np.pi * (2 ** np.linspace(2, 10, 1024)) * np.arange(1024) / 48000) + np.random.normal(0, 1, 1024) * 0.15
- fig, ax = subplots(figsize=(6, 1))
- ax.set_title("Исходный сигнал")
- ax.plot(chirp_signal)
- show()
- x = linspace(0, 50, num = 1024)
- y = np.sin(2 * np.pi * (2 ** np.linspace(2, 10, 1024)) * np.arange(1024) / 48000) + np.random.normal(0, 1, 1024) * 0.15
- st='sym5'
- (cA, cD) = pywt.dwt(y,st)
- subplot(2, 1, 1)
- plot(cA,'b',linewidth=2, label='cA,level-1')
- title("Коэффициенты аппроксимации")
- legend(loc='best')
- grid()
- subplot(2, 1, 2)
- plot(cD,'r',linewidth=2, label='cD,level-1')
- title("Коэффициенты детализации")
- grid()
- legend(loc='best')
- show()
- (cA, cD) = pywt.dwt(cA,st)
- subplot(2, 1, 1)
- plot(cA,'b',linewidth=2, label='cA,level-2')
- title("Коэффициенты аппроксимации")
- legend(loc='best')
- grid()
- subplot(2, 1, 2)
- plot(cD,'r',linewidth=2, label='cD,level-2')
- title("Коэффициенты детализации")
- grid()
- legend(loc='best')
- show()
- (cA, cD) = pywt.dwt(cA,st)
- subplot(2, 1, 1)
- plot(cA,'b',linewidth=2, label='cA,level-3')
- title("Коэффициенты аппроксимации")
- legend(loc='best')
- grid()
- subplot(2, 1, 2)
- plot(cD,'r',linewidth=2, label='cD,level-3')
- title("Коэффициенты детализации")
- grid()
- legend(loc='best')
- show()
- (cA, cD) = pywt.dwt(cA,st)
- subplot(2, 1, 1)
- plot(cA,'b',linewidth=2, label='cA,level-4')
- title("Коэффициенты аппроксимации")
- legend(loc='best')
- grid()
- subplot(2, 1, 2)
- plot(cD,'r',linewidth=2, label='cD,level-4')
- title("Коэффициенты детализации")
- grid()
- legend(loc='best')
- show()
- signal = [1, 2, 3, 4, 5, 6, 7, 8]
- print('Signal: ', signal)
- (cA, cD) = pywt.dwt(signal, 'db1')
- print('Coefficients in wavelet transform:', '\ncA: ', cA, '\nCd: ', cD)
- signal_restored = pywt.idwt(cA, cD, 'db1')
- print('Signal restored: ',signal_restored)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement