基于频谱处理的音频分离方法

基于频谱处理的音频分离方法

在音频处理领域,音频分离是一个重要的任务,尤其是在语音识别、音乐制作和通信等应用中。音频分离的目标是从混合信号中提取出单独的音频源。通过频谱处理进行音频分离是一种有效的方法,本文将介绍其基本原理、公式以及如何通过降噪作为一个具体的例子来实现音频分离。

1. 频谱处理音频分离的原理

频谱处理音频分离的基本思想是将音频信号从时间域转换到频率域,通过分析频谱中的成分,去除或抑制不需要的成分,从而恢复目标音频信号。常用的频谱分析方法是短时傅里叶变换(STFT)。

1.1 短时傅里叶变换(STFT)

短时傅里叶变换将时间域信号分成多个短时间段,并对每个段进行傅里叶变换。对于离散时间信号 (x[n]),STFT 的离散形式可以表示为:

X [ m , k ] = ∑ n = − ∞ ∞ x [ n ] w [ n − m ] e − j 2 π N k n X[m, k] = \sum_{n=-\infty}^{\infty} x[n] w[n - m] e^{-j \frac{2\pi}{N}kn} X[m,k]=n=x[n]w[nm]ejN2πkn

其中:

  • X [ m , k ] X[m, k] X[m,k] 是在时间帧 (m) 和频率 (k) 的复数频谱。
  • x [ n ] x[n] x[n] 是输入信号。
  • w [ n ] w[n] w[n] 是窗函数,用于限制信号的时间范围。
  • N N N是窗的长度。

1.2 逆短时傅里叶变换(ISTFT)

逆短时傅里叶变换用于将频谱信息转换回时间域信号。对于离散时间信号,ISTFT 的离散形式可以表示为:

x [ n ] = ∑ m = − ∞ ∞ X [ m , k ] w [ n − m ] e j 2 π N k n x[n] = \sum_{m=-\infty}^{\infty} X[m, k] w[n - m] e^{j \frac{2\pi}{N}kn} x[n]=m=X[m,k]w[nm]ejN2πkn

其中:

  • x [ n ] x[n] x[n] 是恢复后的离散时间信号。
  • X [ m , k ] X[m, k] X[m,k]是去噪后的频谱。

1.3 音频分离算法

在频谱域中,音频分离的基本步骤如下:

  1. 计算 STFT:对混合信号(包含多个音源)进行 STFT,得到频谱表示。
  2. 源信号估计:通过分析混合信号的频谱,估计各个源信号的频谱成分。
  3. 频谱相减或掩码:从混合信号的频谱中减去或应用掩码来提取目标音源的频谱。
  4. 逆 STFT:对提取后的频谱进行逆 STFT,恢复到时间域信号。

2. 降噪作为音频分离的例子

降噪是音频分离中的一个具体应用场景。在降噪过程中,我们的目标是从包含噪声的混合信号中提取出干净的音频信号。降噪的基本步骤如下:

2.1 完全降噪

在完全降噪的情况下,我们假设噪声的频谱可以被准确估计并完全从混合信号中去除。此时,频谱相减的公式为:

Y ( f ) = X ( f ) − N ( f ) Y(f) = X(f) - N(f) Y(f)=X(f)N(f)

在这种情况下,重建的音频信号将尽可能接近原始的干净信号。

2.2 不完全降噪

在不完全降噪的情况下,噪声的频谱可能无法完全准确地估计,或者在去噪过程中可能会对语音信号造成一定的抑制。此时,我们可以引入一个随机因子来模拟这种情况:

Y ( f ) = X ( f ) − N ( f ) ⋅ factor Y(f) = X(f) - N(f) \cdot \text{factor} Y(f)=X(f)N(f)factor

其中,factor 是一个在 0.8 到 1.2 之间的随机值。这个因子可以模拟噪声没有完全消除的情况,或者在去噪过程中对语音信号的抑制。
在这里插入图片描述
在这里插入图片描述

3. 代码实现

