主要内容

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

这个例子说明了麦克风阵列波束形成,以提取所需的语音信号在干扰占主导地位,噪声环境。这样的操作有助于提高语音信号的质量,以进行感知或进一步处理。例如,嘈杂的环境可以是交易室,麦克风阵列可以安装在交易计算机的监视器上。如果交易计算机必须接受来自交易者的语音命令,波束形成器操作对于提高接收语音质量和实现设计的语音识别精度至关重要。

这个例子展示了两种类型的时域波束形成器:时延波束形成器和弗罗斯特波束形成器。它说明了如何使用对角加载来提高弗罗斯特波束形成器的鲁棒性。如果你的系统有声音支持,你可以在每个处理步骤听语音信号。金宝app

定义一个统一线性数组

首先,我们定义一个统一线性阵列(ULA)来接收信号。该阵列包含10个全向麦克风,元件间距为5厘米。

麦克风=...分阶段。OmnidirectionalMicrophoneElement (“FrequencyRange”20 e3, [20]);Nele = 10;齿龈= phased.ULA (Nele, 0.05,“元素”、麦克风);c = 340;%声速,单位为米/秒

模拟接收信号

接下来,我们模拟麦克风阵列接收到的多通道信号。我们首先载入两段演讲录音和一段笑声录音。我们还加载了笑声音频片段作为干扰。音频信号的采样频率为8khz。

由于音频信号通常很大,将整个信号读入存储器通常是不实际的。因此,在本例中,我们将以流的方式模拟和处理信号,即在输入端将信号分解成小块,处理每个块,然后在输出端组装它们。

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

ang_dft = [-30;0);ang_cleanspeech = [-10;10);ang_laughter = [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- 4w的白噪声信号来表示每个传感器的热噪声。本地随机数流确保了结果的可重复性。

prev = rng (2008);noisePwr = 1的军医;%噪声功率

现在我们开始模拟。在输出端,接收到的信号存储在一个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);设置音频设备写入器audioWriter = audioDeviceWriter (“SampleRate”fs,...“金宝appSupportVariableSizeInput”,真正的);isAudio金宝appSupported =(长度(getAudioDevices (audioWriter)) > 1);dftFileReader = dsp。AudioFileReader (“dft_voice_8kHz.wav”...“SamplesPerFrame”, NSampPerFrame);speechFileReader = dsp。AudioFileReader (“cleanspeech_voice_8kHz.wav”...“SamplesPerFrame”, NSampPerFrame);laughterFileReader = dsp。AudioFileReader (“laughter_8kHz.wav”...“SamplesPerFrame”, NSampPerFrame);%模拟m = 1:NSampPerFrame:NTSample sig_idx = m:m+NSampPerFrame-1;x1 = dftFileReader ();x2 = speechFileReader ();x3 = 2 * laughterFileReader ();温度=收集器([x1 x2 x3],...[ang_dft ang_cleanspeech ang_laughter]) +...√noisePwr * randn (NSampPerFrame Nele);如果isAudio金宝appSupported玩(audioWriter, 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]);

图中包含一个轴对象。标题为Signal Received at Channel 3的axis对象包含一个类型为line的对象。

时滞波束形成器的处理

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

angSteer = ang_dft;beamformer =分阶段。TimeDelayBeamformer (“SensorArray”、齿龈...“SampleRate”fs,“方向”angSteer,“PropagationSpeed”c)
beamformer =分阶段。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());如果isAudio金宝appSupported玩(audioWriter、临时);结束cbfOut (m: m + NSampPerFrame-1:) = temp;结束情节(t, cbfOut);包含(的时间(秒));ylabel (“振幅(V)”);标题(“时延波束形成器输出”);ylim (3 [3]);

图中包含一个轴对象。标题为Time Delay Beamformer Output的轴对象包含一个类型为line的对象。

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

agCbf = pow2db(意思是((voice_cleanspeech + voice_laugh)。^ 2 + noisePwr) /...意思是((cbfOut - voice_dft) ^ 2)。)
agCbf = 9.5022

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

用弗罗斯特波束形成器处理

