Этот пример иллюстрирует формирование луча микрофонной матрицы для выделения требуемых речевых сигналов в среде с преобладанием помех и шума. Такие операции полезны для улучшения качества речевого сигнала для восприятия или дальнейшей обработки. Например, шумной средой может быть торговый зал, а микрофонная решетка может быть установлена на мониторе торгового компьютера. Если торговый компьютер должен принимать речевые команды от трейдера, операция формирователя луча имеет решающее значение для повышения качества принимаемой речи и достижения заданной точности распознавания речи.
В примере показаны два типа формирователей луча временной области: формирователь луча временной задержки и формирователь луча Frost. На ней также показано, как можно использовать диагональную нагрузку для повышения надежности формирователя луча Frost. На каждом этапе обработки можно прослушивать речевые сигналы.
В этом примере требуется панель инструментов системы фазированных массивов.
Сначала определите однородную линейную матрицу (ULA) для приема сигнала. Массив содержит 10 ненаправленных элементов (микрофонов), разнесенных на 5 см друг от друга. Установите верхнюю границу для представляющего интерес частотного диапазона в 4 кГц, поскольку сигналы, используемые в этом примере, дискретизируются на 8 кГц.
microphone = ... phased.OmnidirectionalMicrophoneElement('FrequencyRange',[20 4000]); Nele = 10; ula = phased.ULA(Nele,0.05,'Element',microphone); c = 340; % speed of sound, in m/s
Затем смоделируйте многоканальный сигнал, принятый матрицей микрофонов. В качестве представляющего интерес звука используются два речевых сигнала. В качестве помех используется звуковой сегмент смеха. Частота дискретизации звуковых сигналов составляет 8 кГц.
Поскольку аудиосигналы обычно большие, считывать весь сигнал в память часто нецелесообразно. Поэтому в этом примере вы считываете и обрабатываете сигнал потоковым способом, то есть разбиваете сигнал на небольшие блоки на входе, обрабатываете каждый блок, а затем собираете их на выходе.
Направление падения первого речевого сигнала составляет -30 градусов по азимуту и 0 градусов по возвышению. Направление второго речевого сигнала -10 градусов по азимуту и 10 градусов по возвышению. Пересечение происходит от 20 градусов по азимуту и 0 градусов по отметке.
ang_dft = [-30; 0]; ang_cleanspeech = [-10; 10]; ang_laughter = [20; 0];
Теперь можно использовать широкополосный коллектор для моделирования 3-секундного сигнала, принимаемого массивом. Обратите внимание, что этот подход предполагает, что каждый входной одноканальный сигнал принимается в начале массива одним микрофоном.
fs = 8000; collector = phased.WidebandCollector('Sensor',ula,'PropagationSpeed',c, ... 'SampleRate',fs,'NumSubbands',1000,'ModulatedInput', false); t_duration = 3; % 3 seconds t = 0:1/fs:t_duration-1/fs;
Создайте сигнал белого шума мощностью 1e-4 Вт для представления теплового шума для каждого датчика. Локальный поток случайных чисел обеспечивает воспроизводимые результаты.
prevS = rng(2008); noisePwr = 1e-4;
Запустите моделирование. На выходе принятый сигнал запоминается в 10-столбцовой матрице. Каждый столбец матрицы представляет сигнал, собранный одним микрофоном. Следует отметить, что звук воспроизводится во время моделирования.
% preallocate NSampPerFrame = 1000; NTSample = t_duration*fs; sigArray = zeros(NTSample,Nele); voice_dft = zeros(NTSample,1); voice_cleanspeech = zeros(NTSample,1); voice_laugh = zeros(NTSample,1); % set up audio device writer player = 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); % simulate for 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_laughter]) + ... sqrt(noisePwr)*randn(NSampPerFrame,Nele); player(0.5*temp(:,3)); sigArray(sig_idx,:) = temp; voice_dft(sig_idx) = x1; voice_cleanspeech(sig_idx) = x2; voice_laugh(sig_idx) = x3; end
Заметьте, что смех маскирует речевые сигналы, делая их невразумительными. Постройте график сигнала в канале 3.
plot(t,sigArray(:,3)); xlabel('Time (sec)'); ylabel ('Amplitude (V)'); title('Signal Received at Channel 3'); ylim([-3 3]);

