阵列信号处理笔记

  在学习阵列的过程中,走了不少弯路。有些基础知识感觉有必要记录下来,因此,这里记录的一些知识点是给icoolmedia自己看的,不想写的太严谨,如果恰好其他朋友能用的着,可能是一个意外的巧合哈。

  雷达的入门书籍,推荐西电的雷达原理,成电的雷达系统,做SAR成像的再看看皮亦鸣老师的合成孔径雷达成像原理,做信号的看看雷达信号处理基础,做相控阵的看看张光义院士的相控阵雷达原理,这些都是入门书籍

阵列处理的几个基本概念

  • 阵列通常用于需要对不同空间方位的信号(波)做不同处理、以及需要对信号到达方向进行区分的场合,因此也被称为空域滤波器。几个比较典型的应用是雷达、声呐,麦克风阵列。
  • 阵列的孔径指的是发射或者接收波的空间区域。通俗的讲,就是光学实验中的小孔、或者射频通信中的天线、声呐阵阵中的接收声音的传感器。孔径函数可以表示为接收的波与其响应的卷积
  • 阵列对不同空间方位的信号有不同的响应,这个过程叫做波束形成(beamforming)。利用阵列对声源方向进行估计叫做波达方位估计(DOA),军事领域通常叫做测向
  • 和波束泛指用延迟求和的思想来实现波束形成的一系列算法(MVDR、LCMV、GSC),差波束泛指对各阵元采样信号用差分方式来实现波束形成的方法

阵列对波的响应与波束图

  对于一个阵元个数为N,每个阵元位置为pn,n = 0,1,2,...,N-1的阵列,对当前的信号场进行空域采样,得到的一组信号为f(t,p)的矢量信号(列向量)。假设每个阵元对当前信号场中的信号响应是线性时不变的。

转向向量

\[{\bf{s}}(\theta ) = {[1,{e^{ - j\theta }},...,{e^{ - j(M - 1)\theta }}]^T}\]

\[\begin{array}{*{20}{c}}
{\theta  = \frac{{2\pi d}}{\lambda }\cos (\phi )}&{ - \frac{\pi }{2}}
\end{array} \le \phi  \le \frac{\pi }{2}\]

对于一个阵列,有一个入射平面波ejwt,入射角度为θ(-π/2~π/2),则t时刻,第一个阵元收到的信号为x0(t)=ejwt,其它阵元收到的信号为${x_m}(t) = {e^{j\omega (t - {\tau _m})}}$,m=1、2、3、M-1。这里的${\tau _m}$为第0个阵元到第m个阵元之的延迟。于是,波束形成的结果可以表示为:

\[y(t) = {e^{j\omega t}}\sum\limits_{m = 0}^{M - 1} {{e^{ - \omega {\tau _m}}}w_m^*} \]

当${\tau _0} = 0$时,波束形成器的响应为

\[P(\omega ,\theta ) = \sum\limits_{m = 0}^{M - 1} {{e^{ - j\omega {\tau _m}}}w_m^*}  = {{\bf{w}}^{\bf{H}}}{\bf{d}}(\omega ,\theta )\]

加权向量:${\bf{w}} = {\left[ {\begin{array}{*{20}{c}}{{w_0}}&{{w_1}}&{...}&{{w_{M - 1}}}\end{array}} \right]^{\bf{T}}}$

转向向量:${\bf{d}}(\omega ,\theta ) = {\left[ {\begin{array}{*{20}{c}}1&{{e^{ - j\omega {\tau _1}}}}&{...}&{{e^{ - j\omega {\tau _{M - 1}}}}}\end{array}} \right]^{\bf{T}}}$

  http://www.labbookpages.co.uk/audio/beamforming/delaySum.html      初学时可以从这个链接中了解下基本的概念

