音频去噪:使用Python和FFT增强音质

server/2024/9/24 7:20:28/

根据定义,声音去噪是从音频信号中去除不需要的噪音或干扰,以提高其质量和清晰度的过程。这涉及识别和隔离噪音成分(通常以不规则或高频元素为特征),并将其过滤掉,同时保持原始声音的完整性。

声音去噪目标是改善聆听体验以及音频分析和处理的准确性。过滤掉噪音对于高保真音频来说非常重要,不仅是为了聆听,也是为了创建某些机器学习任务的数据集。

理想情况下,去噪应该是数据清理步骤中的一部分。

理解FFT

我们从实际的例子开始,在派对上房间里充满了各种声音:人们在说话,音乐在播放,玻璃杯在碰撞。在所有的噪音中,很难专注于我们对话说的声音。

我们可以把FFT(快速傅里叶变换)想想成一个一副神奇的眼镜,它可以让你能够看到房间里的每种声音都有不同的颜色。戴上这副眼镜,你就可以在所有其他声音中轻松识别出你朋友的声音(一种特定的颜色)。这样就可以过滤掉其他分散注意力的声音(颜色),只专注于你朋友的声音。

**FFT(快速傅里叶变换)**是一种强大的工具,它将信号从原始的时域转换到频域。通过分析信号的频率成分,我们可以识别并去除不需要的噪音,从而提高原始声音的质量。

加载声音信号

在这个例子中,我们不会从本地或在线加载音频信号,而是使用NumPy创建我们自己的简单正弦信号

 importnumpyasnp  importmatplotlib.pyplotaspltdefgenerate_signal(length, freq):  """生成一个正弦信号。参数:  length: 信号的长度。 freq: 信号的频率。返回:  表示信号的numpy数组。 """  t=np.linspace(0, 1, length)  signal=np.sin(2*np.pi*freq*t)  returnsignal

在创建声音信号后,让我们使用NumPy中的随机函数向信号添加噪音。

 defadd_noise(signal, noise_level):  """向信号添加噪音。参数:  signal: 原始信号。 noise_level: 要添加的噪音水平。返回:  表示带噪信号的numpy数组。 """  noise=np.random.normal(0, noise_level, len(signal))  noisy_signal=signal+noise  returnnoisy_signal

对信号应用FFT

 defdenoise_fft(noisy_signal, threshold):  """使用FFT对信号进行去噪。参数:  noisy_signal: 带噪信号。 threshold: 用于过滤频率成分的阈值。返回:  表示去噪后信号的numpy数组。 """  fft_signal=np.fft.fft(noisy_signal)  fft_signal[np.abs(fft_signal) <threshold] =0  denoised_signal=np.real(np.fft.ifft(fft_signal))  returndenoised_signal

在频域中识别噪音

 fft_signal[np.abs(fft_signal) <threshold] =0  denoised_signal=np.real(np.fft.ifft(fft_signal))

在上面的代码中,这一步帮助我们在频域中识别噪音

过滤噪音并转换回时域

通过设置阈值,我们过滤掉噪音。将幅度低于某个阈值的频率成分设置为零。这从信号中去除了低幅度(噪音)频率。

比较原始信号和去噪后的信号

 if__name__=="__main__":  # 生成信号  signal_length=1024  signal_freq=50  signal=generate_signal(signal_length, signal_freq)# 添加噪音  noise_level=0.5  noisy_signal=add_noise(signal, noise_level)# 使用FFT去噪  threshold=100  denoised_signal=denoise_fft(noisy_signal, threshold)# 绘制结果  plt.figure(figsize=(12, 6))  plt.subplot(311)  plt.plot(signal, label='Original Signal')  plt.legend()  plt.subplot(312)  plt.plot(noisy_signal, label='Noisy Signal')  plt.legend()  plt.subplot(313)  plt.plot(denoised_signal, label='Denoised Signal')  plt.legend()  plt.tight_layout()  plt.show()

使用Matplotlib绘制一些带噪信号和去噪信号之间的比较图。

