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