Python小波變換的基礎與應用

一、小波變換的基本原理

小波變換,是指將任意一個信號按一組特定的基函數展開,其中變換基函數是由單個所謂的小波輪廓(小波包)組成。在小波變換中,用來代表各個不同頻率分量的是小波函數。小波函數的本質是一種時域和頻域同時存在的函數,並且它們具有局部性和多解析度性。

小波變換(Wavelet Transform)是由尺度變換和平移變換類比得到,同時也利用分離變數法,在時頻層面上分析和處理信號的新方法,其主要優勢是適應信號的非平穩性。小波變換的最大優點是可以定位信號的短時及局部特徵,比如突變點、奇異點等,這是傅里葉變換所不能做到的。

二、小波變換的基礎應用

1. 圖像壓縮

傅里葉變換可以將信號分解成多個頻率成分,而小波變換則可以將信號分解成不同尺度的頻率成分,即對不同尺度的數據進行不同程度的壓縮。小波變換廣泛應用於圖像壓縮中,尤其在JPEG2000中起著非常重要的作用。小波變換最具有優勢的是其多解析度的性質,其可以更好地保留較小的細節特徵。

2. 信號分析

小波變換可以將數據分解成不同尺度、頻率的子波形,並可以根據需要選擇高頻、低頻等部分進行分析。以語音信號分析為例,人耳對於較高頻率的變化不太敏感,較低頻率的變化更加容易被察覺。因此,對於語音信號分析,使用小波變換,提取顫音和基音時,可以明顯地改善聲音的質量。

三、Python實現小波變換

1. PyWavelets庫的安裝與使用

PyWavelets庫是一個Python小波變換庫,安裝PyWavelets庫非常簡單,只需要使用pip命令即可:

!pip install PyWavelets

安裝完成後即可引入使用:

import pywt

2. 小波變換的具體實現

小標題1: 小波變換方法

PyWavelets庫中提供了常見小波變換的函數和方法。其中最常用的是dwt(Discrete Wavelet Transform)和idwt(Inverse Discrete Wavelet Transform)方法。分別為小波變換和反變換的函數,可以實現對時間序列信號的分解和重構。下面是一個示例代碼:

import pywt
import numpy as np

signal = np.arange(1, 9, 1)
(ca, cd) = pywt.dwt(signal, 'db1')
print(ca, cd)

輸出結果為:

[3.5 7.5 11.5 15.5],[ -2.82842712 -2.82842712 -2.82842712 -2.82842712]

可以看到,將長度為8的序列分解成了長度為4的低頻部分(即近似分量)和長度為4的高頻部分(即細節分量)。

小標題2: 小波閾值去噪

小波閾值去噪(Wavelet Thresholding Denoising)是小波變換的宏觀應用之一。它的原理是對小波變換後的係數進行閾值處理,減少低信噪比信號中的雜訊,對信號進行平滑處理。示例代碼如下:

import matplotlib.pyplot as plt
import pywt
import numpy as np

# 製造一個含有雜訊的信號
np.random.seed(0)
t = np.linspace(0, 0.6, 601)
s = np.sin(6 * np.pi * t) + np.sin(20 * np.pi * t)
s += 0.1 * np.random.randn(*s.shape)

# 選擇小波基和閾值方式
wavelet = 'sym4'
mode = pywt.Modes.smooth

# 小波閾值去噪
coeffs = pywt.wavedec(s, wavelet, mode=mode)
sigma = np.median(np.abs(coeffs[-1])) / 0.6745
threshold = sigma * np.sqrt(2 * np.log(len(s)))
coeffs = pywt.threshold(coeffs, threshold, mode='soft')
reconstructed_signal = pywt.waverec(coeffs, wavelet, mode=mode)

# 繪圖
plt.figure()
plt.plot(t, s, 'k-', linewidth=1, label='signal')
plt.plot(t, reconstructed_signal, 'r--', linewidth=1, label='reconstructed signal')
plt.legend()
plt.show()

運行代碼後即可得到一幅去雜訊後的損傷信號圖像:

![image.png](attachment:image.png)

小標題3: 小波包分析和特徵提取

小波包分析(Wave Packet Analysis)是小波變換的拓展,可以處理更複雜的斷點情形。小波包分析與數字濾波器組類似,也有高通、低通、帶通等不同的基函數,可以隨意選擇。小波包分析常用於信號特徵提取,可以從含有雜訊的信號中提取出適當的特徵。示例代碼如下:

import pywt
import numpy as np
import matplotlib.pyplot as plt

# 製造含有雜訊的信號
np.random.seed(0)
t = np.linspace(0, 1, 1000, endpoint=False)
sig = np.sin(2 * np.pi * 7 * t) + np.cos(2 * np.pi * 45 * t) + np.random.randn(t.size)

# 小波包分析
wp = pywt.WaveletPacket(sig, 'symmetric', maxlevel=4)
fig, axarr = plt.subplots(nrows=2, ncols=2, figsize=(8, 8))
axarr[0, 0].plot(sig, 'k')
axarr[0, 0].set_title("Signal")
axarr[0, 0].set_xlim(0, 1000)
axarr[0, 1].plot(wp['aa'].data, 'r')
axarr[0, 1].set_title("Approx. coeff.")
axarr[0, 1].set_xlim(0, 1000)
axarr[1, 0].plot(wp['ad'].data, 'g')
axarr[1, 0].set_title("Horiz. coeff.")
axarr[1, 0].set_xlim(0, 1000)
axarr[1, 1].plot(wp['dd'].data, 'b')
axarr[1, 1].set_title("Diag. coeff.")
axarr[1, 1].set_xlim(0, 1000)
plt.tight_layout()
plt.show()

運行代碼後即可得到一幅小波包分析結果圖像:

![image2.png](attachment:image2.png)

結語

通過以上示例代碼,我們可以看到Python在小波變換相關領域中的強大能力。小波變換作為一種全新的分析及方法,正在成為越來越多領域的熱點研究,例如圖像處理、信號處理和行業金融分析等。在實際應用中,需要根據具體問題選擇適合的小波係數和閾值等參數。Python的強大庫和函數,不僅給小波變換的計算帶來了極大的方便,同時也提高了小波變換在應用中的效率和準確性。

原創文章,作者:KWRRX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/366345.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KWRRX的頭像KWRRX
上一篇 2025-04-02 01:28
下一篇 2025-04-02 01:28

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論