确定性麦克风阵列设计思路

  • 给出期望设计指标:主瓣宽度和旁瓣抑制量
  • 做波束图综合,逼近设计指标,并给出达到设计指标的条件。主瓣宽度取决于:阵列数目、阵元间隔、入射频率

    阵元数目越多、主瓣越窄;阵元数目越少、主瓣越宽
    阵元间距越大、主瓣越窄;阵元间距越小、主瓣越宽
    阵元间距不得大于入射频率半波长λ/2 = c/(2f),否则会出现空间混叠,具体表现是出现栅瓣现像。

  • 响应不变转换,把宽带信号各频率做响应一致性转换、从而达到让阵列对各频率的响应不变的目的。(ISM、CSM,傅立叶逆变换法)
  • 选择具体的波束形成算法。(使用约束或者窗函数加权法来控制旁瓣水平;使用约束增加滤波器的鲁棒性;如果能算出干扰方向,可以做零陷)
  • 如果阵元间距比较小,则考虑使用差分波束算法

子带自适应麦克风阵列参考资料

  https://scholar.google.com.hk/citations?user=Yy_ZuT4AAAAJ&hl=zh-CN    Jan Mark de Haan
  https://scholar.google.com.hk/citations?user=PFgH8nIAAAAJ&hl=zh-CN     Nedelko Grbic

稳健波数形成方法:LSMI(对角加载)、ESB(特征空间波束形成)、RCB(导向向量不确定集约束算法)
超指向波束形成方法:
宽带波束形成方法:ISM、CSM、FIB(频率不变波束形成)
孔径合成:
DOA估计:

离散传感器阵列是连续孔径的一种近似。有一点需要注意的是,传感器阵列的有效长度定义为相应的连续孔径的长度,为L=Nd,而传感器阵列的实际长度是d(N-1)

频率不变波束形成

1、贝塞尔函数法。基本的设计思路是:根据参考频率处的阵列流型,对宽带信号的频率范围内的每个频率点都构造出一个虚拟阵列,让阵列在各个频率点都构造出一个虚拟阵列,将阵列在各个频率点处接收到的数据进行变换,使虚拟阵列形成相同的信号流型,进而使各个子阵的波束方向图也都相同。

2、采样频率法。

3、傅立叶变换法。基本思想是根据阵列空间和时间参数之间的傅立叶变换关系,进而从期望得到频率不变波束图出发,采用一系列替换和一个反傅立叶变换来完成频率不变波束形成器的设计。

