python利用小波信号处理,包括读取CSV表格,并将处理后的数据输出至表格(刚开始入门小白制作,以供之后自己改进)

废话不多说,先上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的一些插件方法。更重要的是,明白了再难的问题,只要耐心下来,总是会解决的。时间紧迫,每一周都有新的任务,每次任务完成的较为浅,努力做好,加油!!!!

  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
Python 中,你可以使用 PyWavelets 库来进行小变,并使用信号处理技术来去除基线干扰。下面是一个示例代码,展示了如何实现这个过程: ```python import pandas as pd import numpy as np import pywt import matplotlib.pyplot as plt # 读取 CSV 文件 data = pd.read_csv('your_file.csv') # 获取要去除基线干扰的列数据 column_data = data['column_name'] # 替换 'column_name' 为你的列名称 # 进行小变换 wavelet = 'db4' # 小函数名称,可以根据需要修改 coeffs = pywt.wavedec(column_data, wavelet) # 去除基线干扰(通过将第一层系数设为0) coeffs[0] = np.zeros_like(coeffs[0]) # 重构信号 baseline_removed = pywt.waverec(coeffs, wavelet) # 绘制对比图 plt.figure(figsize=(10, 5)) # 原始数据 plt.subplot(2, 1, 1) plt.plot(column_data) plt.title('Original Data') plt.xlabel('Index') plt.ylabel('Value') # 去除基线干扰后的数据 plt.subplot(2, 1, 2) plt.plot(baseline_removed) plt.title('Baseline Removed Data') plt.xlabel('Index') plt.ylabel('Value') # 调整子图之间的间距 plt.tight_layout() # 显示图形 plt.show() ``` 在这个示例中,我们假设你的 CSV 文件包含多列数据,其中你想要处理的列被称为 'column_name'。你可以根据实际情况修改代码中的文件路径和列名称。 代码中使用了 `pywt.wavedec()` 函数进行小变换,并通过将第一层系数设为零来去除基线干扰。然后,我们使用 `pywt.waverec()` 函数重构信号。最后,我们使用 `matplotlib.pyplot` 库来创建一个包含两个子图的图形窗口,分别显示原始数据和去除基线干扰后的数据。最后,我们使用 `plt.show()` 函数显示图形。 需要注意的是,这只是一个基本的示例代码,你可能需要根据你的具体需求进行修改和调整。同时,你可能需要导入所需的库(如 pandas、numpy、pywt 和 matplotlib)来运行这段代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值