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

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

|
Приветствую уважаемых гуру цифровой обработки  Прошу помочь мне с алгоритмом, который бы осуществлял изменение частоты дискретизации сигнала с 44100 до 12800 Гц. Сигнал - 16битные отсчёты с микрофона, обычный PCM. Требования к передискретизатору следующие: а) пропускание частоты сигнала в полосе от 0 до 6 кГц с неравномерностью АЧХ не более 3 дБ б) подавление сигнала в полосе 6200 Гц - 6400 Гц не меньше, чем на 60 дБ в) и самое главное - крайне жёсткие требования к объёму используемой оперативной памяти и процессорного времени. Процессор, для которого пишется алгоритм, помимо передискретизации загружен ещё тонной задач. Оперативной памяти для алгоритма может быть выделено не более 2 кБ. Время - как всегда, чем меньше, тем лучше. Расскажу о том, какие исследования я провёл в этой области. - Естественно, что чтобы сделать изменение Fд 44100->12800, нужно сперва повысить частоту в 128 раз, потом понизить в 441 раз. Фильтр, который нужен для такой передискретизации в один каскад, имеет больше 7000 коэффициентов (рассматриваем КИХ-фильтрацию), поэтому вариант с таким алгоритмом отпал сразу.
- Следующим моим шагом было создание многокаскадной системы: сперва повышение частоты в 2*4*16=128 раз, потом её уменьшение в 21*7*3=441 раз. Естественно, использовалось полифазное разбиение фильтров. На входе алгоритма был 441 отсчёт, на выходе - 128. Всё работало и обеспечивало требуемые параметры АЧХ, однако требовалось много места (нужно же где-то хранить 441*2*8 промежуточных отсчётов сигнала на высокой частоте) и много процессорного времени. Поэтому от этого алгоритма тоже пришлось отказаться. Было поставлено требование: только однокаскадная передискретизация.
- Попутно, кстати, была прочитана горка литературы по фильтрам Фарроу, Ланцоша и прочим полиномиальным фильтрам, но ввиду почти полного отсутствия вменяемых реализаций с графиками и прочими данными - я понял только общий принцип и то, что обмануть никого не удастся и всё равно придётся реализовывать огроменный фильтр.
- Дальше попробовал сделать так: разработать фильтр с меньшим количеством отсчётов, а при фильтрации проводить интерполяцию полученных значений. При этом было решено поступиться требованиями к переходной полосе фильтра и сделать так, чтобы на 6200 Гц обеспечивалось подавление не ниже 15 дБ, но все дальнейшие частоты выше какой-то величины (у меня получилось 7 кГц) всё равно должны были подавляться не меньше, чем на 60 дБ. Алгоритм был написан на Си и показал свою работоспособность. Казалось бы, всё в порядке и можно писать программу для DSP, но меня не покидало ощущение того, что можно попробовать что-то ещё. Поэтому плавно переезжаем к...
- ...фильтрации в частотной области, которую я решил рассмотреть как вариант реализации передискретизатора. Что нужно? Правильно, взять ДПФ исходных 441 точек сигнала, занулить ненужные гармоники, выкинуть ненужные 441-128 отсчётов из середины спектра и золотой ключик у меня в кармане. Однако снова возник ряд проблем. Первая - это "как быстро взять ДПФ 441 точек?". Дополнение нулями до 512 точек, судя по всему, не прокатывает - для передискретизации в частотной области придётся выкинуть нецелое количество точек. Ладно, для этого вопроса решение было найдено путём штудирования книжки Блейхута "Быстрые алгоритмы цифровой обработки", откуда я выудил алгоритмы Кули-Таки и алгоритм Гуда-Томаса (который прекрасно работает для числа 441, ибо это 3*3*7*7 - произведение простых чисел). Решение спорное, впрочем, ибо архитектура DSP, ИМХО, ну ни разу не приспособлена для подобного рода выкрутасов со всеми этими адресными тасованиями, тем более в моём дилетантском исполнении. Впрочем, возникает вторая проблема, которая затмевает собой первую: как избежать эффекта Гиббса в данной ситуации? Напрашивается всем известный overlap-save, однако не получится ли так, что время, затрачиваемое на вычисление "лишних" точек, которые потом выкидываются, сведёт весь выигрыш от используемого алгоритма на нет?
Собственно, у меня вопрос к уважаемому сообществу: что можно ещё придумать, чтобы выполнить задачу? Приветствуются пинки ногами, крики "пшёл вон, нуб", а также ссылки на авторитетные источники, личный опыт и другую информацию. Напомню задачу: 44100 -> 12800. пропускание 0-6 кГц с неравномерностью 3 дБ, подавление 6200-6400 минимум 60 дБ, минимум процессорного времени, 2 кБ памяти. Спасибо
Сообщение отредактировал evil_laugh - Dec 18 2012, 16:03
|
|
|
|
|
 |
Ответов
|
Dec 20 2012, 18:54
|
Профессионал
    
Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775

|
Цитата(evil_laugh @ Dec 20 2012, 22:35)  Serg76, похоже, Вы познали Дао. У меня только один вопрос: КАК?  Можно, пожалуйста, подробнее про алгоритм?  да как и описывал выше на основе полифазника, здесь ничего сверхестественного, правильно подберите нужное окно. я взял распространенное Наттала, правда пришлось все-таки увеличить порядок фильтра до 300, вроде как в -70 дБ влезли (пардон, -60 дБ)  А вообще, -60 дБ - это еще по-Божески, где-то попадалось на просторах Инета ресамплер как раз звукового диапазона с подавлением чуть ли не -120 дБ.
Сообщение отредактировал Serg76 - Dec 20 2012, 19:02
|
|
|
|
|
Dec 20 2012, 19:03
|
Участник

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

