|
Resampling 44100 -> 12800, нужна помощь по реализации. |
|
|
|
Dec 20 2012, 20:09
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Цитата(Serg76 @ Dec 20 2012, 22:30)  Да, однокаскадная децимация. В полифазной фильтрации нет ничего "хитрого", она известна давно, есть даже статья в википедии http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%...%86%D0%B8%D1%8Fдовольно понятно все описано. никакого повышения/понижения делать не надо. преимущество в том, что все вычисления производятся на выходной частоте дискретизации. Это мне понятно. Но фильтр же рассчитывается на промежуточную частоту дискретизации? Полифазная фильтрация - это метод разбиения одного большого фильтра на несколько маленьких с низкой частотой дискретизации. Но исходный-то фильтр (который разбиваем) работает на большой частоте?
|
|
|
|
|
Dec 20 2012, 20:43
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Цитата(Serg76 @ Dec 20 2012, 23:24)  нет, все фильтры работают на низкой частоте. изначально характеристика фильтра рассчитывается на нормированную частоту 12800/44100, а затем для каждого элементарного фильтра пересчитываем эту характеристику с учетом смещения. в процессе фильтрации для каждого выходного отсчета вычисляем отклики двух соседних фильтров и проводим линейную интерполяцию между ними. поэтому выходной спектр и "обогащается" гармониками, которых не было во входном сигнале. Вот теперь мозаика сошлась в единое целое.  Спасибо. Я пробовал делать подобное (пункт 4 первого сообщения темы), правда, с другой стороны подошёл немного. Попробую сделать и так, как Вы сказали. Заодно время выполнения алгоритма и общую требуемую память подсчитаю.
|
|
|
|
|
Dec 21 2012, 06:32
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(Serg76 @ Dec 20 2012, 23:24)  нет, все фильтры работают на низкой частоте. изначально характеристика фильтра рассчитывается на нормированную частоту 12800/44100, а затем для каждого элементарного фильтра пересчитываем эту характеристику с учетом смещения. в процессе фильтрации для каждого выходного отсчета вычисляем отклики двух соседних фильтров и проводим линейную интерполяцию между ними. поэтому выходной спектр и "обогащается" гармониками, которых не было во входном сигнале. Т.е метод эквивалентный предложенному ув. termit ? А сколько фаз и какая длина каждой фазы ?
--------------------
ну не художники мы...
|
|
|
|
|
Dec 21 2012, 07:34
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата Serg76: Насколько я понимаю, thermit предлагал Лагранжа с последующим использованием в структуре Фарроу. Полифазная фильтрация - это несколько другое. В принципе, можно попробовать еще снизить уровень искажений за счет применения квадратичной интерполяции вместо линейной, но это создаст существенную дополнительную нагрузку на процессор. А так сейчас использую 8 фаз х ~300 коэффициентов каждая, но это с избытком по уровню подавления, так сказать, на скорую руку. При желании число коэффициентов можно уменьшить. 1. Фарроу - один из способов организации вычислений интерполяции лагранжа. Достоинство - минимум умножителей. Поэтому просто лагранж. 2. Вы тоже используете интерполяцию лагранжа. 1-го порядка. Впрочем, таковой она будет для любой интерполяции 1-го порядка. Интерполяция к-тов фильтра полностью эквивалентна интерполяции непосредственно сигнала. 3. Вы используете 8-кратный оверсамплинг (8 фаз фильтр 2399-го порядка) 4. Можно фильтр покороче (оверсамплинг поменьше) - но интерполятор порядка повыше. 5. Так что, это именно то, что я предлагал. Что-то принципально новое изобрести здесь крайне сложно. (Вероятно - невозможно).
|
|
|
|
|
Dec 21 2012, 07:57
|
Профессионал
    
Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775

