LINUX.ORG.RU

синхронизация звука с разных каналов

 , ,


0

1

Привет, ЛОР.

Есть несколько аудиоканалов (микрофоны), нужно отметить на них один и тот же звук с учётом того, что расстояние от источника звука до микрофонов могло быть различным, т.е. разными будут частота и время. Как это сделать?

Меня интересует теоретическая сторона вопроса: какие алгоритмы для этого применяются и в какую сторону нужно копать.

Ну и для общего развития, что вообще почитать о компьютерном анализе и обработке звука?

Спасибо.

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 1)

Ответ на: комментарий от Waterlaz

А частота чего это вдруг изменится?

Потому что звуковые волны имеют свойство затухать, например, и высокочастотный звук глохнет быстрее низкочастотного.

https://en.wikipedia.org/wiki/Acoustic_attenuation

Алсо высокочастотные звуки дают больше эхо.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)

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

Самый простой и вобщем-то подходящий способ - сравнивать кривульки звука и искать разницу (квадратичную ошибку). Где ошибка меньше - ну вот где-то там оно и будет. Способ работает лучше чем можно подумать, да и единственный, позволяющий выстраивать задержку с максимальной точностью, так как не использует промежуточных окон.

Способ сложнее, который я все собирался сделать в своем редакторе, состоит в том, что мы считаем FFT от некоторого окошка в эталонном сигнале и считаем много-много окошек в соседнем, пытаемся сравнивать. В основном нас интересуют частоты до 4 килогерц, дальше уже неинтересно, да и микрофоны могут быть сильно разные и резать какие-то частоты, таким образом чем больше сравниваем - тем больше ошибок. Точность не очень большая, в конце лучше дошкурить первым вариантом.

Шазам работает аналогично второму варианту, лишь только с той разницей, что сравнивает не весь спектр, а делит сигнал на квадранты и выискивает в каждой «октаве» свои пики. Т.е. пик у нас должен быть на примерно одной частоте и даже в соседних временных окнах. И вот потом мы сравниваем эти пики. Разные фильтрации по вкусу

Самый крутой способ - это сравнивать MFCC, вроде бы несложно, но я не осилил. Если кто-то даст вменяемый способ получения/сравнения оного, я был бы рад.

ruzisufaka
()
Ответ на: комментарий от ruzisufaka

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

Шазам в моём случае слишком релевантен, я хочу с помощью микрофонов отслеживать местоположение объектов в пределах сцены.

То есть, грубо говоря, на входе будет несколько аудиопотоков, на выходе - координаты объекта и звук, который он издал в пределах определённого временного интервала.

P.S. А по теории что-нибудь посоветовать можешь?

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)

читал на хабре некий метод, где сопоставление звуков осуществлялось нахождением минимума (или максимума?) скалярного произведения записей, представленных в виде n-мерного вектора, где n - количество сэмплов

как-то так

Harald ★★★★★
()
Ответ на: комментарий от anonymous

И что именно ты этим хотел сказать?

hateyoufeel ★★★★★
() автор топика

Попробуй просто перемножить. Вот на питоне наглядный прототипчик:

from numpy import *

a = random.rand(1,1000)[0] * 2 - 1
b = a[250:-250]

for i in range(len(a)-len(b)):
    v = sum(abs(b * a[i:i+len(b)])) - len(b)/4
    print(i, int(v**2 / 32) * '#')

a - это 1000 рандомных чисел из диапазона от -1 до 1, b - вырезанный из середины a кусок. v - сумма абсолютных значений перемноженных элементов из b на элементы из a, с постепенным «смещением» b относительно a. int(v**2 / 32) - для большей наглядности - такое количество решёток выведется в каждой строке.

Примерный вывод скрипта.

anonymous
()
Ответ на: комментарий от hateyoufeel

потому как возможны несколько источников с похожими спектрами

Условно говоря у тебя есть сумма 3+4=7. Ты хочешь имея число 7 узнать какие слагаемые применялись.

хочу с помощью микрофонов отслеживать местоположение объектов в пределах сцены.

Я б на твоём месте записал бы сэмплы всех источников (вангую что их немного) в узлах пространственной сетки (точки на сцене) - это даст спектры источников вместе с эхом/ослаблением и т.д. После чего перебирал бы все возможные суммы спектров, чтобы найти подходящий (с наибольшей корреляцией) под получаемый сигнал.