|
Цитата(Serg76 @ Dec 20 2012, 21:54)  да как и описывал выше на основе полифазника, здесь ничего сверхестественного, правильно подберите нужное окно. я взял распространенное Наттала, правда пришлось все-таки увеличить порядок фильтра до 300, вроде как в -70 дБ влезли (пардон, -60 дБ)  То есть Вы делаете простую однокаскадную передискретизацию, но с таким вот хитрым фильтром? А на какую частоту дискретизации фильтр считался? Я так понимаю, Вы не делали "честное" повышение частоты дискретизации до 44100*128, а сделали как-то по-другому? А как?
|
|
|
|
|
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 21 2012, 06:32
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(Serg76 @ Dec 20 2012, 23:24)  нет, все фильтры работают на низкой частоте. изначально характеристика фильтра рассчитывается на нормированную частоту 12800/44100, а затем для каждого элементарного фильтра пересчитываем эту характеристику с учетом смещения. в процессе фильтрации для каждого выходного отсчета вычисляем отклики двух соседних фильтров и проводим линейную интерполяцию между ними. поэтому выходной спектр и "обогащается" гармониками, которых не было во входном сигнале. Т.е метод эквивалентный предложенному ув. termit ? А сколько фаз и какая длина каждой фазы ?
--------------------
ну не художники мы...
|
|
|
|
Сообщений в этой теме
evil_laugh Resampling 44100 -> 12800 Dec 18 2012, 16:00 Serg76 дробный ресамплер на основе все того же полифазног... Dec 18 2012, 16:09 evil_laugh Цитата(Serg76 @ Dec 18 2012, 19:09) дробн... Dec 18 2012, 16:18  Serg76 Цитата(evil_laugh @ Dec 18 2012, 19:18) С... Dec 18 2012, 16:28 beaRTS Цитата(evil_laugh @ Dec 18 2012, 20:00) П... Dec 18 2012, 16:20 evil_laugh Цитата(beaRTS @ Dec 18 2012, 19:20) если ... Dec 18 2012, 16:24 des00 Цитата(evil_laugh @ Dec 18 2012, 11:00) П... Dec 18 2012, 16:43 evil_laugh Цитатане знаю даже, при таких исходных параметрах ... Dec 18 2012, 16:47  Serg76 Цитата(evil_laugh @ Dec 18 2012, 20:47) В... Dec 18 2012, 16:53  des00 Цитата(evil_laugh @ Dec 18 2012, 11:47) А... Dec 18 2012, 16:59 Самурай Цитата(des00 @ Dec 18 2012, 19:43) судя п... Dec 18 2012, 17:08  Serg76 Цитата(Самурай @ Dec 18 2012, 20:08) Филь... Dec 18 2012, 17:29  Самурай Соврал немного про каскады 4/7 и 4/3, фильтры там ... Dec 18 2012, 17:41 Serg76 ну вот, судя по расчетам des00 я вроде не так и да... Dec 18 2012, 16:44 evil_laugh Цитата(Serg76 @ Dec 18 2012, 19:53) не зн... Dec 18 2012, 17:36 Serg76 Цитата(evil_laugh @ Dec 18 2012, 21:36) В... Dec 18 2012, 17:53  alex_os А если так попробовать:
1. Делаем ФHЧ тактовой 441... Dec 19 2012, 05:28 evil_laugh Цитата(alex_os @ Dec 19 2012, 08:28) А ес... Dec 19 2012, 18:30 alex_os Цитата(evil_laugh @ Dec 19 2012, 21:30) В... Dec 20 2012, 04:35 Serg76 Цитата(evil_laugh @ Dec 19 2012, 21:30) С... Dec 20 2012, 16:16 thermit Результат соответствует действительности.
точност... Dec 19 2012, 20:51 des00 Цитата(thermit @ Dec 19 2012, 15:51) Можн... Dec 20 2012, 06:00  alex_os Цитата(des00 @ Dec 20 2012, 09:00) сделал... Dec 20 2012, 06:25 thermit Цитатаalex_os:
По моим оценкам полинома 3го поряд... Dec 20 2012, 07:41 alex_os Цитата(thermit @ Dec 20 2012, 10:41) Для ... Dec 20 2012, 17:12  Serg76 Цитата(alex_os @ Dec 20 2012, 21:12) Част... Dec 20 2012, 18:19 evil_laugh Большое всем спасибо за грамотные и содержательные... Dec 20 2012, 09:32      evil_laugh Цитата(Serg76 @ Dec 20 2012, 23:24) нет, ... Dec 20 2012, 20:43       Serg76 Цитата(alex_os @ Dec 21 2012, 09:32) Т.е ... Dec 21 2012, 06:50        evil_laugh Цитата(Serg76 @ Dec 21 2012, 09:50) Наско... Dec 22 2012, 08:31 thermit ЦитатаSerg76:
Насколько я понимаю, thermit предлаг... Dec 21 2012, 07:34 Serg76 Цитата(thermit @ Dec 21 2012, 11:34) 1. Ф... Dec 21 2012, 07:57 thermit ЦитатаSerg76:
Схемы реализации разные - либо в ви... Dec 21 2012, 09:03 Serg76 Цитата(thermit @ Dec 21 2012, 12:03) Одно... Dec 21 2012, 09:23 Serg76 Sorry, что-то глюкнуло Dec 21 2012, 09:26 thermit Цитатаevil_laugh:
Тут столкнулся с рядом проблем, ... Dec 22 2012, 09:22 Serg76 ну давайте, попробуем по пунктам:
Цитата1. Нужно т... Dec 22 2012, 09:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|