4、同心圆阵法。由一个圆环或者多个同心圆环组成,后者通常被称为同心圆环阵列。(Chan和Chen提出了一种基于均匀同心贺环阵列的数字波束形成器,其基本原理是将接收到的信号转为相位模式,然后通过使用数字波束形成或者补偿网络的方法来去除单独的相位模式对频率的依赖。

个人评价:并不是所有的阵列都可以做这类频率不变的变换,对麦克风阵列来讲,算法很难发挥作用

稳健自适应波束形成

1、直接对数据样本协方差矩阵求逆来实现MVDR波束形成器的方法称为协方差矩阵求逆法(SMI)
2、对角加载法(LSMI)
3、加权向量范数约束法(NCCB)
4、最差性能最佳法(WCPO)
5、协方差矩阵拟合法(RCB robust Capon Beamforming)
6、双约束法(DCRCB doubly constrained robust capon beamformer)

DCRCB方法设计步骤如下:
1、对数据协方差矩阵R(在实际应用中用其估计值)进行特征分解
2、运用牛顿迭代法求解式(3.125)得到lamda,其中lamda的上下界范围由式(3.127)确定
3、将求解出的lamda代入式(3.120)得到估计的导向向量
4、将导向向量代入式(3.121)得到估计的信号功率
5、将估计的导向向量代入式(2.123)计算加权向量

波束形成器能够在干扰方向自动形成凹槽来抑制干扰,对于某些突发干扰的情况,如干扰持续时间较短,自适应波束形成器来不及进行抑制。

凹槽噪声法:Olen通过增加虚拟干扰源的自适应迭代算法,构成了比较完备的旁瓣控制波束形成器设计方法


波束图综合讨论的是主瓣的设计问题,任务是设计加权向量,使设计出的波束响应逼近于期望响应,即求取波束形成加权向量w,使得设计出来的波束响应逼近于期望响应

差分麦克风阵列

DMA优势:

  • 更紧凑的阵型
  • 频率不变波束方向图
  • 低频和高频效果好
  • 给定传感器数据时,有获取最大方向性增益的潜力

DMA劣势:

  • 高频特性(high-pass characteristic with a slope of 6NdB/octave)
  • 频率响应依赖于阵列相对于声源的方向
  • 白噪声增益问题,尤其是在低频,需要做低频补偿

只能物理转向,不能电子转向
延迟求和波束转向的是主瓣方向,差波束转向的是零点


http://blog.csdn.net/u010592995/article/details/78762599 差分麦克风阵列
端射算法Matlab代码:
https://cn.mathworks.com/matlabcentral/fileexchange/33281-antenna-arrays?focused=5199406&tab=function
https://cn.mathworks.com/matlabcentral/fileexchange/43714-broadside---end-fire-antenna-array-radiation-pattern?focused=3799227&tab=function
https://www.slideshare.net/gunjan101/matlab-code-for-endfire-18350476


阵列设计
1、线阵的主瓣宽度计算:2 * cos−1 [c/(Ndf)],可知,主瓣宽度与阵元数,阵元间隔,入射频率的增加而减少
2、当阵元间距d大于半波长λ/2 = c/(2f)时,会出现空间混叠,表现是出现栅瓣现像

波束图综合仿真代码:
clear all;
c = 343;
freq = [7000 7500];
d = c/((max(freq)-min(freq))/2 + min(freq))/2
microphone = phased.OmnidirectionalMicrophoneElement('FrequencyRange',freq);
array = phased.ULA('Element',microphone,'NumElements',8,'ElementSpacing',d);
plotFreq = linspace(min(freq),max(freq),30);
pattern(array,plotFreq,[-90:90],0,'CoordinateSystem','rectangular','PlotStyle','waterfall','Type','powerdb','PropagationSpeed',c);
view(0,0);

波束图综合
clear all; close all;
c = 343; % signal propagation speed
fc = 6860; % signal carrier frequency
lambda = c/fc; % wavelength
thetaad = -30:5:30; % look directions
thetaan = 40; % interference direction
lambda/2
ula = phased.ULA(8,lambda/2);
ula.Element.BackBaffled = true;

% Calculate the steering vector for null directions
wn = steervec(getElementPosition(ula)/lambda,thetaan);
% Calculate the steering vectors for lookout directions
wd = steervec(getElementPosition(ula)/lambda,thetaad);
% Compute the response of desired steering at null direction
rn = wn'*wd/(wn'*wn);
% Sidelobe canceler - remove the response at null direction
w = wd - wn*rn;

% Plot the pattern
pattern(ula,fc,-180:180,0,'PropagationSpeed',c,'Type','powerdb','CoordinateSystem','rectangular','Weights',w);
hold on; legend off;
plot([40 40],[-100 0],'r--','LineWidth',2)
text(40.5,-5,'\leftarrow Interference Direction','Interpreter','tex','Color','r','FontSize',10)

% 均匀面阵
cair = 344.21;
f = 10.0e3;
lambda = cair/f;
microphone = phased.OmnidirectionalMicrophoneElement('FrequencyRange',[20 20000]);
array = phased.URA('Element',microphone,'Size',[11,9],'ElementSpacing',0.5*lambda*[1,1]);
plotGratingLobeDiagram(array,f,[20;30],cair);

% 圆阵
N = 60;
fc = 400e6;
theta = 360/N;
thetarad = deg2rad(theta);
arclength = 0.5*(physconst('LightSpeed')/fc);
radius = arclength/thetarad;
ang = (0:N-1)*theta;
ang(ang >= 180.0) = ang(ang >= 180.0) - 360.0;
array = phased.ConformalArray;
array.ElementPosition = [radius*cosd(ang); radius*sind(ang); zeros(1,N)];
array.ElementNormal = [ang;zeros(1,N)];

pattern(array,1e9,[-180:180],0,'PropagationSpeed',physconst('LightSpeed'),...
'CoordinateSystem','polar','Type','powerdb','Normalize',true)

