当前位置: 首页 > news >正文

Python28-7.4 独立成分分析ICA分离混合音频

独立成分分析(Independent Component Analysis,ICA)是一种统计与计算技术,主要用于信号分离,即从多种混合信号中提取出独立的信号源。ICA在处理盲源分离(Blind Source Separation,BSS)问题时尤为有效,如从录音中分离出不同的声音源、从脑电图(EEG)中提取出独立的神经活动信号等。

ICA的基本原理

ICA假设观察到的信号是若干独立信号源线性混合的结果。目标是从这些观察到的信号中恢复出原始的独立信号源。

假设有

个观测信号,这些信号是由 个独立信号源通过一个未知的线性混合矩阵线性组合得到的,即:

ICA的目标是找到一个解混合矩阵

,使得:

其中

是估计的独立成分向量,尽可能接近原始的独立信号源。

ICA的假设条件

  1. 独立性假设:信号源彼此之间相互独立。

  2. 非高斯性假设:独立成分(信号源)遵循非高斯分布。这一假设是ICA区分独立成分的关键。

主要算法

ICA有多种实现算法,其中比较常用的包括:

  1. FastICA:一种迭代算法,通过最大化非高斯性(如负熵)来估计独立成分。

  2. Infomax ICA:基于最大化信息传输的算法,通过最大化信号的熵来实现信号分离。

  3. **JADE (Joint Approximate Diagonalization of Eigen-matrices)**:基于四阶累积量矩阵的联合近似对角化来分离独立成分。

应用领域

  1. 生物医学信号处理:如脑电图(EEG)、心电图(ECG)信号的分离和分析。

  2. 语音信号处理:从混合录音中分离出不同的语音源。

  3. 图像处理:在图像去噪、特征提取等方面应用广泛。

  4. 金融数据分析:用于分离和识别金融时间序列中的独立成分。

优点与局限性

优点

  1. 能够有效地分离出相互独立的信号源。

  2. 适用于各种信号处理领域,应用广泛。

局限性

  1. 对混合矩阵的精确估计要求较高。

  2. 对信号源的独立性和非高斯性有较强的假设,实际应用中可能不完全满足。

  3. 算法复杂度较高,计算量大。

实例

以下是使用Python库Scikit-learn进行ICA分析的一个简单示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import FastICA# 生成混合信号
np.random.seed(0)
time = np.linspace(0, 1, 200)
S1 = np.sin(2 * np.pi * 1 * time)  # 正弦波
S2 = np.sign(np.sin(3 * np.pi * 2 * time))  # 方波
S = np.c_[S1, S2]
S += 0.1 * np.random.normal(size=S.shape)  # 添加噪声# 混合信号
A = np.array([[1, 1], [0.5, 2]])  # 混合矩阵
X = np.dot(S, A.T)  # 观测信号# 使用FastICA进行独立成分分析
ica = FastICA(n_components=2)
S_ = ica.fit_transform(X)  # 估计的信号源
A_ = ica.mixing_  # 估计的混合矩阵# 绘制信号
plt.figure(figsize=(10, 8))plt.subplot(3, 1, 1)
plt.title("Original Signals")
plt.plot(time, S[:, 0], label='Signal 1')
plt.plot(time, S[:, 1], label='Signal 2')
plt.legend()plt.subplot(3, 1, 2)
plt.title("Mixed Signals")
plt.plot(time, X[:, 0], label='Mixed Signal 1')
plt.plot(time, X[:, 1], label='Mixed Signal 2')
plt.legend()plt.subplot(3, 1, 3)
plt.title("ICA Recovered Signals")
plt.plot(time, S_[:, 0], label='Recovered Signal 1')
plt.plot(time, S_[:, 1], label='Recovered Signal 2')
plt.legend()plt.tight_layout()
plt.show()

这段代码将生成三个子图:

  1. 原始信号:显示最初生成的两个独立信号(一个正弦波和一个方波)。

  2. 混合信号:显示通过混合矩阵生成的两个观测信号。

  3. 分离出的信号:显示通过ICA分离出的信号,它们应该与原始信号非常相似。

其中:

  • 原始信号显示了生成的两个独立信号。

  • 混合信号展示了线性组合后的混合信号。

  • 分离出的信号是通过ICA算法分离出的两个独立信号,它们应尽可能接近原始信号。

通过上述代码,可以将混合信号分离成独立的信号源,从而实现信号分离的目的。

我们继续使用网上公开的音乐文件对其进行混合处理后,再使用FastICA进行独立成分分析。

原始音频:

music1(SalmonLikeTheFish - Glacier):

music2(Aitua - Johann Pachelbel - Kanon in D Dur):

由于设置采样按照最短的音频文件进行采样,因此混合后的音频和最终独立成分分析之后的音频都只是3:21的长度。

