Beamforming

1. 阵列简介

1.1 均匀线阵

假设0、1、…M-1阵元的均匀线阵中,参考阵元接收的信号为 s ( t ) s(t) s(t),则第 m m m个阵元接收到的信号为 s ( t − τ m ) s(t-\tau_m) s(tτm),傅里叶变换如下

S m ( ω ) = ∫ − ∞ + ∞ s m ( t ) e − j ω t d t S_m(\omega)=\int_{-\infty }^{+\infty} s_m(t)e^{-j\omega t}dt Sm(ω)=+sm(t)ejωtdt

                              = ∫ − ∞ + ∞ s ( t − τ m ) e − j ω t d t =\int_{-\infty }^{+\infty} s(t-\tau_m)e^{-j\omega t}dt =+s(tτm)ejωtdt
   
                               = S ( ω ) e − j ω τ m =S(\omega)e^{-j\omega\tau_m} =S(ω)ejωτm

则阵列接收的信号可以表示为

X ( ω ) = S ( ω ) [ 1   e − j ω τ 1   e − j ω τ 2   …   e − j ω τ M − 1 ] X(\omega)=S(\omega)[1 e^{-j\omega\tau_1} e^{-j\omega\tau_2} … e^{-j\omega\tau_{M-1}} ] X(ω)=S(ω)[1 ejωτ ejωτ  ejωτM1]

其中,定义

a ⃗ = [ 1   e − j ω τ 1   e − j ω τ 2   …   e − j ω τ M − 1 ] \vec{a}=[1 e^{-j\omega\tau_1} e^{-j\omega\tau_2} … e^{-j\omega\tau_{M-1}} ] a =[1 ejωτ ejωτ  ejωτM1]

为阵元的响应向量(array response vector),也称作阵列流形(array manifold vector)。
  同时,也定义波数(wave number)如下
κ = ω c a ⃗ \kappa=\frac{\omega}{c} \vec{a} κ=cωa
其中 ω = 2 π k f s / N f f t \omega=2\pi kf_s/N_{fft} ω=2πkfs/Nfft为数字角频率
  在delauy-and-sum beamformer中,每个阵元的权值即为该阵元相对参考阵元需要补偿的相位延迟,因此权值即为阵列流形的共轭转置
  根据上面的分析,写出窄带线性阵列的delay-and-sum波束图代码如下

