主要内容

使用麦克风阵列的声学波束形成

这个例子说明了麦克风阵列波束形成,以提取所需的语音信号在干扰为主,噪声环境。这些操作有助于增强语音信号的质量,以便进行感知或进一步处理。例如,嘈杂的环境可以是交易室,麦克风阵列可以安装在交易计算机的显示器上。如果交易计算机必须接受交易者的语音指令,波束形成操作对于提高接收到的语音质量和达到设计的语音识别精度至关重要。

本例展示了两种时域波束形成器:时延波束形成器和弗罗斯特波束形成器。它还说明了如何使用对角加载来提高Frost波束形成器的健壮性。您可以在每个处理步骤收听语音信号。

这个例子需要相控阵系统工具箱。

定义一个统一的线性阵列

首先,定义一个统一线性阵列(ULA)来接收信号。该阵列包含10个全向元素(麦克风),间隔5厘米。将感兴趣的频率范围的上限设置为4 kHz,因为本例中使用的信号是在8 kHz采样的。

麦克风=...分阶段。OmnidirectionalMicrophoneElement (“FrequencyRange”[4000]);Nele = 10;ula = phase . ula (Nele,0.05,“元素”、麦克风);C = 340;声速的%,单位为m/s

模拟接收信号

接下来,模拟麦克风阵列接收到的多通道信号。两个语音信号被用作感兴趣的音频。用笑声音频段作为干扰。音频信号的采样频率为8千赫。

由于音频信号通常很大,将整个信号读入内存通常是不现实的。因此,在本例中,您以流方式读取和处理信号,即在输入处将信号分解为小块,处理每个块,然后在输出处将它们组合起来。

第一语音信号的入射方向为方位角-30度,仰角0度。第二语音信号的方向为方位角-10度,仰角10度。干扰来自方位角20度,仰角0度。

Ang_dft = [-30;0);Ang_cleanspeech = [-10;10);ang_laugh = [20;0);

现在您可以使用宽带收集器来模拟阵列接收到的3秒信号。注意,这种方法假设每个输入单通道信号都由一个麦克风在阵列的原点接收。

Fs = 8000;收集器=阶段性。WidebandCollector (“传感器”、齿龈“PropagationSpeed”c...“SampleRate”fs,“NumSubbands”, 1000,“ModulatedInput”、假);T_duration = 3;% 3秒T = 0:1/fs:t_duration-1/fs;

生成功率为1e-4瓦的白噪声信号来表示每个传感器的热噪声。局部随机数流确保了可再现的结果。

prevS = rng(2008);noisePwr = 1e-4;

运行模拟。在输出端,接收到的信号存储在一个10列矩阵中。矩阵的每一列表示一个麦克风收集到的信号。注意,音频在模拟过程中会回放。

% preallocateNSampPerFrame = 1000;NTSample = t_duration*fs;sigArray = 0 (NTSample,Nele);voice_dft = 0 (NTSample,1);voice_cleanspeech = 0 (NTSample,1);voice_laugh = 0 (NTSample,1);%设置音频设备写入器播放器= audioDeviceWriter(“SampleRate”fs);dftFileReader = dsp。AudioFileReader (“SpeechDFT-16-8-mono-5secs.wav”...“SamplesPerFrame”, NSampPerFrame);speechFileReader = dsp。AudioFileReader (“FemaleSpeech-16-8-mono-3secs.wav”...“SamplesPerFrame”, NSampPerFrame);laughterFileReader = dsp。AudioFileReader (“Laughter-16-8-mono-4secs.wav”...“SamplesPerFrame”, NSampPerFrame);%模拟m = 1:NSampPerFrame:NTSample sig_idx = m:m+NSampPerFrame-1;x1 = dftFileReader();x2 = speechFileReader();x3 = 2*laughterFileReader();Temp = collector([x1 x2 x3],...[ang_dft ang_cleanspeech ang_laugh]) +...√noisePwr * randn (NSampPerFrame Nele);播放器(0.5 *临时(:,3));sigArray(sig_idx,:) = temp;Voice_dft (sig_idx) = x1;Voice_cleanspeech (sig_idx) = x2;Voice_laugh (sig_idx) = x3;结束

请注意,笑声掩盖了语言信号,使它们变得难以理解。画出通道3的信号。

情节(t, sigArray (:, 3));包含(的时间(秒));ylabel (“振幅(V)”);标题(“在第三频道收到信号”);ylim (3 [3]);

使用时间延迟波束形成器处理

时延波束形成器对来自特定方向的信号在整个阵列上的到达时间差进行补偿。对时间对准的多通道信号进行相干平均,以提高信噪比。定义与第一语音信号的入射方向相对应的转向角并构造时延波束形成器。

angSteer = ang_dft;波束形成器=相控。TimeDelayBeamformer (“SensorArray”、齿龈...“SampleRate”fs,“方向”angSteer,“PropagationSpeed”c)
波束形成器=相控。TimeDelayBeamformer属性:SensorArray: [1x1相控。ULA] PropagationSpeed: 340 SampleRate: 8000 DirectionSource: 'Property' Direction: [2x1 double] WeightsOutputPort: false

对合成信号进行处理,然后绘制常规波束形成器的输出信号并进行监听。

