ウェーブレット変換 + python

ウェーブレット変換

フーリエ変換—>短時間フーリエ変換—>ウェーブレット変換
フーリエ変換は信号の周波数スペクトルを分析できますが、非定常プロセス (周波数が時間とともに変化する非定常信号) には限界があります。
短時間フーリエ変換は、時間領域のプロセス全体を同じ長さの無数の小さなプロセスに分解し、それぞれの小さなプロセスはほぼ安定しており、フーリエ変換後は、どの時点でどの周波数が現れるかがわかります。ただし、STFT ウィンドウが長すぎたり短すぎたりすると、問題が発生します.ウィンドウが狭すぎると、ウィンドウ内の信号が短すぎて、周波数分析が不正確になり、周波数分解能が低下します.ウィンドウが長すぎると、幅が広く、時間領域が十分に細かくなく、時間分解能が低い。非定常信号変化の周波数要件を満たすことができないため、
ウェーブレット変換は、フーリエ変換の無限に長い三角関数基底を、周波数を取得できるだけでなく時間も特定できる有限に長い減衰ウェーブレット基底に直接置き換えます。

1. 連続ウェーブレット変換

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

path = 'E:\AudioClassification-Pytorch-master\mel/audio/1_001-200.wav'
y, sr = librosa.load(path, sr=16000)
wavename = 'morl'
totalscal = 4  # totalscal是对信号进行小波变换时所用尺度序列的长度(通常需要预先设定好)
fc = pywt.central_frequency(wavename)  # 计算小波函数的中心频率
cparam = 2 * fc * totalscal  # 常数c
scales = cparam / np.arange(totalscal, 1, -1)  # 为使转换后的频率序列是一等差序列,尺度序列必须取为这一形式(也即小波尺度)
[cwtmatr, frequencies] = pywt.cwt(y, scales, wavename, 1.0 / sr)
t = np.arange(0, y.shape[0]/sr, 1.0/sr)
plt.contourf(t, frequencies, abs(cwtmatr))
plt.ylabel(u"freq(Hz)")
plt.xlabel(u"time(s)")
plt.subplots_adjust(hspace=0.4)  # 调整边距和子图的间距 hspace为子图之间的空间保留的高度,平均轴高度的一部分
plt.title = ("小波时频图")
plt.show()

totalscal=4 の場合のウェーブレット時間-周波数図と
ここに画像の説明を挿入
totalscal=256 の場合の時間-周波数図から、ウェーブレット変換スケールのサイズが時間-周波数図
ここに画像の説明を挿入
与える影響が比較的大きいことがわかります。
ウェーブレット変換をニューラル ネットワークに追加して、トレーニング ワードを使用できるようにします

wavename = 'morl'
totalscal = 256
fc = pywt.central_frequency(wavename)  # 计算小波函数的中心频率
cparam = 2 * fc * totalscal  # 常数c
scales = cparam / np.arange(totalscal, 1, -1)  # 为使转换后的频率序列是一等差序列,尺度序列必须取为这一形式(也即小波尺度)
[cwtmatr, frequencies] = pywt.cwt(y, scales, wavename, 1.0 / sr)
features = np.array(cwtmatr)
mean = np.mean(features, 0, keepdims=True)
std = np.std(features, 0, keepdims=True)
features = (features - mean) / (std + 1e-5)
features = features.astype('float32')

2. 離散ウェーブレット変換

おすすめ

転載: blog.csdn.net/weixin_48983346/article/details/126543551