通过在每个传感器上附加FIR滤波器,弗罗斯特波束形成器有更多的波束形成权值来抑制干扰。它是一种自适应算法,在学习到的干扰方向处置零,以更好地抑制干扰。在转向方向,弗罗斯特波束形成器使用无失真约束,以确保所需信号不被抑制。让我们创建一个霜波束形成与20点FIR后每个传感器。

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

接下来,用弗罗斯特波束形成器处理合成信号。

重置(signalsource);FrostOut = 0 (NTSample, 1);m = 1:NSampPerFrame:NTSample FrostOut(m:m+NSampPerFrame-1,:) =...frostbeamformer (signalsource (), ang_dft);结束

我们可以播放和绘制整个音频信号,一旦它被处理。

如果isAudio金宝appSupported玩(audioWriter FrostOut);结束情节(t, FrostOut);包含(的时间(秒));ylabel (“振幅(V)”);标题(“霜Beamformer输出”);ylim (3 [3]);

图中包含一个轴对象。标题为Frost Beamformer Output的axis对象包含一个类型为line的对象。

%计算数组增益agFrost = pow2db(意思是((voice_cleanspeech + voice_laugh)。^ 2 + noisePwr) /...意思是((FrostOut - voice_dft) ^ 2)。)
agFrost = 14.4385

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

使用对角加载来提高冰霜波束形成器的鲁棒性

接下来,我们想要将数组导向第二个语音信号的方向。假设我们不知道第二个语音信号的确切方向,只粗略估计了方位5度和仰角5度。

释放(frostbeamformer);ang_cleanspeech_est = [5;5);%估计操舵方向重置(signalsource);FrostOut2 = 0 (NTSample, 1);m = 1:NSampPerFrame:NTSample FrostOut2(m:m+NSampPerFrame-1,:) = frostbeamformer(signalsource(),...ang_cleanspeech_est);结束如果isAudio金宝appSupported玩(audioWriter FrostOut2);结束情节(t, FrostOut2);包含(的时间(秒));ylabel (“振幅(V)”);标题(“霜Beamformer输出”);ylim (3 [3]);

图中包含一个轴对象。标题为Frost Beamformer Output的axis对象包含一个类型为line的对象。

%计算数组增益agFrost2 = pow2db(意思是((voice_dft + voice_laugh)。^ 2 + noisePwr) /...意思是((FrostOut2 - voice_cleanspeech) ^ 2)。)
agFrost2 = 6.1927

演讲几乎听不见。尽管波束形成器获得了6.1 dB的增益,但由于方向不准确,性能受到了影响。一种提高弗罗斯特波束形成器稳健性的方法是使用对角加载。这种方法在估计协方差矩阵的对角元素上增加了一个小的量。这里我们用的对角线值是1e-3。

%指定对角线加载值释放(frostbeamformer);frostbeamformer。DiagonalLoadingFactor = 1 e - 3;重置(signalsource);FrostOut2_dl = 0 (NTSample, 1);m = 1:NSampPerFrame:NTSample FrostOut2_dl(m:m+NSampPerFrame-1,:) =...frostbeamformer (signalsource (), ang_cleanspeech_est);结束如果isAudio金宝appSupported玩(audioWriter FrostOut2_dl);结束情节(t, FrostOut2_dl);包含(的时间(秒));ylabel (“振幅(V)”);标题(“霜Beamformer输出”);ylim (3 [3]);

图中包含一个轴对象。标题为Frost Beamformer Output的axis对象包含一个类型为line的对象。

%计算数组增益agFrost2_dl = pow2db(意思是((voice_dft + voice_laugh)。^ 2 + noisePwr) /...意思是((FrostOut2_dl - voice_cleanspeech) ^ 2)。)
agFrost2_dl = 6.4788

现在输出的语音信号得到了改进,通过对角加载技术我们获得了0.3 dB的增益提高。

释放(frostbeamformer);释放(signalsource);如果isAudio金宝appSupported暂停(3);%清除AudioPlayer缓冲区释放(audioWriter);结束rng(上一页);

总结

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

参考

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