概述
DMA(differential microphone arrays)是麦克风阵列处理中一种很重要的信号处理方法,特别是在多通道语音增强中的应用。差分麦克风阵列应用场景其目标信号一般是来自于端射方向,比较典型的如当今比较热门的蓝牙耳机,耳机的端射方向和说话人嘴的位置基本在一条线上。本博文首先基于一阶差分(First order DMA)对双麦克风语音增强进行讲解差分麦克风的具体应用。
差分麦克风阵列不同于加性麦克风阵列,如filter_sum,mvdr,gsc之类的算法,差分麦克风阵列是通过设定null方向来决定其主瓣的形状的,而filter_sum,mvdr等之类的算法是通过设定主瓣本身来决定其主瓣形状的。
DMA特点
差动麦克风阵列的方向性是通过两个或多个全指向麦克风之间的声压差来实现的。与加法麦克风阵列相比,差分麦克风阵列具有以下优点:
[En]
The directivity of the differential microphone array is realized by the sound pressure difference between two or more all-pointing microphones. Over the additive microphone array, the differential microphone array has the following advantages:
(1)对于频率具有不变性的beampattern,因此非常适合处理宽带语音信号
(2)其指向性不仅对高频有效,对低频同样有效
(3)对于给定具体数量的麦克风,差分麦克风阵列更容易获得最大的指向性增益
同样的差动麦克风也有自己的缺点:
[En]
The same differential microphone has its own drawbacks:
(1)差分麦克风的上述优点的前提是麦克风之间的间隔要足够小,否则会导致频率的空间混叠。
(2)差分麦克风阵列具有高通特性,因此通过其处理后需要进行补偿
(3)频率响应和DMA的阶数对麦克风阵列相对声源的位置和角度较为敏感
原理
beampattern定义
有M个全指向麦克风,麦克风之间的间距为d,声速c=340m/s,那么可以求得该阵列的导向矢量为:
其 中 w = 2 ∗ p i ∗ f 其中w=2pif 其中w =2 ∗p i ∗f,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=wtao0 << 2pi w δ/c =w ∗t a o 0 <<2 ∗p i
该条件对于低频还比较容易满足,因为λ = 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
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滤波处理的结果。关于一阶差分麦的介绍就到此结束,如果大家有什么疑问欢迎留言讨论,若有不当之处也请指出。
Original: https://blog.csdn.net/pikaqiu_n95/article/details/125119542
Author: pikaqiu_n95
Title: 麦克风阵列之一阶差分麦克风阵列
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/498036/
转载文章受原作者版权保护。转载请注明原作者出处!