Этот пример показывает, как создать эхометрический гидролокатор с использованием сбора аудиоданных и обработки сигналов, который может измерять расстояние путем определения времени полета отраженного от поверхности звукового импульса.
В этом примере используется подход для постсинхронизации выходных аудиосигналов и временных меток входных данных, который требуется для приложений, где входной сигнал является ответом на выходной сигнал и/или когда релевантна временная корреляция на выходе/входе. Примеры применения включают установку акустической характеристики или эксперименты «стимул-ответ». Относительное отставание на выходе/входе определяется и корректируется с помощью корреляционных функций в панели инструментов обработки сигналов.
MATLAB R2020a или более поздней версии
Инструментарий сбора данных
Пакет поддержки набора средств сбора данных для звуковых карт Windows
Панель инструментов обработки сигналов
Выполнение этого примера требует:
Устройство аудиоинтерфейса 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

График взаимной корреляции указывает на несколько сходств, с двумя большими пиками и другими меньшими пиками из ревербераций.
Найти временную метку и общее расстояние распространения, соответствующие первым двум наблюдаемым коррелированным импульсам в измеренном сигнале. Первый наблюдаемый импульс соответствует пути прямого распространения от громкоговорителя к микрофону. Второй наблюдаемый импульс представляет собой эхо-импульс, отраженный стенкой. Функция 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)/Fst2 = 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 м) между динамиком/микрофоном и стенкой, отражающей эхолот.