麦克风阵列之一阶差分麦克风阵列

概述

DMA(differential microphone arrays)是麦克风阵列处理中一种很重要的信号处理方法,特别是在多通道语音增强中的应用。差分麦克风阵列应用场景其目标信号一般是来自于端射方向,比较典型的如当今比较热门的蓝牙耳机,耳机的端射方向和说话人嘴的位置基本在一条线上。本博文首先基于一阶差分(First order DMA)对双麦克风语音增强进行讲解差分麦克风的具体应用。
差分麦克风阵列不同于加性麦克风阵列,如filter_sum,mvdr,gsc之类的算法,差分麦克风阵列是通过设定null方向来决定其主瓣的形状的,而filter_sum,mvdr等之类的算法是通过设定主瓣本身来决定其主瓣形状的。

DMA特点

差分麦克风阵列是通过两个或者更多个全指向麦克风来实现之间的声压差来实现其指向性的。相比加性麦克风阵列,差分麦克风阵列具有如下优点:
(1)对于频率具有不变性的beampattern,因此非常适合处理宽带语音信号
(2)其指向性不仅对高频有效,对低频同样有效
(3)对于给定具体数量的麦克风,差分麦克风阵列更容易获得最大的指向性增益
同样差分麦克风具有自身的缺陷:
(1)差分麦克风的上述优点的前提是麦克风之间的间隔要足够小,否则会导致频率的空间混叠。
(2)差分麦克风阵列具有高通特性,因此通过其处理后需要进行补偿
(3)频率响应和DMA的阶数对麦克风阵列相对声源的位置和角度较为敏感

原理

beampattern定义

在这里插入图片描述
有M个全指向麦克风,麦克风之间的间距为d,声速c=340m/s,那么可以求得该阵列的导向矢量为:
在这里插入图片描述
其 中 w = 2 ∗ p i ∗ f 其中w=2*pi*f w=2pif,tao = δ / c \delta/c δ/c λ = c / f \lambda=c / f λ=c/f,DMA假设麦克风之间的间隔 δ \delta δ远远小于 λ \lambda λ,即:
w δ / c = w ∗ t a o 0 < < 2 ∗ p i w\delta/c=w*tao0 << 2*pi wδ/c=wtao0<<2pi
该条件对于低频还比较容易满足,因为 λ = c / f \lambda=c / f λ=c/f,高频相对容易出现混叠。
对于上图中的每个麦克风输出端的权重H,写为一个向量的形式如下:
在这里插入图片描述
beampattern描述的是阵列对不同方向的敏感程度,具体定义如下:
在这里插入图片描述
θ \theta θ为入射角方向,即描述的是麦克风阵列对于不同入射角方向的敏感程度,或者说频率响应。
对于一阶DMA其beampattern为:
在这里插入图片描述
根据a1,1取不同的值可以得到不同的beampattern,比较典型的如下:
在这里插入图片描述
对应beampattern图如下:
在这里插入图片描述

一阶DMA

以双麦克风阵列为例,一阶DMA其端射方向在0度方向上,压制(null)方向在(0,180]范围内,因此其约束条件可以写为:
在这里插入图片描述
其中a1,1=cos θ \theta θ为null方向,-1<=a1,1<=1,上式可以进一步整理为:
在这里插入图片描述
这里一First-Order Cardioid为例进行讲解,其他类型的一阶DMA只是null的方向不同,即a1,1取值的区别而已,推导过程是一致的。
在first-order Cardioid的端射方向在0°,null方向在180°,即a1,1=-1. 因此,线性方程组为:
在这里插入图片描述
进一步推导可以写为(程序中采用该式):
在这里插入图片描述
利用近似求解ex=1+x可得:
在这里插入图片描述
进一步:
在这里插入图片描述
其beampattern为:
在这里插入图片描述
求H

frameLength = 256;
inc = frameLength/2;

 c = 340;
 tao0 = d/c;

 N = frameLength;
 omega = zeros(N/2+1,1);
 HL = zeros(1,N/2+1);
 H = zeros(2,N/2+1);
         
frameNum = size(X,1);
half_bin = size(X,3);

for k = 4:N/2+1
    omega(k) = 2*pi*(k-1)*fs/N;
    HL(k) = 1/(1-exp(1j*omega(k)*tao0*(alpha_1_1-cos(theta_target)))) * 0.5;        
    %HL(k) = 1j/(omega(k)*tao0*(alpha_1_1-cos(theta_target)));  % approximating e^x with 1+x
    H(:,k) = HL(k)*[1;
                    -exp(1j*omega(k)*tao0*alpha_1_1)];
end

beamout = beampolar(H,d,tao0);
figure;
polarplot(linspace(0,2*pi,360),abs(beamout(:,64)));

beampattern

function [beampattern] = beampolar(weights,spacing,tao0)

f = 1:1:20000;
theta = linspace(0,2*pi,360);   % scaning angle
d = spacing;
c = 340;
% tao0 = d/c;
tao = tao0*cos(theta);

omega = 2*pi*f;

half_bin = size(weights,2);
fs = 16000;
N_FFT = (half_bin-1)*2;

Nele = size(weights,1);
H = zeros(Nele,length(omega));

beampattern = zeros(length(theta),length(half_bin)); % beamformer output
for ang = 1:length(theta)
    for freIndex = 1:half_bin
        omega_k = 2*pi*(freIndex-1)*fs/N_FFT; % normalized digital angular frequency
%         omega_k = omega(freIndex);          % analog angular frequency
        a = [1,exp(-1j*omega_k*tao(ang))];  % signal model,steering vector
        beampattern(ang,freIndex) = a*(weights(:,freIndex)); % y = w'*a,此处为beampattern原始定义方式求解;
    end   
end

end

绘制beampattern图如下:
在这里插入图片描述
滤波结果:
在这里插入图片描述
上图中,上面部分是输入两路信号的一路,另外一路是first-order Cardioid滤波处理的结果。关于一阶差分麦的介绍就到此结束,如果大家有什么疑问欢迎留言讨论,若有不当之处也请指出。

猜你喜欢

转载自blog.csdn.net/pikaqiu_n95/article/details/125119542