Создайте эхометр, используя Audio Measurements

Этот пример показывает, как создать гидроакустический эхометр с использованием сбора данных аудиоданных и обработки сигналов, который может измерить расстояние путем определения времени рейса звукового импульса, отраженного от поверхности.

Этот пример использует подход для последующей синхронизации временных меток выхода звука и входных данных, который необходим для приложений, где входной сигнал является ответом на выход и/или когда релевантна корреляция времени вывода/входа. Примеры применения включают настройку акустической характеристики или эксперименты с стимул-реакцией. Относительная задержка вывода/входа определяется и корректируется с помощью функций корреляции в Signal Processing Toolbox.

Требования

  • MATLAB R2020a или более поздней версии

  • Data Acquisition Toolbox

  • Data Acquisition Toolbox пакета поддержки для звуковых карт Windows

  • Signal Processing Toolbox

Setup оборудования

Выполнение этого примера требует:

  • Устройство аудио интерфейса Focusrite Scarlett 2i2, или другое устройство/звуковая карта с двумя выходными и двумя входными аудиоканалами

  • Устройство аудио интерфейса драйверы DirectSound, предоставляемые поставщиком, или использование драйверов устройств Windows по умолчанию, если они доступны

  • Один динамик с питанием и один микрофон, совместимый с устройством аудиоинтерфейса

  • Аудио закрашенной фигуры кабелей и адаптеры коннекторов

Типичные устройства аудиоперехода DirectSound, поддерживаемые Data Acquisition Toolbox, не поддерживают аппаратную синхронизацию между выходным и входным каналами. Пары аудио входа или выхода каналов синхронизируются аудио устройством, однако каналы выхода и входа могут иметь незначительную относительную задержку запуска.

Для синхронизации временных меток выходных и входных данных в постобработке может использоваться следующая настройка:

  • Соедините один из выходных каналов (выход 1 или левый канал стерео вилки) с одним из входных каналов (вход 1 или левый канал), чтобы сгенерировать и получить сигнал синхронизации в строении закольцовывания.

  • Другой выход (выход 2 или правый канал) и входной канал (вход 2 или правый канал) используются для вывода сигнала возбуждения/возбуждения и, соответственно, для получения сигнала измерения/отклика.

  • Считывайте данные из обоих входных каналов звука, причем один из каналов используется для считывания сигнала синхронизации, и другой канал для считывания фактического сигнала отклика.

  • С помощью этой настройки вы считываете данные из обоих каналов аудио входы и одновременно записываете данные в оба канала аудио выходы.

Эхометр-сонар

В качестве демонстрации такого подхода можно использовать аудио устройство, динамик с питанием и микрофон, чтобы собрать настройку гидроэхометра. Импульсный эхометр измеряет расстояние до объекта, излучая короткий звуковой импульс, измеряя отраженный импульсный эхо и определяя время рейса путем сравнения исходного выходного импульсного сигнала с измеренным входным сигналом отклика.

Динамик и микрофон расположены рядом друг с другом и ориентированы к стенке, от которой отражается звуковой импульс, как на схеме ниже.

Синтезируйте импульсный сигнал

Импульсный сигнал, обычно используемый для гидроакустических приложений, является короткой длительностью частотным свипом или щебетом. Поскольку острые ребра амплитуды в начале и конце плоского сигнала щебета могут вызвать программные продукты измерения, импульс ослабляется/формируется функцией огибающей. Опции включают Ханнинг, Гауссов, Кайзер и т.д. Частотная область значений, ширина или длительность импульса, огибающая/форма импульса зависят от предполагаемого применения. В этом примере измерения выполняются с импульсом длительности 3 мс с линейным щебетом частоты 1-5 кГц и окном Ханнинга. Синтезированный сигнал показан на рисунке ниже. Исходный сигнал щебета показан слева, а импульс формы показан справа. Окно Hanning отображается в виде пунктирной линии.

Убедитесь, что используйте частотную область значений сигнала, который может быть правильно сгенерирован динамиком, взят микрофоном и дискретизирован устройством аудиопомех. Скорость дискретизации, используемая для аудио устройства измерений, составляет 192 кГц.

% Pulse width (s)
T = 3E-3;

% Sampling rate (Hz)
Fs = 192E+3;

% Initial and final pulse frequency (Hz)
f0 = 1E+3;
f1 = 5E+3;

% Time vector
t = (0:1/Fs:T)';

% Pulse signal, chirp attenuated by an windowing function
yc = chirp(t,f0,t(end),f1);
w = hanning(numel(t));
y = yc.*w;

% Plot the signal
figure
tileplot = tiledlayout(1,2);
tileplot.TileSpacing = 'compact';
tileplot.Padding = 'compact';

nexttile
plot(t,yc)
hold on
plot(t,w,'--')
xlabel("Time (s)")
ylabel("Amplitude")
title("Original chirp signal and Hanning envelope")

nexttile
plot(t,y)
xlabel("Time (s)")
title("Shaped pulse")

Сбор данных

