<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/env python3

import numpy as np
import pywt
import math

"""
	============================================
	       this code is not refactored
	 all raw calculus are showed (no loop &amp; co)
	============================================
"""

signal = [1, 20, 3, 40]

print("\n====== Signal ======")
print(f"{signal}")


# get &amp; show Daubechies-2
print("\n====== Daubechies-2 informations =======")
wavelet = pywt.Wavelet("db2")
(phi, psi, x) = wavelet.wavefun(level=1)
print("high    : ", *wavelet.dec_hi)
print("low     : ", *wavelet.dec_lo)
print("scaling : ", *phi)
print("wavelet : ", *psi)


# Approximation &amp; Detail from pywt
print("\n===== With Pywt =====")
coeffs = pywt.dwt(signal, 'db2', 'symmetric')
print(*coeffs)
print("+--------- approximation -----------+ +------------- detail -----------------+")


# Approximation &amp; Detail from numpy
print("\n==== via numpy ==== ")

signal_padded = pywt.pad(signal, len(wavelet.dec_lo), 'symmetric')

# --------- approximation (low-pass) -----------

# convolution (approximation)
approximation = np.convolve(signal_padded, wavelet.dec_lo, 'valid')
print("Approximation - low-filter - convolution :", *approximation)

# downscale
approximation = approximation[::2]
print("Approximation - low-filter - downscale :", *approximation)

# cleanup
approximation = approximation[1:-1]
print("Approximation - low-filter - cleanup :", *approximation)

# ----------- detail (high-pass) ------------

# convolution (detail)
detail = np.convolve(signal_padded, wavelet.dec_hi, 'valid')
print("Detail - high-pass - convolution :", *detail)

# downscale
detail = detail[::2]
print("Detail - high-pass - downscale :", *detail)

# cleanup
detail = detail[1:-1]
print("Detail - high-pass - cleanup :", *detail)


# Approximation &amp; Detail from scratch
print("\n===== From scratch ====")

print("""
  +---------------+ +---------------+ +---------------+
  |     left      | |     middle    | |     right     |
  |    padding    | |               | |    padding    |
  +---------------+ +---------------+ +---------------+
  | D | C | B | A | | A | B | C | D | | D | C | B | A |
  +---------------+ +---------------+ +---------------+
    symmetric pad         data          symmetric pad

                 ** only convolution **
""")


# --------------------------- coeff for low-pass (wavelet) ------------------------
print("============== Approximation - Low-pass ==================")
coeff = [0.6830127018922194, 1.1830127018922194, 0.3169872981077807, -0.18301270189221933]
print("coeff : ", *coeff)

print("------ middle -------")
a = signal[0] * coeff[0]
b = signal[1] * coeff[1]
c = signal[2] * coeff[2]
d = signal[3] * coeff[3]
print("A+B+C+D :", (a+b+c+d) * (1/math.sqrt(2)))

print("------ right padding -----")
a = signal[1] * coeff[0]
b = signal[2] * coeff[1]
c = signal[3] * coeff[2]
d = signal[3] * coeff[3]
print("B+C+D+D :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[2] * coeff[0]
b = signal[3] * coeff[1]
c = signal[3] * coeff[2]
d = signal[2] * coeff[3]
print("C+D+D+C :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[3] * coeff[0]
b = signal[3] * coeff[1]
c = signal[2] * coeff[2]
d = signal[1] * coeff[3]
print("D+D+C+B :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[3] * coeff[0]
b = signal[2] * coeff[1]
c = signal[1] * coeff[2]
d = signal[0] * coeff[3]
print("D+C+B+A :", (a+b+c+d) * (1/math.sqrt(2)))

print("------ left padding ------")
a = signal[0] * coeff[0]
b = signal[0] * coeff[1]
c = signal[1] * coeff[2]
d = signal[2] * coeff[3]
print("A+A+B+C :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[1] * coeff[0]
b = signal[0] * coeff[1]
c = signal[0] * coeff[2]
d = signal[1] * coeff[3]
print("B+A+A+B :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[2] * coeff[0]
b = signal[1] * coeff[1]
c = signal[0] * coeff[2]
d = signal[0] * coeff[3]
print("C+B+A+A :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[3] * coeff[0]
b = signal[2] * coeff[1]
c = signal[1] * coeff[2]
d = signal[0] * coeff[3]
print("D+C+B+A :", (a+b+c+d) * (1/math.sqrt(2)))


# --------------------------- coeff for high-pass (wavelet) ------------------------
print("============== Detail - High-pass ==================")
coeff = [-0.18301270189221933, -0.3169872981077807, 1.1830127018922194, -0.6830127018922194]
print("coeff : ", *coeff)

print("------ middle -------")
a = signal[0] * coeff[0]
b = signal[1] * coeff[1]
c = signal[2] * coeff[2]
d = signal[3] * coeff[3]
print("A+B+C+D :", (a+b+c+d) * (1/math.sqrt(2)))

print("------ right padding ---------")
a = signal[1] * coeff[0]
b = signal[2] * coeff[1]
c = signal[3] * coeff[2]
d = signal[3] * coeff[3]
print("B+C+D+D :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[2] * coeff[0]
b = signal[3] * coeff[1]
c = signal[3] * coeff[2]
d = signal[2] * coeff[3]
print("C+D+D+C :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[3] * coeff[0]
b = signal[3] * coeff[1]
c = signal[2] * coeff[2]
d = signal[1] * coeff[3]
print("D+D+C+B :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[3] * coeff[0]
b = signal[2] * coeff[1]
c = signal[1] * coeff[2]
d = signal[0] * coeff[3]
print("D+C+B+A :", (a+b+c+d) * (1/math.sqrt(2)))

print("------ left padding ---------")
a = signal[0] * coeff[0]
b = signal[0] * coeff[1]
c = signal[1] * coeff[2]
d = signal[2] * coeff[3]
print("A+A+B+C :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[1] * coeff[0]
b = signal[0] * coeff[1]
c = signal[0] * coeff[2]
d = signal[1] * coeff[3]
print("B+A+A+B :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[2] * coeff[0]
b = signal[1] * coeff[1]
c = signal[0] * coeff[2]
d = signal[0] * coeff[3]
print("C+B+A+A :", (a+b+c+d) * (1/math.sqrt(2)))
a = signal[3] * coeff[0]
b = signal[2] * coeff[1]
c = signal[1] * coeff[2]
d = signal[0] * coeff[3]
print("D+C+B+A :", (a+b+c+d) * (1/math.sqrt(2)))

</pre></body></html>