Общая шкала, основанная на двух разных сериях - PullRequest
1 голос
/ 06 января 2012

В течение некоторого времени меня беспокоит следующее:

У меня есть две серии чисел, одна из которых представляет видео-метки, а другая - аудио-метки.Эти два используют разные масштабы, видео в наносекундах, звук в микросекундах (или наоборот, или микросекунды и наносекунды, или что-то еще, важно то, что они НЕ одинаковы, потому что они приходятот двух разных аппаратных устройств все время).Теперь я хочу создать видеопоток из этих двух, и, очевидно, один из них всегда отключен.До сих пор я взламывал решение, в котором я всегда использую «больший» в качестве основного, но это вызывало проблемы с другим потоком, в виде сбоев звука или застывших изображений.

Теперь мне нужносделать рабочий раствор, т.е.создать общую базу меток времени из этих двух серий.Можете ли вы помочь мне с этим?

Например, я получаю данные, подобные этим:

VIDEO: 100 150 200 250

AUDIO: 1000 1500 2000 3000 5000

, и я хотел бы, чтобы вывод был серией, подобной

A (????) V (????) A (????) V (?????) и так далее .... где ????уважает разницу между последовательными временными метками VIDEO и AUDIO, очевидно, в другом масштабе.

Спасибо, f.

1 Ответ

2 голосов
/ 06 января 2012

Этот вопрос довольно научный (хотя и довольно простой) и не настолько тривиальный для реализации.

Первое, что нужно отметить: у вас на самом деле есть третья шкала времени - системное время.

Второе, на что следует обратить внимание: вы не можете непосредственно найти метку времени видео, которая соответствует данной звуковой метке времени и наоборот , но вы можете напрямую найти системное время, которое соответствует только что прибывшей метке времени видео или только что прибыл аудио отметка времени.

Таким образом, вы (1) находите линейное преобразование из шкалы времени видео в системное время и (2) из ​​шкалы времени аудио в системное время.

Теперь вы можете найти преобразование из видео-меток в аудио-метки или наоборот.

Затем вам нужно выбрать эталонную шкалу времени - видео, аудио или системное время. При необходимости вы конвертируете метки времени любой шкалы времени в эталонную шкалу времени.

ПРИМЕЧАНИЕ , что каждый отдельный аудиосэмпл имеет свою собственную временную метку, которую следует преобразовать в новый временной масштаб, чтобы выходная частота дискретизации не совпадала с частотой входной выборки. А поскольку ваше линейное преобразование, вероятно, будет адаптивным - частота дискретизации на выходе будет отличаться для разных аудиопакетов. Все это означает, что если ваша эталонная шкала времени не является шкалой времени звука, вы должны тщательно заново сэмплировать каждый аудиопакет на (постоянную) частоту дискретизации по вашему выбору с помощью алгоритма по вашему выбору (например, линейного или более продвинутого). В противном случае, если вы предположите, что частота дискретизации не изменилась - у вас будут пропуски и / или совпадения между аудиопакетами (что приведет к очень неприятным звуковым артефактам).

Наиболее важной подзадачей этого подхода является линейное сокращение: поиск наилучшего линейного преобразования между x и y при заданном наборе точек выборки (x,y).

Эта задача обычно определяется следующим образом: для заданного набора точек (x n , y n ) find (k, b ) , чтобы сумма (y n - (k * x n + b)) 2 была минимальной ( минимальная сумма квадратов-разностей).

Ответ

k = (M (x * y) - M (x) * M (y)) / (M (x 2 ) - (M (x)) 2 ), b = (М (у) (М (х 2 ) - М (х * у) * М (х)) / (М (х 2 ) - (М (х)) 2 )

где M (f) обозначает среднее арифметическое всех f n значений.

Практически больше точек (x n , y n ) означает более точную линейную модель. Ошибка очень сильно зависит от значения (M (x 2 ) - (M (x)) 2 ) (большое значение означает небольшую ошибку). Таким образом, вы должны применять эту формулу только тогда, когда у вас достаточно очков - так, чтобы значение (M (x 2 ) - (M (x)) 2 ) становится больше некоторого предельного значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...