A)原始信号 B)带噪信号 C)去噪后的信号

总结

本文我们探讨了如何使用快速傅里叶变换(FFT)对声音信号进行去噪。FFT是一种强大的工具,它将信号从原始的时域转换到频域。通过分析信号的频率成分,我们可以识别并去除不需要的噪音,从而提高原始声音的质量。

主要的步骤如下:

加载声音信号: 我们将从使用NumPy加载一个带噪的声音信号开始。

应用FFT: 使用FFT,我们将时域信号转换为频域。这让我们能够看到构成信号的不同频率成分。

识别和过滤噪音: 在频域中,噪音通常表现为高频成分或不属于原始信号的尖峰。通过识别和过滤掉这些不需要的频率,我们可以减少噪音。

本文的代码:

https://avoid.overfit.cn/post/d536ed94e2d74cbf8e73a4ea06ec6cec

作者:Prerak Joshi


http://www.ppmy.cn/server/101808.html

相关文章

JQ8900-16P与stm32最小板连线图

JQ8900-16P与stm32最小板连线图 B战演示连线视频 接线图和原理讲解_哔哩哔哩_bilibili 原理图 jq8900实物对照: 面包板实物链接图:

08 STM32 DMA

DMA 协助CPU&#xff0c;完成数据转运工作。 两个程序&#xff1a; DMA数据转运&#xff0c;DMAAD多通道 DMA数据转运&#xff0c;将使用DMA&#xff0c;进行存储器到存储器的数据转运&#xff0c;也就是把一个数组里面的数据&#xff0c;复制到另一个数组里。 定义一个数组D…

大数据开发工程师面试整理-什么是大数据?

大数据是指无法通过传统的数据处理工具或方法来捕捉、管理和处理的海量数据集。通常,大数据具有以下几个关键特征,常被称为大数据的“5V”特性: 1. Volume(数据量): ● 大数据的最明显特征是其数据量非常大,通常以TB(TeraBytes,兆兆字节)甚至PB(PetaBytes,千万亿字…

Docker:宿主机可以ping通外网,docker容器内无法ping通外网之解决方法

问题描述 1、宿主机可以ping外网&#xff0c;docker容器内无法ping外网 ping www.baidu.com 提示&#xff1a;unknown host baidu.com 2、宿主机可以wget下载&#xff0c;docker容器内无法wget下载 wget www.baidu.com 提示&#xff1a;unknown host baidu.com 解决方法 1、…

Springboot实现doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频在线预览功能,你学“废”了吗?

最近工作中&#xff0c;客户需要生成包含动态内容的word/pdf报告&#xff0c;并且需要在线预览。 刚开始使用后台直接生成word文档&#xff0c;返回文件流给前端&#xff0c;浏览器预览会发生格式错乱问题&#xff0c;特别是文档中的图片有些还不显示。 想到最简单的办法就是…

瑞吉外卖后续笔记

Git学习 下载地址 Githttps://git-scm.com/ 常用的git代码托管服务 git常用命令 Git 全局设置: git config --global user.name "刘某人" git config --global user.email "邮箱号" 查看配置 git config --list git add 文件名 添加到暂冲区 git a…

Stable Diffusion绘画 | ControlNet应用-Scribble (涂鸦)

Scribble (涂鸦) 使用该算法生成的线稿&#xff0c;线条最粗最随意&#xff0c;常用于抓取画面的大体轮廓&#xff0c;让AI进行创意发挥。 提示词输入 a panda&#xff0c;生成图片如下&#xff1a; 将提示词换成 a dog&#xff0c;生成图片如下&#xff1a; 今天先分享到这里…

Connection reset by peer报错解决

问题描述 Connection reset by peeres服务时不时会出现以上报错&#xff0c;经过一段时间排查&#xff0c;最终确定了报错原因 问题分析 1、TCP Keepalive: TCP Keepalive 是一种用于检测死连接&#xff08;即那些已经没有数据传输但仍然在连接状态中的连接&#xff09;的机制…