Формирователь луча временной задержки компенсирует разности времени прихода по матрице для сигнала, поступающего из конкретного направления. Синхронизированные по времени многоканальные сигналы когерентно усредняются для улучшения отношения сигнал/шум (SNR). Определите угол поворота, соответствующий направлению падения первого речевого сигнала, и создайте формирователь луча временной задержки.
angSteer = ang_dft; beamformer = phased.TimeDelayBeamformer('SensorArray',ula, ... 'SampleRate',fs,'Direction',angSteer,'PropagationSpeed',c)
beamformer =
phased.TimeDelayBeamformer with properties:
SensorArray: [1x1 phased.ULA]
PropagationSpeed: 340
SampleRate: 8000
DirectionSource: 'Property'
Direction: [2x1 double]
WeightsOutputPort: false
Обработать синтезированный сигнал, затем построить график и прослушать выходной сигнал обычного формирователя луча.
signalsource = dsp.SignalSource('Signal',sigArray, ... 'SamplesPerFrame',NSampPerFrame); cbfOut = zeros(NTSample,1); for m = 1:NSampPerFrame:NTSample temp = beamformer(signalsource()); player(temp); cbfOut(m:m+NSampPerFrame-1,:) = temp; end plot(t,cbfOut); xlabel('Time (s)'); ylabel ('Amplitude'); title('Time Delay Beamformer Output'); 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 дБ. Однако фоновый смех все равно сравним с речью. Чтобы получить лучшую производительность формирователя луча, используйте формирователь луча Frost.
За счет прикрепления фильтров FIR к каждому датчику формирователь луча Frost имеет больше весов для формирования луча для подавления помех. Это адаптивный алгоритм, который размещает нули в изученных направлениях помех, чтобы лучше подавить помехи. В рулевом направлении формирователь луча Frost использует ограничения без искажений, чтобы гарантировать, что желаемые сигналы не подавляются. Создайте формирователь луча Frost с 20-краевым FIR после каждого датчика.
frostbeamformer = ... phased.FrostBeamformer('SensorArray',ula,'SampleRate',fs, ... 'PropagationSpeed',c,'FilterLength',20,'DirectionSource','Input port');
Обработка и воспроизведение синтезированного сигнала с помощью формирователя луча Frost.
reset(signalsource); FrostOut = zeros(NTSample,1); for m = 1:NSampPerFrame:NTSample temp = frostbeamformer(signalsource(),ang_dft); player(temp); FrostOut(m:m+NSampPerFrame-1,:) = temp; end plot(t,FrostOut); xlabel('Time (sec)'); ylabel ('Amplitude (V)'); title('Frost Beamformer Output'); ylim([-3 3]); % Calculate the array gain agFrost = pow2db(mean((voice_cleanspeech+voice_laugh).^2+noisePwr)/ ... mean((FrostOut - voice_dft).^2))
agFrost = 14.4385

Обратите внимание, что пересечение теперь отменено. Формирователь луча Мороза имеет коэффициент усиления матрицы 14,5 дБ, что примерно на 5 дБ выше коэффициента усиления формирователя луча временной задержки. Улучшение производительности впечатляет, но имеет высокую вычислительную стоимость. В предыдущем примере для каждого микрофона используется фильтр КИХ порядка 20. При работе со всеми 10 датчиками требуется инвертировать матрицу 200 на 200, что может быть дорого при обработке в реальном времени.
Затем направьте матрицу в направлении второго речевого сигнала. Предположим, что известна только приблизительная оценка азимута -5 градусов и отметки 5 градусов для направления второго речевого сигнала.
release(frostbeamformer); ang_cleanspeech_est = [-5; 5]; % Estimated steering direction reset(signalsource); FrostOut2 = zeros(NTSample,1); for m = 1:NSampPerFrame:NTSample temp = frostbeamformer(signalsource(), ang_cleanspeech_est); player(temp); FrostOut2(m:m+NSampPerFrame-1,:) = temp; end plot(t,FrostOut2); xlabel('Time (sec)'); ylabel ('Amplitude (V)'); title('Frost Beamformer Output'); ylim([-3 3]); % Calculate the array gain agFrost2 = pow2db(mean((voice_dft+voice_laugh).^2+noisePwr)/ ... mean((FrostOut2 - voice_cleanspeech).^2))
agFrost2 =
6.1927

Речь едва слышна. Несмотря на усиление 6,1 дБ от формирователя луча, производительность страдает от неточного направления рулевого управления. Одним из способов повышения надежности формирователя луча Мороза по отношению к несоответствию направления прибытия является использование диагональной нагрузки. Этот подход добавляет небольшую величину к диагональным элементам матрицы оцененной ковариации. Недостатком этого способа является то, что трудно оценить правильный коэффициент нагрузки. Здесь вы попробуете диагональную загрузку со значением 1e-3.
% Specify diagonal loading value release(frostbeamformer); frostbeamformer.DiagonalLoadingFactor = 1e-3; reset(signalsource); FrostOut2_dl = zeros(NTSample,1); for m = 1:NSampPerFrame:NTSample temp = frostbeamformer(signalsource(),ang_cleanspeech_est); player(temp); FrostOut2_dl(m:m+NSampPerFrame-1,:) = temp; end plot(t,FrostOut2_dl); xlabel('Time (sec)'); ylabel ('Amplitude (V)'); title('Frost Beamformer Output'); ylim([-3 3]); % Calculate the array gain agFrost2_dl = pow2db(mean((voice_dft+voice_laugh).^2+noisePwr)/ ... mean((FrostOut2_dl - voice_cleanspeech).^2))
agFrost2_dl =
6.4788

Выходной речевой сигнал улучшается, и вы получаете улучшение усиления 0,3 дБ из метода диагональной нагрузки.
release(frostbeamformer); release(signalsource); release(player); rng(prevS);
В этом примере показано, как использовать формирователи луча во временной области для извлечения речевых сигналов из измерений в матрице шумных микрофонов. Пример также показывает, как имитировать сигнал, доминирующий в помехах, принимаемый матрицей микрофонов. В примере использовались как временная задержка, так и формирователи луча Frost и сравнивались их характеристики. Формирователь луча Мороза имеет лучшую возможность подавления помех. Пример также иллюстрирует использование диагональной нагрузки для улучшения надежности формирователя луча Мороза.
[1] О. Л. Фрост III, Алгоритм линейной адаптивной обработки массива с ограничением, Proceedings of the IEEE, Vol. 60, Number 8, Aug. 1972, pp. 925-935.