% 显示阵型:viewArray(array)

窄带宽带波束图仿真
https://github.com/rohithmars/BF_Plots
宽带波束图仿真
function plot_wide(freq_vec,micPos,doa,c)
f_min = freq_vec(1);
f_max = freq_vec(2);
f_vec = linspace(f_min,f_max,200);
resp = zeros(360,size(f_vec,2));
for k = 1:length(f_vec)
f = f_vec(k);
stv = exp(1i*2*pi*( f/c)*(micPos(1,:)'*cosd(doa)+micPos(2,:)'*sind(doa)));
a = exp(1i*2*pi*( f/c)*(micPos(1,:)'*cosd(1:360)+micPos(2,:)'*sind(1:360)));
resp(:,k) = a'*stv;
end
resp = abs(resp./max(max(abs(resp))));
pow = 20*log10(resp);
figure;mesh(f_vec,1:360,pow);axis ([f_vec(1), f_vec(end), 0,360, -inf, inf])
ylabel('Azimuth (Degrees)','fontsize',10,'fontweight','bold');
xlabel('Frequency (Hz)','fontsize',10,'fontweight','bold');
zlabel('Gain (dB)','fontsize',10,'fontweight','bold');
title('Beampattern','fontsize',10,'fontweight','bold')
end

%% This is a program for plotting the beampattern of wideband signals
clc;
close all;
clearvars;
%% ------- SET PARAMETER VALUES -----
fs = 16000;
micNum = 10;
micType = 'circular';
alg = 'DSB';
doa = 180;
c = 343;
freq_vec = [100, 8000];

%% ------- COMPUTE MICROPHONE POSITIONS -----
switch micType
case 'linear'
d = 0.02;
micPos(:,1) = [0:d:(micNum-1)*d];
micPos(:,2) = zeros(micNum,1);
case 'circular'
r = 0.1;
theta = [0:360/micNum:(micNum-1)*360/micNum];
micPos(:,1) = r*cosd(theta);
micPos(:,2) = r*sind(theta);
end
micPos = micPos.';
%%
plot_wide(freq_vec,micPos,doa,c)

窄带波束图仿真
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This function plots the narrowband beampattern
% Inputs
% freq - frequency
% micPos - microphone position
% doa - direction-of-arrival
% c - velocity of sound
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function plot_narrow(freq,micPos,doa,c)
stv = exp(1i*2*pi*(freq/c)*(micPos(1,:)'*cosd(doa)+ micPos(2,:)'*sind(doa)));
a = exp(1i*2*pi*(freq/c)*(micPos(1,:)'*cosd(1:360)+ micPos(2,:)'*sind(1:360)));
resp = a'*stv;
resp = abs(resp./max(abs(resp)));
pow = 20*log10(resp);
figure;plot(1:360,(pow),'linewidth',2);axis ([0, 360, -inf, inf])
xlabel('Azimuth (Degrees)','fontsize',10,'fontweight','bold');
ylabel('Gain (dB)','fontsize',10,'fontweight','bold');
title('Beampattern','fontsize',10,'fontweight','bold')
end

%% This is a program for plotting the beampattern of narrowband signals
clc;
close all;
clearvars;
%% ------- SET PARAMETER VALUES -----
fs = 16000;
micNum = 10;
micType = 'linear';
alg = 'DSB';
doa = 90;
c = 342;
freq = 4000;
%% ------- COMPUTE MICROPHONE POSITIONS -----
switch micType
case 'linear'
d = 0.02;
micPos(:,1) = [0:d:(micNum-1)*d];
micPos(:,2) = zeros(micNum,1);
case 'circular'
r = 0.1;
theta = [0:360/micNum:(micNum-1)*360/micNum];
micPos(:,1) = r*cosd(theta);
micPos(:,2) = r*sind(theta);
end
micPos = micPos.';
%%
plot_narrow(freq,micPos,doa,c)