import numpy as np
import librosa
import matplotlib.pyplot as plt
import soundfile as sf
import librosa.display# 1. 读取两个文件并进行时域混合
def load_and_mix(audio_file, noise_file, duration):audio, sr_audio = librosa.load(audio_file, sr=None)noise, sr_noise = librosa.load(noise_file, sr=None)if sr_audio != sr_noise:raise ValueError("Sampling rates of the audio and noise files must be the same.")min_length = min(len(audio), len(noise), duration * sr_audio)audio = audio[:min_length]noise = noise[:min_length]mixed_signal = audio + noisereturn audio, noise, mixed_signal, sr_audio# 2. 计算 STFT
def compute_stft(signal):return librosa.stft(signal)# 3. 计算噪声的 STFT
def compute_noise_stft(noise):return librosa.stft(noise)# 4. 频谱相减
def subtract_stft(mixed_stft, noise_stft, factor):return mixed_stft - (noise_stft * factor)# 5. ISTFT 重新生成语音
def reconstruct_audio(subtracted_stft):return librosa.istft(subtracted_stft)# 6. 可视化过程
def visualize_process(original, noise, mixed, reconstructed_best, reconstructed_partial, sr):plt.figure(figsize=(12, 10))plt.subplot(5, 1, 1)plt.title('Original Audio Signal')librosa.display.waveshow(original, sr=sr, alpha=1)plt.xlabel('Time (s)')plt.ylabel('Amplitude')plt.subplot(5, 1, 2)plt.title('Noise Signal')librosa.display.waveshow(noise, sr=sr, alpha=1)plt.xlabel('Time (s)')plt.ylabel('Amplitude')plt.subplot(5, 1, 3)plt.title('Mixed Audio Signal')librosa.display.waveshow(mixed, sr=sr, alpha=1)plt.xlabel('Time (s)')plt.ylabel('Amplitude')plt.subplot(5, 1, 4)plt.title('Reconstructed Audio Signal (Best Case)')librosa.display.waveshow(reconstructed_best, sr=sr, alpha=1)plt.xlabel('Time (s)')plt.ylabel('Amplitude')plt.subplot(5, 1, 5)plt.title('Reconstructed Audio Signal (Partial Case)')librosa.display.waveshow(reconstructed_partial, sr=sr, alpha=1)plt.xlabel('Time (s)')plt.ylabel('Amplitude')plt.tight_layout()plt.show()# 绘制语谱图plt.figure(figsize=(12, 10))original_stft = compute_stft(original)noise_stft = compute_noise_stft(noise)mixed_stft = compute_stft(mixed)reconstructed_best_stft = compute_stft(reconstructed_best)reconstructed_partial_stft = compute_stft(reconstructed_partial)plt.subplot(5, 1, 1)plt.title('Original Audio Spectrogram')librosa.display.specshow(librosa.amplitude_to_db(np.abs(original_stft), ref=np.max), sr=sr, y_axis='log', x_axis='time')plt.colorbar(format='%+2.0f dB')plt.subplot(5, 1, 2)plt.title('Noise Spectrogram')librosa.display.specshow(librosa.amplitude_to_db(np.abs(noise_stft), ref=np.max), sr=sr, y_axis='log', x_axis='time')plt.colorbar(format='%+2.0f dB')plt.subplot(5, 1, 3)plt.title('Mixed Audio Spectrogram')librosa.display.specshow(librosa.amplitude_to_db(np.abs(mixed_stft), ref=np.max), sr=sr, y_axis='log', x_axis='time')plt.colorbar(format='%+2.0f dB')plt.subplot(5, 1, 4)plt.title('Reconstructed Audio Spectrogram (Best Case)')librosa.display.specshow(librosa.amplitude_to_db(np.abs(reconstructed_best_stft), ref=np.max), sr=sr, y_axis='log', x_axis='time')plt.colorbar(format='%+2.0f dB')plt.subplot(5, 1, 5)plt.title('Reconstructed Audio Spectrogram (Partial Case)')librosa.display.specshow(librosa.amplitude_to_db(np.abs(reconstructed_partial_stft), ref=np.max), sr=sr, y_axis='log', x_axis='time')plt.colorbar(format='%+2.0f dB')plt.tight_layout()plt.show()# 主程序
def main():audio_file = '1.wav'  # 语音文件noise_file = '3.wav'  # 噪声文件duration = 20  # 取样长度(秒)original_audio, noise, mixed_signal, sr = load_and_mix(audio_file, noise_file, duration)mixed_stft = compute_stft(mixed_signal)noise_stft = compute_noise_stft(noise)# 完全降噪subtracted_stft_best = subtract_stft(mixed_stft, noise_stft, factor=np.ones_like(noise_stft))reconstructed_best_audio = reconstruct_audio(subtracted_stft_best)# 不完全降噪random_factor = np.random.uniform(0.8, 1.2, noise_stft.shape)subtracted_stft_partial = subtract_stft(mixed_stft, noise_stft, factor=random_factor)reconstructed_partial_audio = reconstruct_audio(subtracted_stft_partial)sf.write('mixed_signal.wav', mixed_signal, sr)sf.write('reconstructed_audio_best.wav', reconstructed_best_audio, sr)sf.write('reconstructed_audio_partial.wav', reconstructed_partial_audio, sr)visualize_process(original_audio, noise, mixed_signal, reconstructed_best_audio, reconstructed_partial_audio, sr)if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483843.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML旋转爱心

系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心(双心版)1…

查看 tomcat信息 jconsole.exe

Where is the jconsole.exe? location: JDK/bin/jconsole.exe

设计模式10:观察者模式(订阅-发布)

系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 参考:简说设计模式——工厂方法模式 - JAdam - 博客园 参考:简单工厂模式(Simple Factory Pattern) - 回忆酿的甜 - 博客园 一:概述 观察者模式&#xff0…

