Ответ для whale из 0xff. Да. Но в лоб считать -- очень много операций. Поэтому что видится -- определить максимальную дистанцию и соответственно размер данных (сэмплов) по ней. В момент и после импульса записываем сколько определили. Потом над http://caxapa.ru/374477.html
всем массивом делаем, короче
смотри пример для octave:
A=wavread ("rec.wav"); # считали файл с микрофона
C=wavread ("chirp.wav"); # считали файл который излучали
# посчитали корреляцию (весь матан в этой строчке)
# считать в лоб (F[t]=Сумма(P[x]*M[x-t])при x =0-x макс) дольше гораздо.
# для (I)FFT известны быстрые алгоритмы и есть библиотеки.
n=2^nextpow2(2*length(A)-1)
R=real(ifft(fft(A,n).*conj(fft(C,n))));
# но вообще нам интересна амплитуда огибающей, т.к. в том месте где
# корреляция сильней, там она больше (а форма сигнала в общем-то и есть сам входной сигнал)
F=abs(R);
# применили фильтр низких частот -- в реальной программе тут FFT не нужен,
# подойтёт любой быстро считаемый вариант, просто в octave с этим туго...
# c -- это частота среза (относительно размера окна в целом, высокие частоты выкидываем)
# без фильтра получим 10000 пиков, что не осмысленно.
c=0.003; f=length(F); T=fft(F); T(round(c*f) : round(f-c*f))=0; O=real(ifft(T));
plot (O); # см. картинку, максимумы -- эхо.
В общем-то всё. Теперь нехитрым алгоритмом можно найти самый максимальный и левый максимум -- это сигнал из колонки. Потом найти минимум. Потом следующий максимум -- что-то непонятное. Следующий минимум потом найти. Потом следующий максимум -- эхо которое видно глазами на спектре (см. предыдущее моё сообщение). Ну и так в цикле... Видно, кстати, что между первым и третьим максимумом, примерно, 853 сэмпла или 17.8мс (48000Гц samplerate), что согласуется с предыдущими результатами (фурье). А вот второй максимум -- это что-то не видимое в первом случае.