% 频率不变波束形成 ?
clear all; close all; clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
D = 4;
N = 32; %阵元数
f_max = 6000; %目标信号最高频率
f_min = 500; %目标信号最低频率
c = 1500; %声速
d = 0.18;
ft = 1000; %目标信号频率
fd = 6000;
L = c/ft; %波长
fs = 25000; %采样频率
M = 512;
for qq = 30
theta1 = qq*pi/180; %目标信号方位角
t1 = d*sin(theta1)/c; %目标信号延时
NUM = 512; %存储器长度
New = 256;
step = 32;
DT = 5; %检测域
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
signal = zeros(N,NUM);
for n = 1:1:N
for num = 1:1:NUM
signal(n,num) = cos(2*pi*ft*(num/fs+(n-1)*t1));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%for k=1:1:N
% signal(k,:)=signal(k,:)+randn(1,NUM);
%end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% temporal fft
Ns = 512
FFTsignal = zeros(N,Ns);
for i = 1:N
FFTsignal(i,:) = fft(signal(i,:),Ns); % 32 array 1024 point fft
end
% TRANSPOSE
LINE_min = floor(f_min/(fs/Ns));
LINE_max = ceil(f_max/(fs/Ns));
trans = zeros(LINE_max-LINE_min+1,N*D);
for i = LINE_min:LINE_max
for j = 1:N
trans(i-LINE_min+1,j) = FFTsignal(j,i);
end
end
for i = 1:LINE_max-LINE_min+1
FFTsignal1(i,:) = fft(trans(i,:),N*D);
end
Q = fs*N*D*d/(c*M);

kkk = 1;
for kk = 1:-1/step:1/step
for k = LINE_min:LINE_max
tmk(kkk,k-LINE_min+1) = ceil(Q*k*kk)+1;
end
kkk = kkk+1;
end

kkk = 1;
for kk = 1:-1/step:1/step
for k = LINE_min:LINE_max
tmd(kkk,k-LINE_min+1) = floor(N*D-Q*k*kk)+1;
end
kkk = kkk+1;
end

MAPsignal = zeros(2*step+1,M);
for w = 1:step
for k = 1:LINE_max-LINE_min+1
MAPsignal(w,k+LINE_min-1) = FFTsignal1(k,tmd(w,k));
end
end

for w = 1:step
for k = 1:LINE_max-LINE_min+1
MAPsignal(w+step+1,k+LINE_min-1) = FFTsignal1(k,tmk(step+1-w,k));
end
end

for k = 1:LINE_max-LINE_min+1
MAPsignal(step+1,k+LINE_min-1) = FFTsignal1(k,1);
end

sum_signal1 = zeros(1,2*step+1);
for k = 1:2*step+1
for i = 1:Ns
sum_signal1(1,k) = sum_signal1(1,k)+abs(MAPsignal(k,i))*abs(MAPsignal(k,i));
end
end

figure;
hold
subplot(1,1,1);
plot(asin(-1:1/step:1)*180/pi,sqrt(sum_signal1),'r');
plot(asin(-1:1/step:1)*180/pi,sqrt(sum_signal1),'.');
grid
end

https://link.springer.com/chapter/10.1007/978-3-662-04619-7_2 超指向麦克风阵列

开源工程
http://www.hark.jp/wiki.cgi?page=Softwares#p10
http://bass-db.gforge.inria.fr/bss_locate/#bss_locate 盲信号DOA估计
https://github.com/introlab/manyears
https://github.com/seanwood/gcc-nmf GCC-nmf(python)

非常好的波束形成图文教程
http://www.labbookpages.co.uk/audio/beamforming.html
ArrayToolbox的资料:
http://www.engr.uky.edu/~donohue/audio/Arrays/MAToolbox.htm#_Delay_Functions
相控阵设计与分析
https://cn.mathworks.com/products/phased-array/features.html#phased-array-design-and-analysis
https://cn.mathworks.com/products/phased-array/code-examples.html

http://www.cnblogs.com/xingshansi/p/6621185.html GSC算法学习与阻塞矩阵构建
https://wenku.baidu.com/view/5edd640a0740be1e650e9ae1.html
http://see.xidian.edu.cn/uploads/intro/xueke/xinhao/xshnh/bobaolin.pdf
http://www.eng.biu.ac.il/gannot/publications/journal-papers/      问阻塞矩阵构建时黄公平发给的资料

