数学建模学习-小波分析(Wavelets Analysis)教程(40)
目录
写在最前
注意本文的相关代码及例子为同学们提供参考,借鉴相关结构,在这里举一些通俗易懂的例子,方便同学们根据实际情况修改代码,很多同学私信反映能否添加一些可视化,这里每篇教程都尽可能增加一些可视化方便同学理解,但具体使用时,同学们要根据实际情况选择是否在论文中添加可视化图片。
系列教程计划持续更新,同学们可以免费订阅专栏,内容充足后专栏可能付费,提前订阅的同学可以免费阅读,同时相关代码获取可以关注博主评论或私信。
一、小波分析简介
小波分析(Wavelets Analysis)是一种强大的信号处理工具,它可以在时间和频率域同时分析信号。与传统的傅里叶变换相比,小波分析具有更好的时频局部化特性,能够有效地分析非平稳信号。小波分析在数学建模中有着广泛的应用,特别是在以下领域:
- 信号处理和去噪
- 图像压缩和处理
- 时间序列分析
- 金融数据分析
- 生物医学信号处理
二、小波分析的基本原理
2.1 小波变换的数学基础
小波变换的基本思想是使用一组基函数(小波基)来表示信号。小波变换可以表示为:
W ψ f ( a , b ) = 1 ∣ a ∣ ∫ − ∞ ∞ f ( t ) ψ ∗ ( t − b a ) d t W_{\psi}f(a,b) = \frac{1}{\sqrt{|a|}} \int_{-\infty}^{\infty} f(t)\psi^*(\frac{t-b}{a})dt Wψf(a,b)=∣a∣1∫−∞∞f(t)ψ∗(at−b)dt
其中:
- f ( t ) f(t) f(t) 是待分析的信号
- ψ ( t ) \psi(t) ψ(t) 是母小波函数
- a a a 是尺度参数(控制频率)
- b b b 是平移参数(控制时间位置)
- W ψ f ( a , b ) W_{\psi}f(a,b) Wψf(a,b) 是小波系数
2.2 小波变换的类型
-
连续小波变换(CWT):
- 尺度参数和平移参数连续变化
- 提供最详细的时频分析
- 计算量较大
-
离散小波变换(DWT):
- 尺度和平移参数离散化
- 计算效率高
- 适合实际应用
三、环境准备
在开始之前,我们需要安装必要的Python库:
numpy>=1.21.0
matplotlib>=3.4.0
pywavelets>=1.1.1
scipy>=1.7.0
可以使用pip安装:
pip install -r requirements.txt
四、代码实现
4.1 生成测试信号
首先,我们生成一个包含两个不同频率成分的测试信号:
def generate_test_signal(t):
"""生成测试信号:包含两个不同频率的正弦波"""
# 生成两个频率分量
s1 = np.sin(2 * np.pi * 10 * t) # 10Hz的正弦波
s2 = 0.5 * np.sin(2 * np.pi * 50 * t) # 50Hz的正弦波
# 在不同时间段使用不同的频率
signal = np.zeros_like(t)
signal[:len(t)//2] = s1[:len(t)//2]
signal[len(t)//2:] = s2[len(t)//2:]
return signal
4.2 离散小波变换分析
实现离散小波变换的多层分解:
def plot_wavelet_analysis(signal, sampling_rate, wavelet='db4', level=4):
"""进行小波分析并绘制结果"""
# 小波分解
coeffs = pywt.wavedec(signal, wavelet, level=level)
# 创建时间轴
t = np.arange(len(signal)) / sampling_rate
# 绘制原始信号和各层分解结果
fig, axes = plt.subplots(level + 2, 1, figsize=(10, 12))
fig.suptitle('小波分析结果展示', fontsize=16)
# 绘制原始信号
axes[0].plot(t, signal)
axes[0].set_title('原始信号')
axes[0].set_xlabel('时间 (秒)')
axes[0].set_ylabel('幅度')
# 绘制近似系数
approx = coeffs[0]
t_approx = np.linspace(0, t[-1], len(approx))
axes[1].plot(t_approx, approx)
axes[1].set_title(f'近似系数 (level {level})')
axes[1].set_xlabel('时间 (秒)')
axes[1].set_ylabel('幅度')
# 绘制细节系数
for i, detail in enumerate(coeffs[1:], 2):
t_detail = np.linspace(0, t[-1], len(detail))
axes[i].plot(t_detail, detail)
axes[i].set_title(f'细节系数 (level {level-i+2})')
axes[i].set_xlabel('时间 (秒)')
axes[i].set_ylabel('幅度')
4.3 连续小波变换分析
实现连续小波变换并绘制时频图:
def plot_continuous_wavelet(signal, sampling_rate):
"""进行连续小波变换并绘制结果"""
# 创建时间轴
t = np.arange(len(signal)) / sampling_rate
# 执行连续小波变换
scales = np.arange(1, 128)
coef, freqs = pywt.cwt(signal, scales, 'morl', sampling_period=1/sampling_rate)
# 绘制结果
plt.figure(figsize=(10, 8))
plt.imshow(abs(coef), extent=[t[0], t[-1], freqs[-1], freqs[0]],
aspect='auto', cmap='jet')
plt.colorbar(label='幅度')
plt.ylabel('频率 (Hz)')
plt.xlabel('时间 (秒)')
plt.title('连续小波变换时频图')
五、实例分析
让我们通过一个具体的例子来展示小波分析的应用。我们将分析一个包含不同频率成分的信号,并添加噪声来模拟实际情况。
5.1 原始信号与噪声信号对比
首先,我们生成测试信号并添加噪声:
[外链图片转存中…(img-cNnH2PTi-1737432835035)]
从图中可以看到,原始信号在前半段和后半段具有不同的频率特征,添加噪声后信号变得更加复杂。
5.2 离散小波变换结果
使用离散小波变换对信号进行多层分解:
[外链图片转存中…(img-uW1Btg9N-1737432844769)]
从分解结果可以看到:
- 近似系数反映了信号的低频成分
- 不同层级的细节系数反映了信号在不同频率范围的特征
- 通过观察各层系数,我们可以识别出信号中的主要频率成分
5.3 连续小波变换结果
连续小波变换提供了信号的时频分析视图:
从时频图中我们可以清楚地看到:
- 信号在不同时间段的频率特征
- 颜色越亮表示该时频点的能量越强
- 可以清晰地识别出信号在前半段和后半段的频率变化
六、小波分析的优势
-
多分辨率分析
- 可以在不同尺度下分析信号
- 能够捕捉信号的局部特征
-
时频局部化
- 同时提供时域和频域的信息
- 适合分析非平稳信号
-
去噪能力
- 可以有效分离信号和噪声
- 保持信号的重要特征
-
计算效率
- 离散小波变换计算效率高
- 适合实时处理应用
七、应用场景
-
信号处理
- 语音信号分析
- 生物医学信号处理
- 地震信号分析
-
图像处理
- 图像压缩
- 图像去噪
- 特征提取
-
金融分析
- 时间序列预测
- 市场波动分析
- 风险评估
-
工程应用
- 故障诊断
- 振动分析
- 系统识别
八、注意事项
-
小波基的选择
- 不同小波基适用于不同类型的信号
- 需要根据实际问题选择合适的小波基
-
分解层数的确定
- 层数过多可能导致过度分解
- 层数过少可能无法充分分析信号
-
边界效应
- 信号边界处可能出现失真
- 需要采取适当的边界处理方法
-
计算资源
- 连续小波变换计算量较大
- 需要根据实际需求选择合适的变换方法
九、总结
小波分析是一种强大的信号处理工具,它在数学建模中有着广泛的应用。通过本教程,我们学习了:
- 小波分析的基本原理
- 离散和连续小波变换的实现
- 如何使用Python进行小波分析
- 小波分析的实际应用场景
本教程提供的代码和示例可以作为同学们学习和应用小波分析的参考。在实际应用中,需要根据具体问题选择合适的小波分析方法和参数。
同学们如果有疑问可以私信答疑,如果有讲的不好的地方或可以改善的地方可以一起交流,谢谢大家。