ICA独立成分分析处理:

import os
import numpy as np
import matplotlib.pyplot as plt
import librosa
import soundfile as sf
from sklearn.decomposition import FastICA# 设置音频文件目录
audio_dir = 'MusicMix'
music1_path = os.path.join(audio_dir, 'music1.wav')
music2_path = os.path.join(audio_dir, 'music2.wav')# 检查音频文件是否存在
if not os.path.exists(music1_path) or not os.path.exists(music2_path):raise FileNotFoundError("请确保所有音频文件已下载并放置在正确的目录中。")# 加载音频文件
music1, sr1 = librosa.load(music1_path, sr=None)
music2, sr2 = librosa.load(music2_path, sr=None)# 确保采样率相同
if sr1 != sr2:raise ValueError("两个音频文件的采样率不同。")# 使两个音频文件具有相同的长度
min_len = min(len(music1), len(music2))
music1 = music1[:min_len]
music2 = music2[:min_len]# 创建混合信号
mix1 = music1 +  music2
mix2 = 0.5 * music1 + music2# 创建混合信号矩阵
X = np.c_[mix1, mix2]# 使用FastICA进行独立成分分析
ica = FastICA(n_components=2, max_iter=1000, tol=0.001)
S_ = ica.fit_transform(X)  # 估计的信号源
A_ = ica.mixing_  # 估计的混合矩阵# 绘制信号
time = np.arange(len(mix1)) / sr1plt.figure(figsize=(10, 8))plt.subplot(3, 1, 1)
plt.title("Original Music Signals")
plt.plot(time, music1, label='Music 1')
plt.plot(time, music2, label='Music 2')
plt.legend()plt.subplot(3, 1, 2)
plt.title("Mixed Music Signals")
plt.plot(time, mix1, label='Mixed Signal 1')
plt.plot(time, mix2, label='Mixed Signal 2')
plt.legend()plt.subplot(3, 1, 3)
plt.title("ICA Recovered Music Signals")
plt.plot(time, S_[:, 0], label='Recovered Signal 1')
plt.plot(time, S_[:, 1], label='Recovered Signal 2')
plt.legend()plt.tight_layout()
plt.show()# 保存混合后的音频信号
sf.write(os.path.join(audio_dir, 'mixed1.wav'), mix1, sr1)
sf.write(os.path.join(audio_dir, 'mixed2.wav'), mix2, sr1)# 保存分离后的音频信号
sf.write(os.path.join(audio_dir, 'recovered1.wav'), S_[:, 0], sr1)
sf.write(os.path.join(audio_dir, 'recovered2.wav'), S_[:, 1], sr1)

波形图输出:

重新分离出的两段音乐:

从以上两个音频的输出可知,ICA成功分离出了两手不同的歌曲,虽然音质回有部分损失。我们实现了将两个音乐信号混合,并使用ICA技术将它们分离回原始的独立信号。关键步骤包括确保采样率一致、对齐音频长度、创建混合信号以及应用ICA算法。结果显示在图表中,并保存为音频文件供进一步分析和使用。这一过程展示了ICA在信号处理中的强大应用,特别是对于混合音频信号的分离。

以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

相关文章:

Python28-7.4 独立成分分析ICA分离混合音频