http://www.cnblogs.com/xingshansi/p/6621185.html
http://sci-hub.cc/10.1109/tasl.2007.907430              基于最小互信息构造阻塞矩阵
http://www.cnblogs.com/xingshansi/p/6937259.html
http://www.cnblogs.com/xingshansi/p/6943833.html

https://github.com/funcwj beamformer + DNN + mask        一个西工大老师的多个开源工程

https://github.com/fgnt/nn-gev Neural network based GEV beamformer

一个搞水声的人的博客,可以学习下
http://blog.sciencenet.cn/home.php?mod=space&uid=3260196&do=blog&view=me&from=space

Spherical Microphone array Impulse Response generator
https://github.com/ehabets/SMIR-Generator
Fixed and Adaptive Beamforming for Microphone array of 8(8麦固定波束形成)
https://github.com/kreiley/Beamforming
球形麦克风阵声场分析工具
https://github.com/QULab/sound_field_analysis-py
GSC波束形成Matlab代码
https://github.com/jgarciagimenez/GSC_beamforming
3D Sound Sources Mapping Using a Linear Microphone Array(SLAM Library)
https://github.com/daobilige-su/SSM_LinearArray
LCMV算法
https://github.com/wangwei2009/spatial-temporal-LCMV
可视化波束图设计
https://github.com/leewujung/beampattern_processing

webrtc阵列处理笔记
初始化:
target_cov_mats是通过delay_sum_masks功率谱再归一化得到的
interf_cov_mats是通过对归一化协方差矩阵和角度协方差矩阵取平衡得到的
reflected_interf_cov_mats与interf_cov_mats是共轭关系

rxiws target_cov_mats与delay_sum_masks做范数
rpsiws interf_cov_mats与delay_sum_masks做范数
reflected_rpsiws reflected_interf_cov_mats与delay_sum_masks做范数

核心处理流程
一、针对low_mean_start_bin与high_mean_end_bin内的频率点,做以下操作
1、输入信号eig_m归一化之后,与target_cov_mats做范数,得到rxim
2、rxiws[i]/rxim得到一个比率ratio_rxiw_rxim
3、eig_m与delay_sum_masks的共轭做内积运算(点乘后相加),再计算内积的功率rmw_r
4、先用
new_mask[i] = CalculatePostfilterMask(interf_cov_mats[i],eig_m,
rpsiws[i],ratio_rxiw_rxim,rmw_r,mask_thresholds[i]);
new_mask[i]*= CalculatePostfilterMask(reflected_interf_cov_mats[i],eig_m,
reflected_rpsiws[i],ratio_rxiw_rximrmw_r,mask_thresholds[i]);

二、计算final_mask
1、对new_mask做平滑运算得到time_smooth_mask
(1)对low_mean_start_bin与high_mean_end_bin内的频率点,对new_mask做平滑
(2)对low_mean_start_bin以前的频点,使用固定low_frequency_mask,它是通过low_mean_start_bin与low_mean_end_bin的低频范围内取平均算出来的
(3)对high_mean_end_bin对后的频点, 使用固定high_pass_postfilter_mask,它是通过high_mean_start_bin与high_mean_end_bin内的高频范围取平均算出来的
2、平滑后的time_smooth_mask赋给final_mask,然后再做一次频点间的前向平滑和后向平滑具体是
对low_mean_start_bin到kFreqBins间所有的频点做一次前向平滑
对high_mean_end_bin到0间的所有频点做一次后向平滑

论文阅读
Rm观测协方差矩阵、R
S表示干扰信号,XI表示期望信号,f(x)表示孔径,建模为Dirac delta function
Gabor frame function、Gabor system

已知量:阵列采样信号Y,期望信号的孔径函数f、干扰信号S的方差密度

为了确定g的值,很自然的想到用一个准则:相位差和正规化

猜你喜欢

转载自www.cnblogs.com/icoolmedia/p/array_signal_processing_info.html