AIGC 时代的文学:变革与坚守

目录 一.AIGC 带来的文学变革 1.创作方式的改变 2.阅读体验的升级 3.文学市场的重塑 二.文学在 AIGC 时代的坚守 1.人类情感的表达 2.文学的艺术性 3.文学的社会责任 三.AIGC 与人类作家的共生之路 1.相互学习 2.合作创作 3.共同发展 另: 总结 随着人…

Wwise 使用MIDI文件、采样音频

第一种:当采样音频只有一个文件的时候 1.拖入MIDI文件到Interactive Music Hierarchy层级 2.拖入采样音频到Actor-Mixer Hierarchy层级 3.勾选MIDI显示出面板,设置Root Note与采样音频音高相同,这里是C#5 4.播放测试,成功&…

【计算机网络】实验9: 路由信息协议RIP

实验9 路由信息协议RIP 一、实验目的 本实验的主要目的是深入理解RIP(路由信息协议)的工作原理,以便掌握其在网络中的应用。通过对RIP的学习,我们将探讨该协议如何实现路由选择和信息传播,从而确保数据包能够在网络中…

python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250+个项目、26.6GB)

文章目录 源代码下载地址项目介绍预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250个项目、26.6GB) 预览 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情…

深入理解AVL树:结构、旋转及C++实现

1. AVL树的概念 什么是AVL树? AVL树是一种自平衡的二叉搜索树,其发明者是Adelson-Velsky和Landis,因此得名“AVL”。AVL树是首个自平衡二叉搜索树,通过对树的平衡因子进行控制,确保任何节点的左右子树高度差最多为1&…

spark-sql配置教程

1.前期准备 (1)首先要把hadoop集群,hive和spark等配置好 hadoop集群,hive的配置可以看看这个博主写的博客 大数据_蓝净云的博客-CSDN博客 或者看看黑马程序员的视频 黑马程序员大数据入门到实战教程,大数据开发必…

Git分布式版本控制工具 Git基本概念、Git工作流程、Git常用命令、Git远程仓库、IDEA操作Git

目录 ​​​​​​ 1.Git基本概念 1.1 概述 1.1.1 开发中的实际场景 1.1.2 版本控制器的方式 1.1.2.1 集中式版本控制工具(SVN) 1.1.2.2 分布式版本控制工具(Git) 2.概述git工作流程 3.Git常用命令 3.1 Git环境配置 3.1.1 下载与安装 3.1.2 基本配置 3.1.3 为常用指令配置别名&…

“停车费“ 在英语中常见的表达方式,柯桥职场英语生活口语商务英语学习

“停车费”用英语怎么说? "停车费" 在英语中有多种表达方式,最常见的是: Parking fee: 这是最直接的翻译,用于各种停车场、路边停车等情况。 Parking c15857575#376harge: 与 parking fee 意思相近,但有时更…

第31天:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

时间轴: 演示案例: 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 打包器-WebPack-使用&安全 参考:https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源…

Redis使用场景-缓存-缓存雪崩

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题,其中缓存穿透、击穿、雪崩在面试中问的最频繁,本文加了图解,希望帮助你更直观的了解缓存雪崩😀 (放出之前写的针对实习面试的关于Redis生产问题的博…

【SARL】单智能体强化学习(Single-Agent Reinforcement Learning)《纲要》

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…

高通---Camera调试流程及常见问题分析

文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中,经常会遇到各种状况,本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…

JAVA |日常开发中Servlet详解

JAVA |日常开发中Servlet详解 前言一、Servlet 概述1.1 定义1.2 历史背景 二、Servlet 的生命周期2.1 加载和实例化2.2 初始化(init 方法)2.3 服务(service 方法)2.4 销毁(destroy 方法) 三、Se…

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型?socket有哪些类型? 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手(非常详细) socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样…

JavaScript 键盘控制移动

如果你想通过 JavaScript 实现键盘控制对象&#xff08;比如一个方块&#xff09;的移动&#xff0c;下面是一个简单的示例&#xff0c;展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS&#xff1a; <!DOCTYPE html> <html lang"en">…

图解SSL/TLS 建立加密通道的过程

众所周知&#xff0c;HTTPS 是 HTTP 安全版&#xff0c;HTTP 的数据以明文形式传输&#xff0c;而 HTTPS 使用 SSL/TLS 协议对数据进行加密&#xff0c;确保数据在传输过程中的安全。 那么&#xff0c;HTTPS 是如何做到数据加密的呢&#xff1f;这就需要了解 SSL/TLS 协议了。 …

自动化立体仓库项目任务调度系统中任务流程可视化实现

在运维自动化平台中,任务系统无疑是最核心的组成部分之一。它承担着所有打包编译、项目上线、日常维护等运维任务的执行。通过任务系统,我们能够灵活地构建满足不同需求的自定义任务流。早期的任务流后端采用了类似列表的存储结构,根据任务流内子任务的排序依次执行,尽管通…