独立成分分析(Independent Component Analysis,ICA)是一种统计与计算技术,主要用于信号分离,即从多种混合信号中提取出独立的信号源。ICA在处理盲源分离(Blind Source Separation,BSS&#xff0…...

Spring Boot与Okta的集成

Spring Boot与Okta的集成 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Spring Boot应用中集成Okta,实现身份认证和授权的功能…...

MVC(Model-View-Controller)模式

MVC(Model-View-Controller)模式三个主要组件:模型(Model),视图(View),和控制器(Controller): 模型(Model)&a…...

MuLan:模仿人类画家的多对象图像生成

在图像生成领域,处理包含多个对象及其空间关系、相对大小、重叠和属性绑定的复杂提示时,现有的文本到图像模型仍面临挑战:当文本提示中包含多个对象,并且这些对象之间存在特定的空间关系时,现有模型往往难以准确地捕捉…...

如何在Android中实现网络通信,如HttpURLConnection和HttpClient。

在Android开发中,网络通信是一个不可或缺的功能,它允许应用与服务器交换数据,实现丰富的功能。在实现网络通信时,HttpURLConnection和HttpClient是两种常用的方式。下面将从技术难点、面试官关注点、回答吸引力以及代码举例四个方…...

评价ChatGPT与强人工智能的未来

在人工智能领域,ChatGPT的出现无疑是一个里程碑事件。它不仅展示了自然语言处理技术的巨大进步,也引发了人们对于强人工智能(AGI)的无限遐想。本文将从多个角度评价ChatGPT,并探讨强人工智能距离我们还有多远。 ChatGP…...

【web前端HTML+CSS+JS】--- CSS学习笔记02

一、CSS(层叠样式表)介绍 1.优势 2.定义解释 如果有多个选择器共同作用的话,只有优先级最高那层样式决定最终的效果 二、无语义化标签 div和span:只起到描述的作用,不带任何样式 三、标签选择器 1.标签/元素选择器…...

linux 安装 ImageMagick 及 php imagick扩展

安装imagick扩展前必须安装ImageMagick 一、安装ImageMagick wget http://www.imagemagick.org/download/ImageMagick.tar.gz 上面如果报错(cannot verify download.imagemagick.org’s certificate)执行 sudo yum install -y ca-certificates tar zxv…...

秋招突击——7/5——复习{}——新作{跳跃游戏II、划分字母区间、数组中的第K个大的元素(模板题,重要)、前K个高频元素}

文章目录 引言正文贪心——45 跳跃游戏II个人实现参考实现 划分字母区间个人实现参考实现 数组中的第K个最大元素个人实现参考做法 前K个高频元素个人实现参考实现 总结 引言 今天就开始的蛮早的,现在是九点多,刚好开始做算法,今天有希望能够…...

【Linux】信号的处理

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 信号的处理 1 信号的处理2 内核态 VS 用户态3 键盘输入数据的过程4 如何理解OS如何正常的运行5 如何进行信号捕捉信号处理的总结6 可重入函数volatile关…...

Python数据分析的数据导入和导出

在Python数据分析中,数据的导入和导出是非常关键的步骤。这些步骤通常涉及到将数据从外部文件(如CSV、Excel、数据库等)读入到Python程序中,以及将处理后的数据导出回外部文件或数据库。以下是一些常用的库和方法来实现这些操作。…...

【JAVA多线程】线程池概论

目录 1.概述 2.ThreadPoolExector 2.1.参数 2.2.新任务提交流程 2.3.拒绝策略 2.4.代码示例 1.概述 线程池的核心: 线程池的实现原理是个标准的生产消费者模型,调用方不停向线程池中写数据,线程池中的线程组不停从队列中取任务。 实现…...

java双亲委派机制

Java中的双亲委派机制(Parent Delegation Model)是一种类加载机制,它确保了类加载的安全性和一致性。该机制规定了类加载器在加载类时的顺序和方式,从而避免了重复加载和类冲突问题。 以下是一个简单的自定义类加载器的示例&#…...

记录第一次使用air热更新golang项目

下载 go install github.com/cosmtrek/airlatest 下载时提示: module declares its path as: github.com/air-verse/air but was required as: github.com/cosmtrek/air 此时,需要在go.mod中加上这么一句: replace github.com/cosmtrek/air &…...

Leetcode 3213. Construct String with Minimum Cost

Leetcode 3213. Construct String with Minimum Cost 1. 解题思路2. 代码实现 题目链接:3213. Construct String with Minimum Cost 1. 解题思路 这一题的话思路上还是比较直接的,就是一个trie树加一个动态规划,通过trie树来快速寻找每一个…...

python操作SQLite3数据库进行增删改查

python操作SQLite3数据库进行增删改查 1、创建SQLite3数据库 可以通过Navicat图形化软件来创建: 2、创建表 利用Navicat图形化软件来创建: 存储在 SQLite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型: NULL. 值是空值。 INTEGER. 值是有符…...

【电控笔记6.7】非最小相位系统

全通滤波器 [...

Day05-04-持续集成总结

Day05-04-持续集成总结 1. 持续集成2. 代码上线目标项目 1. 持续集成 git 基本使用, 拉取代码,上传代码,分支操作,tag标签 gitlab 用户 用户组 项目 , 备份,https,优化. jenkins 工具平台,运维核心, 自由风格工程,maven风格项目,流水线项目, 流水线(pipeline) mavenpom.xmlta…...

PyQt5动态热力图清空画布关闭ColorBar

PyQt5生成正弦波动态热力图清空画布关闭ColorBar 1、简介 生成随机正弦波,使用pyqtgraph展示出来,并且使用热力图展示不同频率的正弦波,使用不同的画布颜色显示热力图的变化。 使用python3.8 导入库: pip install matplotlib==3.7.5 pip install numpy==1.24.4 pip in…...

python爬虫入门(一)之HTTP请求和响应

一、爬虫的三个步骤(要学习的内容) 1、获取网页内容 (HTTP请求、Requests库) 2、解析网页内容 (HTML网页结构、Beautiful Soup库) 3、存储或分析数据 b站学习链接: 【【Python爬虫】爆肝两…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

云计算——弹性云计算器(ECS)

弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...