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

波束形成(BF)从算法仿真到工程源码实现-第三节-延迟求和波束形成(DSB)

一、概述

     本节我们讨论延迟求和波束形成算法,包括原理分析及代码实现。 更多资料和代码可以进入 https://t.zsxq.com/qgmoN ,同时欢迎大家提出宝贵的建议,以共同探讨学习。

二、原理分析

2.1 原理:

        首先对不同麦克风信号之间的相对延迟进行补偿,然后叠加延时后的信号形成一个单一的输出。

                                    y(t)=\sum_{i = 1}^{M} w_{i}^{H}(t)x_{i}(t)=w^{H}x = x(t)w^{H}a(\theta)

式中,w=\left[w_{1}, w_{2},\cdots, w_{N}\right]^{T}表示波束形成器的权值向量,T表示转置,H表示共轭转置。因此,波束形成是对各个麦克风接收信号进行加权因子调节并相加的过程。对各个麦克风来说,信号在一瞬间的幅值相同,一般只做信号的相位调整,不做幅度改变。由此可知,如果空间中仅存在一个\theta_{k}方向的波信号a(\theta_{k}),当权重矢量取w=a(\theta_{k})时,则输出信号最大值y(n)=a(\theta_{k})^{H}a(\theta_{k}) = M。这时阵列各路信号加权相干叠加,为经典的固定波束形成(Fixed Beamforming)。

2.2 缺点:

        如果噪声源是相干的,降噪效果会强烈地依赖于噪声信号的到达方向,延迟求和波束形成在混响环境中的性能往往是不够好的。

2.3 优点:

        由于可以有效地减轻非相干噪声,成本低且有一定效果,该类波束形成器仍然被广泛使用。需要注意的是,对信号的延时过程中,会遇到延时样点为分数的情形(如延时2.4个样点),这时就需要对信号进行分数时延,参考:“分数时延滤波器”;DSB简单易于实现,基于上述延时求和的思想,衍生出来其他几种简单的BF算法:delay sub(延时相减)和自适应零点的双麦BF等。

三、仿真代码

