阵列信号处理—窄带波束形成(二)

1. 常规波束形成(Conventional Beamforming)

最经典的波束形成器即常规波束形成,其直接选取阵列导向矢量作为阵列输出的权重向量,进而补偿阵列时延,然后对期望信号方向加权输出以形成波束主瓣:

\mathbf{W}_{cb}=\mathbf{A}/M

显然计算复杂度低是CB算法的一大特点,但是由于其权重直接与阵列导向矢量相关,如果导向矢量出现失配,则算法性能会严重下降,且权重固定,算法整体鲁棒性较差。

2. CB算法仿真

首先仿真生成期望信号为15 kHz频率的正弦波

import matplotlib.pyplot as plt
import numpy as np
import scipy.io as scio

Fs = 65536 # 采样频率
c = 340    # 声速
f = 15000  # 信号中心频率
N = 2**16  # 采样点

# SOI
t = np.arange(0, Fs/N, 1/Fs)
s = np.sin(2*np.pi*f*t)

接下来建立一个声源面网格,距离麦克风阵列2m。在网格中任取一点作为仿真声源位置:(0.8485,-0.5676)

# source plane
dx = 4; dy = 3
xs = np.linspace(-dx, dx, 200)
ys = np.linspace(-dy, dy, 150)
Xs, Ys = np.meshgrid(xs,ys)
Zs = 2

# source position
sp = np.array([xs[60], ys[30]])  #(0.8485,-0.5676)

计算出阵列导向矢量,然后遍历声源面网格

def CB_beamformer(sv,M,Rxx):
    p = np.zeros((Xs.shape[0],Xs.shape[1]),dtype='complex_')
    for j in range(Xs.shape[1]):
        for i in range(Xs.shape[0]):
            g = np.squeeze(sv[:,i,j])
            w = g/M
            p[i,j] = np.array([w])@Rxx@w
            
    return p

定位结果如下,也可以根据pcolor调其他好看的颜色

阵列信号处理—窄带波束形成(二)_第1张图片

 之前基本都是使用matlab来复现算法,所以写python的话还是掉进了不少坑,过程中调试了很多小毛病。本文只附了部分代码,仅作个人总结随笔,感兴趣的可以私信交流,谢谢!

 

 

你可能感兴趣的:(阵列信号处理,波束形成,算法,python)