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

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

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

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

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

理解FFT

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

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

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

加载声音信号

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

 importnumpyasnp  
 importmatplotlib.pyplotasplt

 defgenerate_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

目录
相关文章
|
SDN 网络虚拟化 网络架构
在单交换机局域网中,不同网段的主机通信探秘🌐
在理解局域网中不同网段主机之间的通信之前,我们首先要明白网络的基本组成和工作原理。局域网(LAN)是一个封闭的网络环境,通常由交换机(Switch)作为核心设备连接网络中的各个主机。当我们谈论不同网段的主机时,实质上是在讨论它们配置的IP地址属于不同的IP地址范围。现在,**假设我们有两台主机(主机A和主机B),它们连接到同一个交换机,但配置在不同的网段上。问题来了:这两台主机能够直接通信吗**?🤔
在单交换机局域网中,不同网段的主机通信探秘🌐
|
9月前
|
存储 人工智能 文字识别
医疗病历结构化处理系统技术白皮书——基于多模态AI的医联体数据治理方案
本系统基于双端协同架构,集成移动端OCR识别与云端数据分析,实现医疗文档高效结构化处理。采用PaddleOCR轻量引擎与隐私计算技术,支持离线识别与敏感信息脱敏。后端构建分布式数据仓库与多租户机制,满足PB级存储与数据安全合规要求。实测OCR准确率达96.2%(印刷体)与88.7%(手写体),字段抽取F1值92.4%,显著提升病历处理效率与质量。
880 3
|
人工智能 自然语言处理 数据可视化
DeepSeek使用终极指南:解锁国产大模型的隐藏实力
DeepSeek作为国产大语言模型的佼佼者,支持多模态交互,在编码、数学和逻辑推理等方面表现卓越。本文从基础操作到进阶技巧全面解析其高效使用方法,涵盖精准提问法则、文件交互技巧、高级指令应用等,并提供智能客服、数据分析、教育培训等典型场景实战案例。同时提醒用户注意提问禁忌与安全规范,帮助开发者和普通用户充分挖掘DeepSeek的潜能,提升工作效率,探索智能解决方案。
1081 0
|
算法 Python
语音去噪 python 传统算法
7月更文挑战第14天
557 1
|
Python
Python音频处理-图解傅里叶分析
傅里叶分析是一种将函数表示为周期成分之和的方法,并通过离散傅里叶变换(DFT)将信号从时域转换到频域,提取频率特征。通过快速傅里叶变换(FFT),我们可分析方波的主要频率成分,并利用这些成分重建波形,直观展示频率域对原始信号的影响。
311 0
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
771 15
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
815 8
|
机器学习/深度学习 算法 大数据
深度学习在医疗影像诊断中的应用
本文探讨了深度学习技术在医疗影像诊断领域的应用,分析了其如何通过提高图像识别精度来辅助医生做出更准确的诊断。文章首先介绍了深度学习的基本概念和关键技术,随后详细阐述了这些技术在处理复杂医疗影像数据时的优势,并通过案例分析展示了深度学习在实际应用中取得的成果。此外,还讨论了当前面临的挑战以及未来的发展趋势。
HTML+CSS+JS实现十款好看的登录注册界面模板,赶紧收藏起来吧!(一)
HTML+CSS+JS实现十款好看的登录注册界面模板,赶紧收藏起来吧!
|
JSON 自然语言处理 数据处理
数据标注工具 Label-Studio
数据标注工具 Label-Studio
6964 0