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