欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 波束形成(BF)从算法仿真到工程源码实现-第三节-延迟求和波束形成(DSB)

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

2025/5/24 21:39:34 来源:https://blog.csdn.net/weixin_42141751/article/details/147164302  浏览:    关键词:波束形成(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度方向

五、总结

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词