Signalsource = dsp。SignalSource (“信号”sigArray,...“SamplesPerFrame”, NSampPerFrame);cbfOut = 0 (NTSample,1);m = 1:NSampPerFrame:NTSample temp = beamformer(signalsource());球员(临时);cbfOut(m:m+NSampPerFrame-1,:) = temp;结束情节(t, cbfOut);包含(“时间(s)”);ylabel (“振幅”);标题(延时波束输出);ylim (3 [3]);

您可以通过阵列增益来测量语音增强,这是输出信噪比(SINR)与输入SINR的比值。

agCbf = pow2db(mean((voice_cleanspeech+voice_laugh).^2+noisePwr)/...mean((cbfOut - voice_dft).^2))
agCbf = 9.5022

请注意,第一个语音信号开始出现在时延波束形成器输出中。SINR提高了9.4 dB。然而,背景笑声仍然可以与演讲相媲美。为了获得更好的波束形成器性能,可以使用Frost波束形成器。

用冰霜光束发生器处理

通过在每个传感器上附加FIR滤波器,Frost波束形成器具有更多的波束形成权值来抑制干扰。它是一种自适应算法,在学习到的干扰方向放置空值以更好地抑制干扰。在转向方向上,Frost波束形成器使用无失真约束以确保所需信号不被抑制。创建一个Frost波束形成器,每个传感器后都有一个20分的FIR。

frostbeamformer =...分阶段。FrostBeamformer (“SensorArray”、齿龈“SampleRate”fs,...“PropagationSpeed”c“FilterLength”, 20岁,“DirectionSource”输入端口的);

使用弗罗斯特波束形成器处理和播放合成信号。

重置(signalsource);FrostOut =零(NTSample,1);m = 1:NSampPerFrame:NTSample temp = frostbeamformer(signalsource(),ang_dft);球员(临时);FrostOut(m:m+NSampPerFrame-1,:) = temp;结束情节(t, FrostOut);包含(的时间(秒));ylabel (“振幅(V)”);标题(“霜波束输出”);ylim (3 [3]);计算数组增益agFrost = pow2db(mean((voice_cleanspeech+voice_laugh).^2+noisePwr)/...mean((FrostOut - voice_dft).^2))
agFrost = 14.4385

注意,现在干扰被取消了。Frost波束形成器的阵列增益为14.5 dB,比时延波束形成器高出约5 dB。性能的提高令人印象深刻,但有很高的计算成本。在上面的例子中,每个麦克风都使用了一个20阶的FIR滤波器。对于所有10个传感器,它需要反转一个200 × 200的矩阵,这在实时处理中可能是昂贵的。

利用对角加载提高霜束形成器的鲁棒性

接下来,将该阵列转向第二个语音信号的方向。假设您只知道第二个语音信号方向的方位角-5度和仰角5度的粗略估计。

释放(frostbeamformer);Ang_cleanspeech_est = [-5;5);估计转向方向重置(signalsource);FrostOut2 = 0 (NTSample,1);m = 1:NSampPerFrame:NTSample temp = frostbeamformer(signalsource(), ang_cleanspeech_est);球员(临时);FrostOut2(m:m+NSampPerFrame-1,:) = temp;结束情节(t, FrostOut2);包含(的时间(秒));ylabel (“振幅(V)”);标题(“霜波束输出”);ylim (3 [3]);计算数组增益agFrost2 = pow2db(mean((voice_dft+voice_laugh).^2+noisePwr)/...mean((FrostOut2 - voice_cleanspeech).^2))
agFrost2 = 6.1927

演讲几乎听不见。尽管从波束形成器6.1 dB增益,性能受到不准确的转向方向。一种提高弗罗斯特波束形成器抗到达方向不匹配的鲁棒性的方法是使用对角加载。这种方法给估计的协方差矩阵的对角线元素增加了一个小的量。这种方法的缺点是难以估计正确的加载系数。这里您尝试使用值为1e-3的对角线加载。

指定对角线加载值释放(frostbeamformer);frostbeamformer。DiagonalLoadingFactor = 1e-3;重置(signalsource);FrostOut2_dl = 0 (NTSample,1);m = 1:NSampPerFrame:NTSample temp = frostbeamformer(signalsource(),ang_cleanspeech_est);球员(临时);FrostOut2_dl(m:m+NSampPerFrame-1,:) = temp;结束情节(t, FrostOut2_dl);包含(的时间(秒));ylabel (“振幅(V)”);标题(“霜波束输出”);ylim (3 [3]);计算数组增益agFrost2_dl = pow2db(mean((voice_dft+voice_laugh).^2+noisePwr)/...mean((FrostOut2_dl - voice_cleanspeech).^2))
agFrost2_dl = 6.4788

输出语音信号得到改善,从对角加载技术中获得0.3 dB增益改善。

释放(frostbeamformer);释放(signalsource);释放(球员);rng(上一页);

总结

这个例子展示了如何使用时域波束形成器从噪声麦克风阵列测量中检索语音信号。该示例还演示了如何模拟麦克风阵列接收的干扰主导信号。实例中同时使用了时延和弗罗斯特波束形成器,并对它们的性能进行了比较。Frost波束形成器具有较好的干扰抑制能力。该实例还说明了使用对角加载来提高弗罗斯特波束形成器的鲁棒性。

参考

[1] O. L. Frost III,线性约束自适应阵列处理算法,IEEE学报,第60卷,第8期,1972年8月,第925-935页。