废话不多说,先上python代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.fftpack import fft,ifft
import math
import pywt
import csv
from pandas import DataFrame;
data = pd.read_csv('C:/Users/ASUS/Desktop/voice.csv',encoding="gbk")
y_values = np.array(data['signal'])
x_values = np.array(data['0'])
plt.plot(x_values,y_values)
plt.show()
yy=fft(y_values) #快速傅里叶变换
yreal = yy.real # 获取实数部分
yimag = yy.imag # 获取虚数部分
yf=abs(fft(y_values)) # 取模
yf1=abs(fft(y_values))/((len(x_values)/2)) #归一化处理
yf2 = yf1[range(int(len(x_values)/2))] #由于对称性,只取一半区间
xf = np.arange(len(y_values)) # 取频率
xf1 = xf
xf2 = xf[range(int(len(x_values)/2))] #取一半区间
#plt.plot(xf,yf,'r') #显示原始信号的FFT模值
plt.subplot(2, 1, 1)
plt.plot(xf2,yf2,'g')
#plt.show()
#-----------------------分界线-------------------------------------------
w = pywt.Wavelet('sym8')#选用sym8小波
maxlev = pywt.dwt_max_level(len(data), w)#最大分解级别,返回max_level。db.dec_lenx为小波的长度
coeffs = pywt.wavedec(y_values, w, mode='constant',level=maxlev)#分解波,constant是边缘都填充0,不管tensor的内容
threshold = 0.4
#plt.figure()
for i in range(1, len(coeffs)):
coeffs[i] = pywt.threshold(coeffs[i], threshold*max(coeffs[i])) # 将噪声滤波
datarec = pywt.waverec(coeffs, 'sym8') # 将信号进行小波重构
yy1=fft(datarec)
yreal = yy1.real # 获取实数部分
yimag = yy1.imag # 获取虚数部分
yf_1 = abs(fft(datarec)) # 取模
yf1_1 = abs(fft(datarec))/((len(x_values)/2)) #归一化处理
yf2_1 = yf1_1[range(int(len(x_values)/2))] #由于对称性,只取一半区间
xf_1 = np.arange(len(datarec)) # 频率
xf1_1 = xf_1
xf2_1 = xf_1[range(int(len(x_values)/2))] #取一半区间
plt.subplot(2, 1, 2)
plt.plot(xf2_1,yf2_1)
#plt.plot(datarec,'g')
plt.show()
#d = DataFrame(datarec)
#d.to_csv('C:/Users/ASUS/Desktop/data.csv')
df1 = pd.DataFrame(datarec)
df1.to_excel("C:/Users/ASUS/Desktop/output.xlsx")
说说自己遇到的几个问题:
1、data = pd.read_csv(‘C:/Users/ASUS/Desktop/voice.csv’,encoding=“gbk”)读取CSV文件,编码方式为gbk,GBK是中国标准,具体解释见:https://www.cnblogs.com/hehheai/p/6510879.html
data[“列名”]代表那一列的数组,比如data[“signal”]读取的就是signal那一列的所有数据。
2、语法:numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0),
object : 是数组或嵌套的数列
dtype : 是数组元素的数据类型,可选,默认为浮点型
copy : 是设置是否需要复制,默认需要
order : 创建数组的样式,c代表行方向,f代表列方向,a代表任意方向
subok : 默认返回一个基类类型一致的数组
ndmin : 指定生成数组的最小维度
3、xf = np.arange(len(y_values)) # 取频率
这一块和MATLAB有些不同
采样定理知采样频率要大于信号频率2倍
4、
导出为CSV和导出EXCEL方式不同
#d = DataFrame(datarec)
#d.to_csv('C:/Users/ASUS/Desktop/data.csv')
df1 = pd.DataFrame(datarec)
df1.to_excel("C:/Users/ASUS/Desktop/output.xlsx")
5、其他都在代码标注的很清楚
参考网址:
阈值设置:
https://pywavelets.readthedocs.io/en/latest/ref/thresholding-functions.html#pywt.threshold
代码参考:
快速傅里叶变换:
https://blog.csdn.net/qq_39516859/article/details/79766697?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
小波变换去噪:
https://blog.csdn.net/weixin_41322458/article/details/91385984
6、不明白的地方
1、小波的选取
2、小波分解的层数,据说噪音未知一般5-7层
3、小波阈值的选取
7、总结
这次任务总的来说就是在别人的代码基础上,修修改改,小波基础不好,不明白的地方压很多。通过这个任务,稍微的更明白了信号处理的一点知识和python的一些插件方法。更重要的是,明白了再难的问题,只要耐心下来,总是会解决的。时间紧迫,每一周都有新的任务,每次任务完成的较为浅,努力做好,加油!!!!