Создайте эхолот Используя аудио измерения

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

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

Требования

  • MATLAB R2020a или позже

  • Data Acquisition Toolbox

  • Пакет поддержки Data Acquisition Toolbox для Windows Sound Cards

  • Signal Processing Toolbox

Настройка оборудования

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

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

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

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

  • Аудио соединительные кабели и адаптеры коннектора

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

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

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

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

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

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

Гидролокатор эхолота

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

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

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

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

Убедитесь, что использовали частотный диапазон сигнала, который может быть правильно сгенерирован динамиком, забранным микрофоном, и произвел устройством аудиоинтерфейса. Частота дискретизации, используемая для измерений аудио устройства, составляет 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 м) между настройкой динамика/микрофона и стеной, отражающей импульс эха.