delay-and-sum beamformer
M=8;                 % 阵元数
c=340;                         % 声速
f = 2125;                      % 信号频率
d = 0.08;                      % 阵元间距
theta=linspace(-pi/2,pi/2,200);% 入射信号角度范围
theta0=30*pi/180;                      % 注视方向
w=exp(1j*2*pi*f*sin(theta0)*[0:M-1]'*d/c);       % 导向向量
p = zeros(length(1:length(theta)),1);
for  j=1:length(theta)                                     % 角度扫描
    a=exp(-1j*2*pi*f*sin(theta(j))*[0:M-1]'*d/c);% 入射信号方向向量
    p(j)=sum(w.*a)/M;                                        % 延时-求和
end
% 画图
figure;
plot(theta/pi*180,abs(p)),grid on
xlabel('degree')
ylabel('amplitude')
title('8阵元均匀线阵方向图')


方向图如下
在这里插入图片描述

1.2 均匀圆阵

跟上面的分析相同,关键地方就是写出阵列流形向量和权值向量
  假设 M M M阵元均匀圆阵,半径为 R R R,阵元在 x − y x-y xy平面上,则各个阵元相对 x x x轴的夹角 γ m = 2 π m / M \gamma_m=2\pi m/M γm=2πm/M,均匀圆阵中,一般以圆心为参考,要写出阵列方向向量,就是要计算当单位平面波以夹角 ( ϕ , θ ) (\phi,\theta) (ϕθ)入射时,各阵元相对圆心接收到的信号时间差。

计算上图1

中的距离 d d d,就要计算这个余弦角 β \beta β,由三余弦定理(查百度才知道叫这个名字,逃~)有

c o s ( β ) = c o s ( ϕ − γ m ) s i n ( θ ) cos(\beta)=cos(\phi-\gamma_m)sin(\theta) cos(β)=cos(ϕγm)sin(θ)

然后,就可以计算得到距离差,得到时间差

τ m = R c o s ( ϕ − γ m ) s i n ( θ ) / c \tau_m=Rcos(\phi-\gamma_m)sin(\theta)/c τm=cos(ϕγm)sin(θ)

最后,根据上面线阵的相同分析,可以直接写出均匀圆阵的的阵列流形向量如下

a ⃗ = [ e − j ω R c o s ( ϕ − γ 0 ) s i n ( θ ) / c   e − j ω R c o s ( ϕ − γ 1 ) s i n ( θ ) / c   . . .   e − j ω R c o s ( ϕ − γ M − 1 ) s i n ( θ ) / c   ] \vec{a}=\begin{bmatrix}e^{-j\omega Rcos(\phi-\gamma_0)sin(\theta)/c}  \\ e^{-j\omega Rcos(\phi-\gamma_1)sin(\theta)/c}  \\ ...  \\ e^{-j\omega Rcos(\phi-\gamma_{M-1})sin(\theta)/c}  \end{bmatrix} a =ejωcos(ϕγ0)sin(θ)/c ejωcos(ϕγ1)sin(θ)/c ... ejωcos(ϕγM1)sin(θ)/c 

然后,写出均匀圆阵的delay-and-sum波束图就简单了

M=8;                 % 阵元数
c=340;                         % 声速
f = 2125;                      % 信号频率
r = 0.08;                      % 阵元间距
phi=linspace(0,2*pi,360);% 入射信号角度范围

theta = 80*pi/180; %固定一个俯仰角
gamma = (0:360/M:360-360/M)*pi/180;%麦克风位置

tao = r*sin(theta)*cos(angle(1)-gamma)/c;     %方位角 0 < angle <360

phi0=60*pi/180;                      % 注视方向
w=exp(1j*2*pi*f*r*cos(phi0-gamma)*sin(theta)/c);       % 导向向量
p = zeros(length(1:length(phi)),1);
for  j=1:length(phi)                                     % 角度扫描
    a=exp(-1j*2*pi*f*r*cos(phi(j)-gamma)*sin(theta)/c);% 入射信号方向向量
    p(j)=sum(w.*a)/M;                                        % 延时-求和
end
% 画图
figure;
plot(phi/pi*180,abs(p)),grid on
xlabel('degree')
ylabel('amplitude')
title('均匀圆阵方向图')

%画极坐标图
figure,polarplot(phi,abs(p))

在这里插入图片描述

另外,圆阵是面阵,可以进行二维空间搜索,简单改下程序,画出三维图

M=8;                 % 阵元数
c=340;                         % 声速
f = 2125;                      % 信号频率
r = 0.08;                      % 阵元间距
phi=linspace(0,2*pi,360);% 入射信号方位角范围

theta = linspace(0,pi/2,90);% 入射信号俯仰角范围

gamma = (0:360/M:360-360/M)*pi/180;%麦克风位置


phi0=130*pi/180;                      % 注视方向
theta0 = 80*pi/180;

w=exp(1j*2*pi*f*r*cos(phi0-gamma)*sin(theta0)/c);       % 导向向量
p = zeros(length(1:length(phi)),length(theta));
for i = 1:length(theta)
    for  j=1:length(phi)                                     % 角度扫描
        a=exp(-1j*2*pi*f*r*cos(phi(j)-gamma)*sin(theta(i))/c);% 入射信号方向向量
        p(j,i)=sum(a.*w)/M;                                        % 延时-求和
    end
end
% 画图

figure,mesh(abs(p))

注视方向在(130,80)时的阵列方向图如下所示

在这里插入图片描述

 上图中可以看到,均匀圆阵的延时累加波束形成在俯仰角上的精度很差,在0~40度的范围内几乎无法分辨

2. 宽带波束形成

  上面程序中都指定了一个固定频率,做的是窄带波束形成,而语音信号为宽带信号,此时的波束图应该同时是入射方向跟信号频率的函数。
宽带波束形成可以在时域和频域实现,,下面分别简单介绍

2.1 时域处理

  时域处理就是根据某一最优准则设计出一组FIR系数,或者叫sensor delay-lines (SDLs),还有叫tapped delay-lines
(TDLs),框图如下,一些时域LCMV、MVDR都属于这种框架

在这里插入图片描述

2.2 频域处理

  频域处理是利用DFT,将信号变换到频域,然后在每个频率带上使用窄带的方法做波束形成,最后将各个子带信号相加变回到时域,框图如下
在这里插入图片描述



  1. Design of robust high-order superdirectivity for circular arrays with sensor gain and phase errors。 ↩︎

"Delay and sum" is a signal processing technique used in beamforming to combine signals received from multiple microphones or sensors. The basic idea is to introduce delays to the signals received by each microphone/sensor so that they arrive at a common point in space in phase, and then sum up the delayed signals to form a beam that is directional and focused. Here's a simple implementation of delay and sum in Python: ```python import numpy as np def delay_and_sum(signals, delays): """ Combine signals using delay-and-sum beamforming. signals: array of shape (num_mics, num_samples) Array of signals received by each microphone/sensor. delays: array of shape (num_mics,) Array of delays to be applied to each signal, in samples. Returns: -------- combined_signal: array of shape (num_samples,) Array of combined signal after delay-and-sum beamforming. """ num_mics, num_samples = signals.shape max_delay = np.max(delays) padded_signals = np.pad(signals, ((0, 0), (max_delay, 0)), mode='constant') combined_signal = np.zeros(num_samples) for i in range(num_samples): delayed_signals = np.zeros((num_mics,)) for j in range(num_mics): delayed_signals[j] = padded_signals[j, i+delays[j]] combined_signal[i] = np.sum(delayed_signals) return combined_signal ``` In this implementation, the `signals` input is an array of shape `(num_mics, num_samples)`, where `num_mics` is the number of microphones/sensors and `num_samples` is the number of samples in each signal. The `delays` input is an array of shape `(num_mics,)`, which specifies the delays to be applied to each signal, in samples. The implementation pads the signals with zeros to accommodate the maximum delay, and then loops over each sample in the signals to apply the delays and sum up the delayed signals. The output is a combined signal of shape `(num_samples,)`. Note that this is a basic implementation and there are many ways to optimize and improve it depending on the specific application.
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值