最近做纸币防伪的水印防伪这一块,了解了少量小波变换的知识,本篇文章专业性差,仅作为笔记使用
傅里叶变换
推荐花生油工人的一篇文章,写的非常详实且通俗易懂
如下图,x逆时针旋转90°可以表示为 x*i, x逆时针旋转180°可以表示为x * i^2 即 - x。
在此基础上,在一个点在复平面螺旋线上的运动,在实部与虚部的投影,分别为余弦函数和正弦函数
优美的欧拉公式浮出水面~
当x为Π时:
正弦波的叠加,也可以理解为螺旋线的叠加在实数空间的投影,无数的正弦波的叠加引出了傅里叶级数公式:
将其带入傅里叶级数公式得:
F(w)就是傅里叶变换,从信号从时域图转换为频域图。
傅里叶变换处理非平稳信号有先天缺陷。它只能获取一段信号总体上包含哪些频率的成分,但是对各成分出现的时刻并无所知。因此,时域相差很大的两个信号,可能频谱一样。对于突变信号,傅里叶变换存在吉布斯效应,我们用无限长的三角函数怎么也拟合不好突变信号,由此引出小波变换,锵锵!
小波变换
Ψ (x)是小波函数
python 的 PyWavelets(pywt)库中,
pywt.cwt()
函数用于进行连续小波变换。pywt.cwt(signal, scales, ‘morl’),第一个参数为进行小波变换的信号,第二个参数为小波函数的尺度,第三个参数为指定要使用的小波函数。
常用的小波函数有以下几种:
‘morl’:Morlet 小波函数,常用于时序数据分析,具有良好的时域和频域特性。
‘gaus1’:高斯小波函数,具有类似高斯分布的形状,在某些应用中很有用。
‘haar’:Haar 小波函数,是最简单的小波函数之一,常用于基础的小波分析。
‘dbN’:Daubechies 小波函数,N 表示小波函数的阶数,比如 ‘db4’、‘db6’ 等,这些小波函数具有紧支集和多分辨率分析的性质,适用于信号压缩和去噪等应用。
除了上述几种常用的小波函数外,pywt 还支持其他小波函数,你可以通过查看官方文档或函数的帮助文档来获取更多信息。选择合适的小波函数取决于你的应用场景和分析需求。
import numpy as np
import matplotlib.pyplot as plt
import pywt
signal1 = [···]
signal2 = [···]
# 连续小波变换
coeffs1, _ = pywt.cwt(signal1[50:90], 10, 'morl') # 对第一个信号进行连续小波变换
coeffs2, _ = pywt.cwt(signal2[50:90], 10, 'morl') # 对第二个信号进行连续小波变换
# 计算频谱相关性
# [0, 1]表示我们要获取相关系数矩阵中第一行第二列的元素,这个元素就是我们想要的两个信号之间的相关系数。
# 输出
# [[r11 r12]
# [r21 r22]]
# 左上角和右下角的元素是 coeffs1 与自身的相关系数,即自相关系数;
# 右上角和左下角的元素是 coeffs1 与 coeffs2 的相关系数,即它们之间的交叉相关系数。
correlation = np.corrcoef(coeffs1, coeffs2)[0, 1]
print(correlation)
# # 绘制结果
# plt.figure(figsize=(10, 5))
# plt.imshow(correlation, cmap='viridis', aspect='auto')
# plt.colorbar(label='Correlation')
# plt.title('Wavelet Transform Correlation')
# plt.xlabel('Time')
# plt.ylabel('Scale')
# plt.show()