|
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
|
|
|
|
Сообщений в этой теме
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, 18:35 Serg76 Цитата(evil_laugh @ Dec 20 2012, 22:35) S... Dec 20 2012, 18:54  evil_laugh Цитата(Serg76 @ Dec 20 2012, 21:54) да ка... Dec 20 2012, 19:03   Serg76 Цитата(evil_laugh @ Dec 20 2012, 23:03) Т... Dec 20 2012, 19:30    evil_laugh Цитата(Serg76 @ Dec 20 2012, 22:30) Да, о... Dec 20 2012, 20:09     Serg76 Цитата(evil_laugh @ Dec 21 2012, 00:09) Э... Dec 20 2012, 20:24      evil_laugh Цитата(Serg76 @ Dec 20 2012, 23:24) нет, ... Dec 20 2012, 20:43      alex_os Цитата(Serg76 @ Dec 20 2012, 23:24) нет, ... Dec 21 2012, 06:32       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
|
|
|