admin 管理员组文章数量: 1086865
机枪声音信号去噪
from scipy.io import wavfile
import numpy as np
import matplotlib.pyplot as plt
import cv2
sample_rate,sig = wavfile.read('D:/YCC/5a8bf6d9/NoiseX-92/machinegun.wav')
# 干净的信号
sig = np.array(sig,dtype=np.float32)
# 归一化到[0-1]
sig = sig / np.max(sig)
ss = cv2.blur(sig,(1,3)) #均值滤波器plt.subplot(121)
plt.plot(sig[1000:10000])
plt.subplot(122)
plt.plot(ss[1000:10000])
plt.show()
from scipy.io import wavfile
import numpy as np
import matplotlib.pyplot as plt
import cv2
# 读取音频文件
sample_rate, sig = wavfile.read('D:/YCC/5a8bf6d9/NoiseX-92/machinegun.wav')
# 将信号转换为浮点型并归一化
sig = np.array(sig, dtype=np.float32)
sig = sig / np.max(sig)
# 对信号进行平滑滤波
smoothed_sig = cv2.blur(sig, (1, 3)) #均值滤波器
# 绘制原始信号和滤波后的信号
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
# 绘制原始信号子图
ax1.plot(sig[1000:10000])
ax1.set_title('原始信号')
ax1.set_xlabel('样本点序号')
ax1.set_ylabel('幅值')
# 在原始信号子图下方添加文字说明
ax1.text(0.5, -0.1, '原始信号', ha='center', transform=ax1.transAxes)
# 绘制滤波后的信号子图
ax2.plot(smoothed_sig[1000:10000])
ax2.set_title('去噪后信号')
ax2.set_xlabel('样本点序号')
ax2.set_ylabel('幅值')
# 在滤波后的信号子图下方添加文字说明
ax2.text(0.5, -0.1, '去噪后信号', ha='center', transform=ax2.transAxes)
# 显示图像
plt.show()
小波去噪:
未归一化处理代码
import pywt
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
# 定义小波去噪函数
def wavelet_noising(data):# 选用Daubechies8小波基函数wavelet = 'db8'# 分解层数level = 5# 小波分解coeffs = pywt.wavedec(data, wavelet, level=level)# 高频系数置零for i in range(1, len(coeffs)):coeffs[i] *= 0# 重构信号data_denoising = pywt.waverec(coeffs, wavelet)return data_denoising# 读取.wav文件
sample_rate, data = wavfile.read('D:/YCC/5a8bf6d9/NoiseX-92/machinegun.wav')
# 对数据进行小波去噪
data_denoising = wavelet_noising(data)
# 绘制原始数据和去噪后的数据
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(data)
plt.title('Original Data')
plt.xlim(1000, 10000) # 设置横坐标的范围
plt.subplot(2, 1, 2)
plt.plot(data_denoising)
plt.title('Data after Wavelet Denoising')
plt.xlim(1000, 10000) # 设置横坐标的范围
#调整子图之间的间距
plt.tight_layout()
plt.show()
对原始数据进行归一化处理代码
对原始数据进行归一化处理代码# 导入必要的库
import pywt
import matplotlib.pyplot as plt
from scipy.io import wavfile# 定义小波去噪函数
def wavelet_noising(data):# 选用Daubechies8小波基函数wavelet = 'db8'# 分解层数level = 5# 小波分解coeffs = pywt.wavedec(data, wavelet, level=level)# 高频系数置零for i in range(1, len(coeffs)):coeffs[i] *= 0# 重构信号data_denoising = pywt.waverec(coeffs, wavelet)return data_denoising# 读取.wav文件
sample_rate, data = wavfile.read('D:/YCC/5a8bf6d9/NoiseX-92/machinegun.wav')# 对原信号进行归一化处理
data_normalized = data / (2 ** 15)# 对归一化后的信号进行小波去噪
data_denoising = wavelet_noising(data_normalized)# 绘制原始数据和去噪后的数据的图像
plt.figure(figsize=(10, 6))# 绘制原始数据的子图
plt.subplot(2, 1, 1)
plt.plot(data_normalized)
plt.title('Normalized Data')
plt.xlim(1000, 10000) # 设置横坐标的范围# 绘制去噪后的数据的子图
plt.subplot(2, 1, 2)
plt.plot(data_denoising)
plt.title('Data after Wavelet Denoising')
plt.xlim(1000, 10000) # 设置横坐标的范围# 调整子图之间的间距
plt.tight_layout()# 显示图像
plt.show()
1、这段代码的作用是读取一个.wav文件,对文件中的数据进行小波去噪,并绘制原始数据和去噪后的数据的图像。 2、运行结果得到两幅图,为什么纵坐标由180变成160了?因为代码中使用了plt.tight_layout()函数来调整子图之间的间距。该函数会自动调整子图之间的间距,以使子图之间的距离更加合适。在调整子图之间的间距时,该函数会根据子图的大小和位置来计算间距的大小。因此,当你的子图大小和位置发生变化时,间距的大小也会发生变化。当将横坐标的范围改为1000到10000的区间时,子图的大小和位置发生了变化,因此间距的大小也发生了变化。这就导致了纵坐标的刻度发生了变化。如果想保持纵坐标的刻度不变,可以在调整子图之间的间距之前设置纵坐标的刻度范围。plt.ylim(-180, 180) # 设置纵坐标的刻度范围、
3、# 高频系数置零 for i in range(1, len(coeffs)):coeffs[i] *= 0
这段代码的作用是将小波分解后的高频系数置零。具体来说,小波分解会将原始信号分解成多个尺度的小波系数,其中高频系数代表信号的高频部分,低频系数代表信号的低频部分。在小波去噪中,我们通常将高频系数置零,以去除信号中的高频噪声。在这段代码中,我们使用了一个for循环来遍历小波系数列表coeffs中的所有元素,从而将除了第一个元素以外的所有元素乘以0,即将高频系数置零。注意,第一个元素代表的是信号的低频部分,因此不需要将其置零。
#在代码中,没有对低频噪声进行处理。如果你的信号中存在低频噪声,可以使用低通滤波器将其去除。低通滤波器可以将信号中的高频部分去除,从而保留信号中的低频部分。在Python中,可以使用scipy库中的signal模块来实现低通滤波器。具体来说,可以使用以下代码来实现一个一阶低通滤波器:
from scipy import signal# 设计一个一阶低通滤波器
b, a = signal.butter(1, 0.1, 'low')# 对信号进行滤波
data_filtered = signal.filtfilt(b, a, data)
其中,signal.butter()函数用于设计一个一阶低通滤波器,其参数说明如下:
- N:滤波器的阶数,这里设为1。
- Wn:归一化截止频率,即截止频率除以采样频率的一半。这里设为0.1,表示截止频率为采样频率的1/5。
- btype:滤波器类型,这里设为'low',表示低通滤波器。
signal.filtfilt()函数用于对信号进行滤波,其参数说明如下:
- b:滤波器的分子系数。
- a:滤波器的分母系数。
- x:要滤波的信号。
使用这个函数可以对信号进行前向滤波和反向滤波,从而消除滤波器的相位延迟。最终得到的信号即为滤波后的信号。注意,这里使用的是一阶低通滤波器,如果你的信号中存在较强的高频噪声,可能需要
原始信号的最高峰,经过去噪以后为什么高峰没了?
原始信号的最高峰可能是由于噪声引起的,而小波去噪会将高频噪声去除,因此可能会导致原始信号的最高峰消失。具体来说,小波去噪会将原始信号分解成多个尺度的小波系数,其中高频系数代表信号的高频部分,低频系数代表信号的低频部分。在小波去噪中,我们通常将高频系数置零,以去除信号中的高频噪声。如果原始信号的最高峰恰好是由于高频噪声引起的,那么在小波去噪后,这个最高峰就会被去除。另外,如果你使用的小波基函数不适合你的数据,那么小波去噪也可能会导致信号的某些特征消失。因此,在使用小波去噪时,需要根据数据的特点选择合适的小波基函数和分解层数,以达到最好的去噪效果。
本文标签: 机枪声音信号去噪
版权声明:本文标题:机枪声音信号去噪 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1688083580a177260.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论