|
Цитата(thermit @ Dec 21 2012, 11:34)  1. Фарроу - один из способов организации вычислений интерполяции лагранжа. Достоинство - минимум умножителей. Поэтому просто лагранж.
2. Вы тоже используете интерполяцию лагранжа. 1-го порядка. Впрочем, таковой она будет для любой интерполяции 1-го порядка. Интерполяция к-тов фильтра полностью эквивалентна интерполяции непосредственно сигнала.
3. Вы используете 8-кратный оверсамплинг (8 фаз фильтр 2399-го порядка)
4. Можно фильтр покороче (оверсамплинг поменьше) - но интерполятор порядка повыше.
5. Так что, это именно то, что я предлагал. Что-то принципально новое изобрести здесь крайне сложно. (Вероятно - невозможно). Интерполяция одна и та же - полиномиальная, не спорю. Схемы реализации разные - либо в виде структуры Фарроу, либо полифазная. Уменьшить количество коэффициентов тоже можно - оптимизация по Ремезу, подбор окна, компромисс между порядком полинома и количеством фаз и т.д.
Сообщение отредактировал Serg76 - Dec 21 2012, 08:07
|
|
|
|
|
Dec 21 2012, 09:03
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата Serg76: Схемы реализации разные - либо в виде структуры Фарроу, либо полифазная. Одно другому не мешает. Полифазный фильтр выполняет либо вычисление осчетов соответствующих целым фазам, тогда промежуточный отcчет вычисляется посредством интерполяции по вычисленным целофазным отсчетам, либо вычисление непосредственно промежуточного отсчета, но с импульсной х-кой интерполированной по к-там. В обоих случаях нужны: a) Полиномиальная интерполяция б) Фильтрация Теоретически, оба способа эквивалентны. А вот с точки зрения ресурсов - нет. Пример: Число к-ов в фазе N линейная интерполяция Интерполяция по отсчетам: 2 отсчета - 2*N macc интерполяция 2 macc итого 2*N+2 macc Интерполяция к-ов: интерполяция к-ов 2*N macc Вычисление отсчета N macc итого 3*N macc Так, что способ 1, очевидно, эффективнее.
|
|
|
|
|
Dec 21 2012, 09:23
|
Профессионал
    
Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775

|
Цитата(thermit @ Dec 21 2012, 12:03)  Одно другому не мешает. Полифазный фильтр выполняет либо вычисление осчетов соответствующих целым фазам, тогда промежуточный отcчет вычисляется посредством интерполяции по вычисленным целофазным отсчетам, либо вычисление непосредственно промежуточного отсчета, но с импульсной х-кой интерполированной по к-там. В обоих случаях нужны: Да, да, да и еще раз ДА, по сути одна схема трансформируется в другую. По поводу эффективности: мне, кажется, что это тема более глубокого исследования, просто я привык пользоваться полифазниками, Лагранжем + Фарроу пользовался единожды, тогда мне это не понравилось, может стоит пересмотреть свои взгляды
|
|
|
|
|
Dec 22 2012, 08:31
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Цитата(Serg76 @ Dec 21 2012, 09:50)  Насколько я понимаю, thermit предлагал Лагранжа с последующим использованием в структуре Фарроу. Полифазная фильтрация - это несколько другое. В принципе, можно попробовать еще снизить уровень искажений за счет применения квадратичной интерполяции вместо линейной, но это создаст существенную дополнительную нагрузку на процессор. А так сейчас использую 8 фаз х ~300 коэффициентов каждая, но это с избытком по уровню подавления, так сказать, на скорую руку. При желании число коэффициентов можно уменьшить. Вот в пункте 4 стартового поста я делал почти так же, только использовал 30 фаз по 60 коэффициентов. Тут столкнулся с рядом проблем, которые тоже увеличивают время выполнения и требуемую память. - Нужно точно знать, какую фазу (точнее, две фазы, или больше, если использовать Лагранжа порядком выше) использовать при вычислении каждого из 128 выходных отсчётов. Либо вычислять это на месте (занимает время), либо заранее рассчитыватт и загонять в lookup table (минимум +256 байт, максимум - зависит от лагранжа).
- Нужно точно знать, в каком месте между двумя вычисляемыми фазными отсчётами находится интерполируемый, для каждого из 128 интерполируемых. Минимум +256 байт, ну или опять же довольно сложная арифметика на месте.
- Нужно точно знать, сколько новых отсчётов нужно вдвинуть в буфер при вычислении каждого из 128 отсчётов. Опять либо время, либо +128 байт.
- Ещё нужно учитывать момент, когда интерполируемый отсчёт находится между последним фазовым и следующим за ним (как бы "нулевым"). Для вычисления "нулевого" фазового нужно временно вдвинуть в буфер ещё один входной отсчёт, профильтровать и снова вернуть буфер на место. (Блин, коряво объяснил, но опытные товарищи, надеюсь, поймут). А это проверка условия на каждом выходном отсчёте. Опять же, время.
Вот так как-то... Всё это работает, но не так эффективно, как хотелось бы  К тому же при таком количестве фаз и коэффициентов я не укладывался в требования по подавлению. "По-правильному" фаз должно быть 128, как же оно с восемью так хорошо работает?
Сообщение отредактировал evil_laugh - Dec 22 2012, 08:32
|
|
|
|
|
Dec 22 2012, 09:22
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата evil_laugh: Тут столкнулся с рядом проблем, которые тоже увеличивают время выполнения и требуемую память. ... Странные проблемы. Да. Текущую фазу надо вычислять. По целой ее части выбирается фаза полифазного фильтра. Дробная часть определяет интерполяцию. Памяти нужно N под коэффициенты фильтра и N/OVERSAMPLING под память фильтра. ~ 2*N/OVERSAMPLING macc на выходной отсчет. Все вполне эффективно. ps С вдвиганием-выдвиганием отсчетов вы перемудрили
|
|
|
|
|
Dec 22 2012, 09:31
|
Профессионал
    
Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775