import numpy as np
import soundfile as sf
import scipy
import matplotlib.pyplot as pltfft_size = 256
freq_bin = 129def calculate_circular_array_steering_vector(angle, r=0.0463, N=6, fs=16000, fft_size=256, c=343):steering_vector = np.zeros((N, fft_size//2 + 1), dtype=complex)for f in range(int(fft_size/2+1)):for n in range(N):frequency = fs * f / fft_sizeif frequency == 0:phase_delay = 0steering_vector[n, f] = np.exp(1j * phase_delay)else:lambda_val = c / frequencytheta_mic = -2 * np.pi * n / N + 2 * np.pitheta_signal = np.pi * angle / 180phase_delay = 2 * np.pi * np.cos(theta_signal - theta_mic) * r / lambda_valsteering_vector[n, f] = np.exp(1j*phase_delay)return steering_vectordef calculate_circular_array_steering_vector_anticlockwise(angle, r=0.0463, N=6, fs=16000, fft_size=256, c=343):steering_vector = np.zeros((N, fft_size // 2 + 1), dtype=complex)for f in range(int(fft_size / 2 + 1)):for n in range(N):frequency = fs * f / fft_sizeif frequency == 0:phase_delay = 0steering_vector[n, f] = np.exp(1j * phase_delay)else:lambda_val = c / frequencytheta_mic = 2 * np.pi * n / Ntheta_signal = np.pi * angle / 180phase_delay = 2 * np.pi * np.cos(theta_signal - theta_mic) * r / lambda_valsteering_vector[n, f] = np.exp(1j * phase_delay)return steering_vectordef delay_and_sum(a, data):data1 = np.multiply(np.conjugate(a), data)data2 = np.sum(data1, axis=0) / 6return data2def main():# 读取WAV文件data, samplerate = sf.read('output/simulate_role1_0_t60_0.2_role2_180_t60_0.2.wav')# 定义帧长和帧移frame_length = int(samplerate * 0.016)  # 25ms帧长frame_step = int(samplerate * 0.008)  # 10ms帧移# 创建汉明窗hamming_window = scipy.signal.windows.hamming(frame_length)hamming_window = np.reshape(hamming_window, [frame_length, 1])sample_num = data.shape[0] - frame_length + 1HH = calculate_circular_array_steering_vector(180)# 手动分帧和加窗frames = []out1 = np.zeros(int(fft_size/2), dtype=float)for i in range(0, sample_num, frame_step):frame = data[i:i + frame_length, :]windowed_frame = frame * hamming_windowfft_frame = np.fft.fft(windowed_frame, axis=0)fft_frame1 = np.transpose(fft_frame[:freq_bin, :])fft_frame1 = delay_and_sum(HH, fft_frame1)fft_frame11 = fft_frame1fft_frame21 = np.concatenate((fft_frame11, fft_frame11[1:-1][::-1].conj()))fft_frame21 = np.transpose(fft_frame21)ifft_frame1 = np.fft.ifft(fft_frame21)short_data1 = ifft_frame1[:int(fft_size/2)] + out1out1 = ifft_frame1[int(fft_size/2):]frames.extend(short_data1)frames1 = np.array(frames).reshape((-1)).realsf.write("output/simulate_role1_0_t60_0.2_role2_180_t60_0.2_out_das_t180.wav", frames1, 16000)main()

四、结果

4.1 0度方向

4.2 180度方向

五、总结

从结果上看,延迟求和波束形成效果不佳,主要是低频信号基本没有效果,而语音信号基本上信息集中在中低频,下节我们将介绍其他效果更好的波束形成算法。

相关文章:

波束形成(BF)从算法仿真到工程源码实现-第三节-延迟求和波束形成(DSB)

一、概述 本节我们讨论延迟求和波束形成算法,包括原理分析及代码实现。 更多资料和代码可以进入 https://t.zsxq.com/qgmoN ,同时欢迎大家提出宝贵的建议,以共同探讨学习。 二、原理分析 2.1 原理: 首先对不同麦克风信号之间的相…...

deepseek使用记录——拉美文学的且战且败和且败且战

一 拉美文学,且战且败,且败且战,有哪些比较深刻的文学作品,对当下的年轻人有何启示。 拉丁美洲文学以其对历史、政治、社会现实的深刻反思和独特的魔幻现实主义风格闻名于世。这些作品既记录了拉美大陆在殖民、独裁、全球化浪潮中…...

LeetCode 解题思路 37(Hot 100)

解题思路: 初始化: 初始化最大举行 max 和栈 stack。左右补零: 考虑柱子递增的边界情况, 初始化填充柱状图 newHeights。遍历处理: 对于每一根遍历到的柱子 newHeights[i],若柱子高度小于栈口索引&#xf…...

lvs+keepalived+dns高可用

1.配置dns相关服务 1.1修改ip地址主机名 dns-master: hostnamectl hostname lvs-master nmcli c modify ens160 ipv4.method manual ipv4.addresses 10.10.10.107/24 ipv4.gateway 10.10.10.2 ipv4.dns 223.5.5.5 connection.autoconnect yes nmcli c up ens160dns-salve: h…...

计算齿轮故障频率|平行轴|行星轮齿轮

一、平行轴齿轮故障频率 关键参数定义 Z:齿轮齿数 fs:轴旋转频率(Hz) N:啮合齿轮齿数(配对齿轮) 特征频率公式 软件页面截图 二、行星齿轮故障频率 系统组成参数 太阳轮齿数 齿圈齿数 …...

【技术派部署篇】云服务器部署技术派

1 环境搭建 1.1 JDK安装 # ubuntu sudo apt update # 更新apt apt install openjdk-8-jdk # 安装JDK安装完毕之后,执行 java -version 命令进行验证: 1.2 Maven安装 cd ~ mkdir soft cd soft wget https://dlcdn.apache.org/maven/maven-3/3.8.8/bina…...

Rasa中endpoints.yml文件信息详细解释

endpoints.yml 是 Rasa 项目中用于配置各类服务接口(endpoints)的文件,它告诉 Rasa: 去哪里加载模型自定义动作在哪个服务运行对话历史存储在哪(tracker store)是否要把事件推送到某个消息队列中&#xff…...

AI代理是大模型实现可扩展智能自动化的关键

AI 代理框架:实现可扩展智能自动化的关键 https://www.lyzr.ai/ 每个人都在谈论 AI 代理,例如 Sam Altman、Satya Nadella、Andrew Ng 和 Sundar Pichai 等行业领袖。 但这究竟是为什么呢? 因为这就是当今软件发展的方向,也是企…...

android中dp和px的关系

关于android的dp和px的关系是我刚开始学习android的第一个知识点,不知不觉学安卓也有一年了,但是偶然间我发现我理解的dp和px的关系一直是错的,真的是有一点搞笑,今天特意写一篇博客纪念一下这个我理解错一年的知识点。 dp和px之间…...

day32-动态规划__509. 斐波那契数__70. 爬楼梯__746. 使用最小花费爬楼梯

动态规划,一直是各种算法竞赛中难度较大的题目。在同学接触到动态规划的题目时,对于简单的动态规划问题,同学们常常轻易通过,而对于复杂的动态规划,却没有一个很好的思路,那么我们究竟有没有一种统一的思考…...

【Code】《代码整洁之道》笔记-Chapter12-迭进

第12章 迭进 12.1 通过迭进设计达到整洁目的 假使有4条简单的规则,跟着做就能帮助你创建优良的设计,会如何?假使遵循这些规则,你就能洞见代码的结构和设计,更能轻易地应用SRP和DIP之类的原则,便会如何&…...

Odoo 部署本地 把現時的excel計算表格部署上odoo 教程

要将现有的 Excel 计算表格部署到 Odoo 平台上,您可以按照以下步骤进行操作: 将 Excel 表格中的数据转移到 Odoo 模块中:首先,您需要将 Excel 表格中的数据导出为 CSV 格式,然后可以使用 Odoo 的数据导入功能将这些数据…...

【C语言-全局变量】

【C语言-全局变量】 1.能局部就局部,别啥都往全局塞2.尽量用结构体对零散变量封装3.函数传参4.静态变量模块化5 单例模式, 限制全局实例数量6. 配置化全局参数——集中管理可调参数7. 事件驱动架构:消息队列通信策略选择建议 参考https://mp.weixin.qq.c…...

Downlink Sensing in 5G-Advanced and 6G: SIB1-assisted SSB Approach

摘要——本文研究了利用现有5G NR信号进行网络侧集成感知与通信(ISAC)的潜力。通常,由于其频繁的周期性可用性和波束扫描特性,同步信号块(SSB)是适合用于下行感知的候选信号。然而,正如本文所示…...

PCIe 5.0光学SSD原型问世!

近日,Kioxia Corporation(铠侠)、AIO Core Co., Ltd. 和 Kyocera Corporation(京瓷)联合宣布成功开发了一款支持 PCIe 5.0 接口的光学 SSD 原型。该技术旨在通过光接口替换传统的电接口,从而显著增加计算设…...

JDK(Java Development Kit)从发布至今所有主要版本 的详细差异、新增特性及关键更新的总结,按时间顺序排列

以下是 JDK(Java Development Kit)从发布至今所有主要版本 的详细差异、新增特性及关键更新的总结,按时间顺序排列: 1. JDK 1.0 (1996) 发布年份:1996年1月23日关键特性: Java首次正式发布。核心语言特性…...

【3分钟准备前端面试】yarn

目录 Yarn核心概念核心机制解析工作流与命令详解高级功能剖析性能优化策略常见问题解决方案Yarn与...

[16届蓝桥杯 2025 c++省 B] 移动距离

思路:这题很多人肯定一眼就觉得是直线,因为无限方案,怎么走随便你,极限状态会误以为是直线,实际上你会发现,只有往右走是直线,往上走时一个弧线操作,就算你一下往右,一下…...

二叉树(中)-- 堆

堆是一个独立的数据结构,堆是一个二叉树。堆和栈几乎没有什么关联 堆是一个完全二叉树,可以用数组存储 大堆: 任何一个父亲都大于等于孩子小堆: 任何一个父亲都小于等于孩子 请注意,小堆大堆并不一定是升序或降序&…...

艾伦·图灵:计算机科学与人工智能之父

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 艾伦图灵:计算机科学与人工智能之父 一、天才的诞生与早期生涯 1912年6月…...

Doris 安装部署、实际应用及优化实践:对比 ClickHouse 的深度解析

在实时分析、报表系统以及高并发 OLAP 查询等场景中,列式存储数据库因其卓越的查询性能逐渐成为主流。Doris 和 ClickHouse 是近年来最受欢迎的两款开源 OLAP 引擎,本文将系统介绍 Doris 的安装部署、应用场景及优化实践,并与 ClickHouse 做一…...

Vue的学习总结-day02

一、Vue的基本语法 1、Vue.js 使用双大括号 {{ }} 来表示文本插值&#xff1a; <template><div class"demo">{{msg}}</div> </template> 2、指令 v-bind&#xff1a;动态绑定一个或多个特性&#xff0c;或一个组件 prop。 <template…...

MySQL 中查询 VARCHAR 类型 JSON 数据的

在数据库设计中&#xff0c;有时我们会将 JSON 数据存储在 VARCHAR 或 TEXT 类型字段中。这种方式虽然灵活&#xff0c;但在查询时需要特别注意。本文将详细介绍如何在 MySQL 中有效查询存储为 VARCHAR 类型的 JSON 数据。 一、问题背景 当 JSON 数据存储在 VARCHAR 列中时&a…...

Spring Boot 的启动流程

Spring Boot 是一个用于简化 Spring 应用程序开发的框架&#xff0c;它通过自动配置和约定优于配置的原则&#xff0c;大大降低了开发者的工作量。下面我们将深入探讨 Spring Boot 的启动流程&#xff0c;帮助你理解其背后的工作机制。 1. 启动入口 Spring Boot 应用的启动入…...

JMeter的接口测试步骤

创建测试计划 新建测试计划&#xff1a; 打开 JMeter&#xff0c;右键点击 Test Plan&#xff0c;选择 Add -> Threads (Users) -> Thread Group。双击 Thread Group&#xff0c;设置线程数&#xff08;用户数&#xff09;、循环次数等参数。 添加取样器&#xff08;S…...

Linux基础14

一、搭建LAMP平台 安装包&#xff1a;mariadb-server、php、php-mysqlnd、php-xml、php-json 搭建平台步骤&#xff1a; ​ php步骤&#xff1a; ​ 创建网页&#xff1a;index.php ​ 网页内编写php语言&#xff1a; > ​ eg&#xff1a;<?p…...

七种数码管驱动/LED驱动综合对比——《器件手册--数码管驱动/LED驱动》

十四、数码管驱动/LED驱动 名称 工作原理 应用场景 优缺点 特点 LED驱动 LED驱动的核心是为发光二极管提供稳定的电流。LED的亮度与电流成正比&#xff0c;而其正向电压相对稳定。驱动电路需要根据电源电压和LED的正向电压&#xff0c;通过限流电阻或恒流芯片来控制电流。…...

【25软考网工笔记】第二章 数据通信基础(2) 信道延迟计算

目录 一、信道延迟 1. 线路延迟 1&#xff09;线路延迟与传输距离的关系 2&#xff09;光纤线路与电缆线路的传播速度 3&#xff09;线路延迟计算示例&#xff1a;1000米电缆的延迟 2. 发送延迟 1&#xff09;发送延迟的定义与计算 2&#xff09;发送延迟的影响因素 3.…...

代码随想录第16天:(二叉树)

一、最大二叉树&#xff08;Leetcode 654&#xff09; class Solution:def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:# 基础条件&#xff1a;当数组只有一个元素时&#xff0c;直接返回该元素构建的二叉树节点if len(nums) 1:return TreeNode(nums[…...

Android activity属性taskAffinity的作用

1. taskAffinity的基本概念 在Android开发中&#xff0c;taskAffinity是一个定义在标签中的属性&#xff0c;用于指定Activity与哪个任务&#xff08;Task&#xff09;相关联。默认情况下&#xff0c;应用的所有Activity都共享同一个任务堆栈&#xff0c;其taskAffinity值为应…...

Vuex Actions 多参数传递的解决方案及介绍

Vuex Actions 多参数传递的解决方案及介绍 引言 在Vuex状态管理模式中&#xff0c;Actions 扮演着至关重要的角色。它主要用于处理异步操作&#xff0c;并且可以提交 Mutations 来修改全局状态。然而&#xff0c;在实际开发中&#xff0c;我们常常会遇到需要向 Actions 传递多…...

SQL学习--基础语法学习

SQL和excle对比 学习目标 单表查询 项目背景 SQL 练习环境 SQL Online Compiler - Next gen SQL Editor 商品信息表&#xff1a;https://study-zhibo.oss-cn-shanghai.aliyuncs.com/test/%E5%95%86%E5%93%81%E4%BF%A1%E6%81%AF%E8%A1%A8.csv 订单明细表&#xff1a;https://…...

ProfibusDP转ModbusTCP接流量计技巧

ProfibusDP转ModbusTCP接流量计技巧 在现代工业自动化系统中&#xff0c;设备的互联互通至关重要。为了实现不同协议设备之间的数据交换与统一管理&#xff0c;Profibus DP主站转Modbus TCP网关成为了一个重要的解决方案。本文将详细介绍这一转换方案及其在电磁流量计中的应用…...

【数据结构与算法】ArrayList 和 顺序表

文章目录 &#x1f332;List&#x1f332;1. 线性表&#x1f332;2. 顺序表&#x1f33f;2.1 MyArrayList2.1.1 类中重写所有接口方法1.新增元素2.在pos位置新增元素(指定位置)3.判定是否包含了某个特定元素 4.查找特定元素对应的位置 5.获取pos下标的元素 6.给pos位置的元素替…...

VMware Fusion Pro/Player 在 macOS 上的完整安装与使用指南

VMware Fusion Pro/Player 在 macOS 上的完整安装与使用指南—目录 一、VMware 产品说明二、下载 VMware Fusion三、安装前准备四、安装 VMware Fusion步骤 1&#xff1a;安装程序步骤 2&#xff1a;首次启动配置步骤 3&#xff1a;输入许可证 五、创建虚拟机步骤 1&#xff1a…...

GESP2025年3月认证C++七级( 第三部分编程题(1)图上移动)

参考程序&#xff08;动态规划&#xff09; #include <cstdio> using namespace std; const int K 25; // 最大步数 多开一点 const int N 505; // 最大结点数 const int E N << 1; // 最多边数&#xff08;因为是无向图&#xff0c;每条边…...

将LINUX系统本机文件上传到LINUX虚拟机,未联网的情况下

将LINUX系统本机文件上传到LINUX虚拟机,未联网的情况下 1.将需要上传的文件,归档为.iso镜像文件 命令:mkisofs -r -o myiso.iso /iso/tool 2.打开虚拟机,选择需要挂载的光盘 3.创建挂载点,一般在/mnt目录下 mkdir /mnt/tool 4.临时挂载镜像 mount /dev/cdrom /mnt/tool 5.需要…...

Selenium之Actions事件

鼠标、键盘组合键 在使用selenium的时候&#xff0c;有的时候我们需要鼠标单击、双击、拖动&#xff1b;或者是按下键盘的某个键&#xff0c;松开某个按键&#xff0c;以及组合键的使用&#xff1b;今天我们就来看一看&#xff0c;怎么样实现上面的操作 先把准备工作做好&…...

高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第三章微分中值定理与导数的应用同步测试卷 A 卷

第三章微分中值定理与导数的应用同步测试卷 A 卷 一、单项选择题(本大题共5小题,每小题3分,总计15分) 1. 2. 3. 4. 5. 二、填空题(本大题共5小题,每小题3分,总计15分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小题,每小题6分,总计…...

使用Vscode排除一些子文件搜索

打开用户/工作区设置 全局生效&#xff1a;打开命令面板&#xff08;CtrlShiftP 或 CmdShiftP&#xff09;&#xff0c;搜索并选择 Preferences: Open User Settings (JSON)。 仅当前项目生效&#xff1a;在项目根目录下创建 .vscode/settings.json 文件&#xff08;如果不存在…...

《前端面试题之 CSS篇(第一集)》

目录 1、CSS的盒模型2、CSS选择器及其优先级3、隐藏元素的方法有那些4、px、em、rem的区别及使用场景5、重排、重绘有什么区别6、水平垂直居中的实现7、CSS中可继承与不可继承属性有哪些8、Sass、Less 是什么&#xff1f;为什么要使用他们&#xff1f;9、CSS预处理器/后处理器是…...

第九天 开始Unity Shader的学习之单张纹理

Unity Shader的学习笔记 第九天 开始Unity Shader的学习之单张纹理 文章目录 Unity Shader的学习笔记前言一、基础纹理二、单张纹理① Properties② Cg代码块的变量③ 顶点着色器和片元着色器的结构体(a2v 和 v2f)④ 顶点着色器vert⑤ 片元着色器 frag效果展示 总结 前言 前几…...

Linux-内核驱动-led

登记设备号&#xff08;后面可以动态分配&#xff09; 自己定义内核函数 登记设备名字和功能 exit和init在内核启动自动执行 这样定义直接操作物理地址 ioctl 定义了设备文件的各种操作&#xff0c;并准备将其注册到内核中。 代码中声明了一个cdev结构体变量cdev&#xff0c;这…...

Web 项目实战:构建属于自己的博客系统

目录 项目效果演示 代码 Gitee 地址 1. 准备工作 1.1 建表 1.2 引入 MyBatis-plus 依赖 1.3 配置数据库连接 1.4 项目架构 2. 实体类准备 - pojo 包 2.1 dataobject 包 2.2 request 包 2.3 response 包 2.3.1 统一响应结果类 - Result 2.3.2 用户登录响应类 2.3.3…...

C++算法(1):stringstream详解,高效字符串处理与类型转换的利器

什么是stringstream&#xff1f; stringstream是C标准库中的一个类&#xff0c;定义在<sstream>头文件中。它提供了一种方便的方式来处理字符串与其他数据类型之间的转换和格式化操作。stringstream结合了istringstream和ostringstream的功能&#xff0c;既可以用于输入…...

【前端】【css】flex布局详解

Flex 布局&#xff08;Flexible Box Layout&#xff0c;弹性盒子布局&#xff09;是 CSS3 中的一种布局模式&#xff0c;用于在容器中更高效地分配空间并对齐内容&#xff0c;即使它们的大小是动态未知的。它非常适用于响应式设计。 一、Flex 布局的基本概念 1. 启用 Flex 布局…...

Python Cookbook-5.15 根据姓的首字母将人名排序和分组

任务 想将一组人名写入一个地址簿&#xff0c;同时还希望地址簿能够根据姓的首字母进行分组&#xff0c;且按照字母顺序表排序。 解决方案 Python 2.4 的新 itertools.groupby 函数使得这个任务很简单: import itertools def qroupnames(name_iterable):sorted_names sort…...

深入探析C#设计模式:访问者模式(Visitor Pattern)的原理与应用

引言 在软件开发中&#xff0c;设计模式为我们提供了高效、可维护的解决方案。而在众多设计模式中&#xff0c;访问者模式&#xff08;Visitor Pattern&#xff09;以其独特的结构和应用场景&#xff0c;在复杂系统中发挥着重要作用。本文将深入讲解访问者模式的定义、原理、优…...

2025蓝桥杯省赛C/C++研究生组游记

前言 至少半年没写算法题了&#xff0c;手生了不少&#xff0c;由于python写太多导致行末老是忘记打分号&#xff0c;printf老是忘记写f&#xff0c;for和if的括号也老是忘写&#xff0c;差点连&&和||都忘记了。 题目都是回忆版本&#xff0c;可能有不准确的地方。 …...

RPA VS AI Agent

图片来源网络 RPA&#xff08;机器人流程自动化&#xff09;和AI Agent&#xff08;人工智能代理&#xff09;在自动化和智能化领域各自扮演着重要角色&#xff0c;但它们之间存在显著的区别。以下是对两者区别的详细分析&#xff1a; 一、定义与核心功能 RPA&#xff08;机…...