小波变换+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时的小波时频图
小波变换+python_第1张图片
totalscal=256时的时频图
小波变换+python_第2张图片
可以看出小波变换尺度的大小对于时频图的影响还是比较大的
如果是将连续小波变换提取的特征加入到神经网络进行训练的话可以用

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.离散小波变换

你可能感兴趣的:(python,开发语言,机器学习)