Используйте два отдельных DataAcquisition объекты, один для выходных каналов аудио и один для входных каналов аудио. Поскольку нет возможности автоматической синхронизации между парами входного и выходного каналов, даже если общий DataAcquisition объект используется для всех каналов, этот подход позволяет больше контролировать операции сбора данных.

do = daq("directsound");
addoutput(do,"Audio4","1","Audio");
addoutput(do,"Audio4","2","Audio");
do.Rate = Fs;

di = daq("directsound");
addinput(di,"Audio1","1","Audio");
addinput(di,"Audio1","2","Audio");
di.Rate = Fs;

Поскольку длительность импульса относительно короткая, дополните конец импульсного сигнала нулевыми значениями (длительностью 200 мс), чтобы убедиться, что импульс сгенерирован правильно.

yout = [y; zeros(Fs*200E-3,1)];

Запустите вход сначала как непрерывное обнаружение фона, затем сгенерируйте один и тот же сигнал на обоих каналах аудио выхода. Один из каналов используется в качестве сигнала синхронизации.

start(di,"continuous")
write(do,[yout yout])
stop(di)

Считайте полученные данные в рабочую область. По умолчанию в read функция возвращает timetable.

data = read(di,"all");

Постройте график полученных данных. Сигналы Audio1_1 и Audio1_2 соответствуют каналам 1 и 2 ауди входа. Вход 1 канал использовался для записи сигнала синхронизации, сгенерированного каналом 1 выхода в строение закольцовывания. Входной канал 2 использовался для записи фактического сигнала отклика, захваченного микрофоном. В ответном сигнале наблюдаются два импульса, за которыми следуют другие вторичные эхо-сигналы, которые зависят от комнатной акустики. Также заметьте большое относительное время задержки запуска между входом и выходным каналами.

figure
stackedplot(data)

Синхронизация временных меток выходных и входных данных

Найдите задержку и выровняйте временные метки выходного и входных сигналов, отбросив точки перед обнаруженным сигналом синхронизации.

lag = finddelay(y, data.Audio1_1);
t0 = lag/Fs
t0 = 0.3058
alignedData = data(lag+1:end,:);
alignedData.Time = alignedData.Time-alignedData.Time(1);

figure
s = stackedplot(alignedData);
xlim(seconds([0 0.025]))
s.AxesProperties(1).YLimits = [-0.55 0.55];

Визуально проверьте качество выравнивания по времени путем сравнения данных синтетического импульса с измеренным сигналом закольцовывания.

figure
plot(seconds(t),y,alignedData.Time(1:numel(t)),alignedData.Audio1_1(1:numel(t)))
ylabel("Amplitude")
xlabel("Time (s)")
legend(["Pulse signal to output","Measured loopback signal"],"Location","bestoutside")

Определите время и расстояние распространения импульса

Можно использовать xcorr функция перекрестной корреляции для определения и визуализации сходства между исходным импульсным сигналом и измеренным откликом.

[xCorr,lags] = xcorr(alignedData.Audio1_2,y);

figure
plot(lags/Fs,xCorr)
xlabel('Lags (s)')
ylabel('Cross-correlation')
axis tight

График перекрестной корреляции указывает на несколько сходств с двумя большими peaks и другим меньшим peaks от ревербераций.

Найдите временную метку и общее расстояние распространения, соответствующее первым двум наблюдаемым коррелированным импульсам в измеренном сигнале. Первый наблюдаемый импульс соответствует пути прямого распространения от динамика к микрофону. Второй наблюдаемый импульс является эхо-импульсом, отраженным стенкой. Функция finddelay возвращает задержку, для которой нормированная перекрестная корреляция имеет самое высокое значение, и в этом случае она соответствует первому импульсу в ответном сигнале.

t1 = finddelay(y,alignedData.Audio1_2)/Fs
t1 = 0.0011

Можно вычислить время распространения эхо-импульса как стартовую временную метку второго импульса в ответном сигнале при помощи finddelay в области сигнала после первого импульса.

t2 = t1 + T + finddelay(y,alignedData(timerange(seconds(t1+T),"inf"),:).Audio1_2)/Fs
t2 = 0.0122
% Plot the response signal and highlight the first two detected pulses
figure
plot(alignedData.Time,alignedData.Audio1_2)
xlim(seconds([0 t2+2*T]))

hold on
firstPulse = alignedData(timerange(seconds(t1),seconds(t1+T)),:);
plot(firstPulse.Time,firstPulse.Audio1_2)

echoPulse = alignedData(timerange(seconds(t2),seconds(t2+T)),:);
plot(echoPulse.Time,echoPulse.Audio1_2)
ylabel("Amplitude")
xlabel("Time (s)")

% Calculate distance corresponding to echo pulse (m)
% Speed of sound in air at 20 deg. C (m/s)
v = 343.1;
d2 = t2*v/2
d2 = 2.1006

Расстояние (2,10 м), измеренное настройкой гидроакустического эхометра (половина общего пути), очень близко к фактическому расстоянию (2,06 м) между настройкой динамика/микрофона и стенкой, отражающей эхо-импульс.