no-such-file ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ну, ффт в целом неплохой вариант, но могут быть сложные спектры и ты не сможешь так просто отличить какому источнику какой спектр принадлежит. Можно по амплитуде с разных направлений. Ты же расставляешь микрофоны в разные стороны от центральной оси. Допустим человек достаточно четко определит направление источника звука даже с двумя ушами-микрофонами. И сзади тоже — ушная раковина направлена больше вперед чем назад и для источника сзади будет predelay и небольшой срез верхних и нижних частот.

deep-purple ★★★★★
()
Ответ на: комментарий от no-such-file

Источник звука может двигаться. Ты стоишь на тротуаре на месте, дома и стены тоже на месте, а мимо тебя едет скорая с сиреной. Уловил?

deep-purple ★★★★★
()
Ответ на: комментарий от hateyoufeel

высокочастотный звук глохнет быстрее низкочастотного

На самом деле, тебе лучше фильтровать и низкие и высокие частоты. Т.к. низкие имеют большую длину волны и т.о. точность позиционирования будет низкая, а высокие, как ты сам заметил, слишком хорошо отражаются/ослабляются и т.п. - будут давать много помех. Мне кажется, что оптимально оставить спектр от 1 до 4кГц.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Источник звука может двигаться ... мимо тебя едет скорая с сиреной

я хочу с помощью микрофонов отслеживать местоположение объектов в пределах сцены

По сцене? Прям 100км/ч?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Даже при 1 см/сек есть эффект допплера. Чел утверждал что частотат не изменится. А вот хрена с два. Другое дело такая погрешность в задаче ТС не повлияет. Хотя.. зависит от вермени анализа, оно не мгновенное и источник может оказаться размазанным. Так же как видеокамера не успевает опросить матрицу и объекты плывут меж кадров.

deep-purple ★★★★★
()
Ответ на: комментарий от hateyoufeel

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

Elyas ★★★★★
()
Ответ на: комментарий от Elyas

Ты про jitter bug? Для этого существует master clock. Ах, да, потребительское же.

deep-purple ★★★★★
()

Короче погугли про далби сараунд и про 5.1 7.1 дтс, вот это вот все какраз про пространственное положение объектов. Правда для кинотеатров. Но есть зачто зацепиться.

deep-purple ★★★★★
()
Ответ на: комментарий от hateyoufeel

Скорость звука, насколько я помню, порядка 300 метров в секунду. Твоя сцена, ну хорошо если 50 метров. Но я так подозреваю, что ты хочешь отслеживать поточнее. 48000 герц / 300 метров = 160 отсчетов на метр. Тут тебе или придется брать очень маленькие окна по 128 семплов для FFT, что мало, или всеже искать разницу в кривульках.

А купив ИК-прожектор и пару камер ты можешь хоть миллиметры отслеживать.

Литературы не знаю, читал разные разрозненные источники, сам себя специалистом не считаю.

ruzisufaka
()
Ответ на: комментарий от Elyas

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

ruzisufaka
()
Ответ на: комментарий от deep-purple

Так же как видеокамера не успевает опросить матрицу и объекты плывут меж кадров.

Этот эффект называется Rolling Shutter и есть только на разном говне, а не на годном железе

ruzisufaka
()
Ответ на: комментарий от ruzisufaka

Я привел емуэтот пример для понимания, а не потому что..

deep-purple ★★★★★
()
Ответ на: комментарий от no-such-file

Условно говоря у тебя есть сумма 3+4=7. Ты хочешь имея число 7 узнать какие слагаемые применялись.

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

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от Elyas

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

Взять одну плату и воткнуть в неё несколько микрофонов - не проблема.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от ruzisufaka

Но я так подозреваю, что ты хочешь отслеживать поточнее. 48000 герц / 300 метров = 160 отсчетов на метр. Тут тебе или придется брать очень маленькие окна по 128 семплов для FFT, что мало, или всеже искать разницу в кривульках.

Сильная большая точность не нужна. В пределах пары метров будет достаточно для начала.

А купив ИК-прожектор и пару камер ты можешь хоть миллиметры отслеживать.

Могу, но у меня задача отслеживать именно звук, а не сам объект.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от Elyas

Воткнуть то не проблема, а вот оцифровать более двух может оказаться проблемой.

Да нет, есть платы, позволяющие снимать и оцифровывать сигналы с нескольких микрофонов.

hateyoufeel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.