Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передискретизация аудио на доли %
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
akorud
Здравствуйте,
появилась тут проблема: на входе дано 2 потока аудио с частотой дискретизации 32kHz, с независимых источников.
На практике частоты естественно несколько отличаются - например 32.05 и 31.95.
Надо привести их к одной частоте дискретизации. Изменением высоты звука можно пренебречь.
Единственное, что пока приходит в голову - взять одну из них за опорную, а в другой поток вставлять нули / выбрасывать отсчеты (в моменты когда ризница набежит на период дискретизации) и пропустить потом через ФНЧ 16kHz.
Что скажете? Имеет право на жизнь?
SPACUM
Цитата(akorud @ Jan 12 2012, 15:28) *
Здравствуйте,
появилась тут проблема: на входе дано 2 потока аудио с частотой дискретизации 32kHz, с независимых источников.
На практике частоты естественно несколько отличаются - например 32.05 и 31.95.
Надо привести их к одной частоте дискретизации. Изменением высоты звука можно пренебречь.
Единственное, что пока приходит в голову - взять одну из них за опорную, а в другой поток вставлять нули / выбрасывать отсчеты (в моменты когда ризница набежит на период дискретизации) и пропустить потом через ФНЧ 16kHz.
Что скажете? Имеет право на жизнь?

Можно интерполировать синками - несколько отсчетов около требуемого представить как сумму sin(x)/x. Теоретически увеличивая количество включенных отсчетов можно добиться любой точности.
Вобщем качество аудио определяется методом экспертных прослушиваний. Так что реализуйте все, что придет в голову, может и Вашего метода выбрасывания или вставления точек будет достаточно даже без фильтра. Вопрос качества аудио сигнала очень субьективен.
petrov
Цитата(akorud @ Jan 12 2012, 15:28) *
Что скажете? Имеет право на жизнь?


ИМХО стыдно так грубо делать. :)
akorud
Цитата(petrov @ Jan 12 2012, 14:00) *
ИМХО стыдно так грубо делать. sm.gif

Ну, гордость инженерская конечно протестует, но надо сделать быстро, в режиме hot-fix. И втиснуть в существующий дизайн ПЛИС, так что с математикой не особо разгуляешься. Ну и воспроизводить это будет телевизор, так что даже колонок-мониторов для тестирования не купишь под проект sm.gif
GetSmart
Цитата(akorud @ Jan 12 2012, 16:28) *
Единственное, что пока приходит в голову - взять одну из них за опорную, а в другой поток вставлять нули / выбрасывать отсчеты (в моменты когда ризница набежит на период дискретизации) и пропустить потом через ФНЧ 16kHz.

Появится НЧ помеха с разницей опорных частот, которая не отфильтруется ФНЧ. Особенно при вставлении нуля. При выбрасывании отсчёта или если вместо вставки нуля просто не менять предыдущее значение, будет та же помеха, но с меньшей амплитудой. Вроде интермодуляция называется по-научному.

Цитата(akorud @ Jan 12 2012, 16:28) *
например 32.05 и 31.95.

Относительно этих значений будет 100 гц помеха. Ниже 20 гц наверное "прокатило" бы.
soldat_shveyk
Можно сделать так: проинтерполировать оба сигнала например на N. Интерполировать честно, с КИХ-фильтром.
После интерполяции получите увеличенную частоту дискретизации N*32 кГц.
Затем от правильного таймера формируете правильные 32 кГц, и по его тактам выхватываете отсчеты из обоих интерполированных сигналов.
При этом ошибка уменьшится до величины 1/(N*32 кГц.)
При экономной реализации можно вычислять только те полифазы КИХ-интерполятора, на которые указывает правильный таймер 32 кГц.
akorud
Цитата(soldat_shveyk @ Jan 12 2012, 17:23) *
Можно сделать так: проинтерполировать оба сигнала например на N. Интерполировать честно, с КИХ-фильтром.
После интерполяции получите увеличенную частоту дискретизации N*32 кГц.
Затем от правильного таймера формируете правильные 32 кГц, и по его тактам выхватываете отсчеты из обоих интерполированных сигналов.
При этом ошибка уменьшится до величины 1/(N*32 кГц.)
При экономной реализации можно вычислять только те полифазы КИХ-интерполятора, на которые указывает правильный таймер 32 кГц.

Спасибо за идею. Сейчас сажусь за симуляции, посмотрим что из этого получится.
GetSmart
Цитата(soldat_shveyk @ Jan 12 2012, 21:23) *
Можно сделать так: проинтерполировать оба сигнала например на N. Интерполировать честно, с КИХ-фильтром.
После интерполяции получите увеличенную частоту дискретизации N*32 кГц.
Затем от правильного таймера формируете правильные 32 кГц, и по его тактам выхватываете отсчеты из обоих интерполированных сигналов.
При этом ошибка уменьшится до величины 1/(N*32 кГц.)

Можно кое-что уточнить?
Это же примерно тот же алгоритм, что и в первом посте, но только на несущих частотах в N раз больших?
И опора независимая, в то время как у ТС была одна из несущих.
sysel
Есть такая штука "Asynchronous Sample Rate Converter". Не знаю как работает, но техас предлагает:
http://www.ti.com/product/src4392
akorud
Цитата(soldat_shveyk @ Jan 12 2012, 17:23) *
Можно сделать так: проинтерполировать оба сигнала например на N. Интерполировать честно, с КИХ-фильтром.
После интерполяции получите увеличенную частоту дискретизации N*32 кГц.
Затем от правильного таймера формируете правильные 32 кГц, и по его тактам выхватываете отсчеты из обоих интерполированных сигналов.
При этом ошибка уменьшится до величины 1/(N*32 кГц.)
При экономной реализации можно вычислять только те полифазы КИХ-интерполятора, на которые указывает правильный таймер 32 кГц.

Все получилось. Сделал так - в качестве опорного таймера использовал частоту дискретизации первого сигнала и с ним ничего не делал. А второй - как выше. Причем при N = 32 уровень интермодуляций получился порядка -40dB и можно было услышать искажения. При N = 256 (x32 FIR + x8 CIC, порядок FIR-интерполятора 2000) интермодуляции <-60dB (по результат симуляции) и звук идеальный.
Еще раз спасибо за идею.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.