|
ну давайте, попробуем по пунктам: Цитата 1. Нужно точно знать, какую фазу (точнее, две фазы, или больше, если использовать Лагранжа порядком выше) использовать при вычислении каждого из 128 выходных отсчётов. Либо вычислять это на месте (занимает время), либо заранее рассчитыватт и загонять в lookup table (минимум +256 байт, максимум - зависит от лагранжа). в общем случае необходим параметр, некий аргумент, который будет задавать все моменты, в которых нужно производить соответствующие расчеты, зависит он от оверсемплинга. он определяет момент вычисления выходного отсчета, определяет смещение между двумя интерполируемыми отсчетами и, соответственно, определяет фазы, между которыми находится текущий отсчет. все это вычисляется на лету, т.е. на месте, никаких заранее просчитанных ЛУТов не используется, за исключением таблицы с ИХ фильтров. Цитата 2. Нужно точно знать, в каком месте между двумя вычисляемыми фазными отсчётами находится интерполируемый, для каждого из 128 интерполируемых. Минимум +256 байт, ну или опять же довольно сложная арифметика на месте. определяется аргументом из п.1. Цитата 3. Нужно точно знать, сколько новых отсчётов нужно вдвинуть в буфер при вычислении каждого из 128 отсчётов. Опять либо время, либо +128 байт. только один, обработка потактовая, т.е. отклики по двум фазовым фильтрам вычисляются на основании одной и той же входной последовательности отсчетов. Да, кроме памяти под все коэффициенты, нужен будет еще кольцевой буфер под входные отсчеты, с размером можете определится сами. Цитата 4. Ещё нужно учитывать момент, когда интерполируемый отсчёт находится между последним фазовым и следующим за ним (как бы "нулевым"). Для вычисления "нулевого" фазового нужно временно вдвинуть в буфер ещё один входной отсчёт, профильтровать и снова вернуть буфер на место. (Блин, коряво объяснил, но опытные товарищи, надеюсь, поймут). А это проверка условия на каждом выходном отсчёте. Опять же, время. Да есть такой нюанс, Вы правильно заметили. но как-то его надо учитывать. Цитата Вот так как-то... Всё это работает, но не так эффективно, как хотелось бы sm.gif К тому же при таком количестве фаз и коэффициентов я не укладывался в требования по подавлению. "По-правильному" фаз должно быть 128, как же оно с восемью так хорошо работает? sm.gif Работает это все очень даже эффективно, если еще оптимизировать количество необходимых коэффициентов, то выглядит это все очень неплохо. кстати очень много ресамплеров звукового диапазона работают именно на основе полифазной фильтрации, какой у них алгоритм используется - я не знаю. вся эта обвязка, отвечающая за синхронизацию различных моментов в ресамплере, очень проста и работает в реальном времени. сам интерполятор (без функций предварительного расчета ИХ фильтров) у меня занимает не более 100 строк кода, ну после соответствующих оптимизаций  . При 8-ми фазах это работает, результаты я приводил, можно конечно увеличить число фаз, тем самым снизить погрешность интерполяции, но это приведет к пропорциональному увеличению количества памяти под коэффициенты и незначительному выигрышу С/Ш, поэтому в этом случае я бы лучше перешел от линейной интерполяции к квадратичной, но при этом уже увеличится вычислительная нагрузка, т.к. вычислять уже придется 3 точки вместо 2-х. ну как-то так.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|