реклама на сайте
подробности

 
 
> Resampling 44100 -> 12800, нужна помощь по реализации.
evil_laugh
сообщение Dec 18 2012, 16:00
Сообщение #1


Участник
*

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



Приветствую уважаемых гуру цифровой обработки sm.gif

Прошу помочь мне с алгоритмом, который бы осуществлял изменение частоты дискретизации сигнала с 44100 до 12800 Гц. Сигнал - 16битные отсчёты с микрофона, обычный PCM.

Требования к передискретизатору следующие:

а) пропускание частоты сигнала в полосе от 0 до 6 кГц с неравномерностью АЧХ не более 3 дБ
б) подавление сигнала в полосе 6200 Гц - 6400 Гц не меньше, чем на 60 дБ
в) и самое главное - крайне жёсткие требования к объёму используемой оперативной памяти и процессорного времени. Процессор, для которого пишется алгоритм, помимо передискретизации загружен ещё тонной задач. Оперативной памяти для алгоритма может быть выделено не более 2 кБ. Время - как всегда, чем меньше, тем лучше.

Расскажу о том, какие исследования я провёл в этой области.

  1. Естественно, что чтобы сделать изменение Fд 44100->12800, нужно сперва повысить частоту в 128 раз, потом понизить в 441 раз. Фильтр, который нужен для такой передискретизации в один каскад, имеет больше 7000 коэффициентов (рассматриваем КИХ-фильтрацию), поэтому вариант с таким алгоритмом отпал сразу.
  2. Следующим моим шагом было создание многокаскадной системы: сперва повышение частоты в 2*4*16=128 раз, потом её уменьшение в 21*7*3=441 раз. Естественно, использовалось полифазное разбиение фильтров. На входе алгоритма был 441 отсчёт, на выходе - 128. Всё работало и обеспечивало требуемые параметры АЧХ, однако требовалось много места (нужно же где-то хранить 441*2*8 промежуточных отсчётов сигнала на высокой частоте) и много процессорного времени. Поэтому от этого алгоритма тоже пришлось отказаться. Было поставлено требование: только однокаскадная передискретизация.
  3. Попутно, кстати, была прочитана горка литературы по фильтрам Фарроу, Ланцоша и прочим полиномиальным фильтрам, но ввиду почти полного отсутствия вменяемых реализаций с графиками и прочими данными - я понял только общий принцип и то, что обмануть никого не удастся и всё равно придётся реализовывать огроменный фильтр.
  4. Дальше попробовал сделать так: разработать фильтр с меньшим количеством отсчётов, а при фильтрации проводить интерполяцию полученных значений. При этом было решено поступиться требованиями к переходной полосе фильтра и сделать так, чтобы на 6200 Гц обеспечивалось подавление не ниже 15 дБ, но все дальнейшие частоты выше какой-то величины (у меня получилось 7 кГц) всё равно должны были подавляться не меньше, чем на 60 дБ. Алгоритм был написан на Си и показал свою работоспособность. Казалось бы, всё в порядке и можно писать программу для DSP, но меня не покидало ощущение того, что можно попробовать что-то ещё. Поэтому плавно переезжаем к...
  5. ...фильтрации в частотной области, которую я решил рассмотреть как вариант реализации передискретизатора. Что нужно? Правильно, взять ДПФ исходных 441 точек сигнала, занулить ненужные гармоники, выкинуть ненужные 441-128 отсчётов из середины спектра и золотой ключик у меня в кармане. Однако снова возник ряд проблем. Первая - это "как быстро взять ДПФ 441 точек?". Дополнение нулями до 512 точек, судя по всему, не прокатывает - для передискретизации в частотной области придётся выкинуть нецелое количество точек. Ладно, для этого вопроса решение было найдено путём штудирования книжки Блейхута "Быстрые алгоритмы цифровой обработки", откуда я выудил алгоритмы Кули-Таки и алгоритм Гуда-Томаса (который прекрасно работает для числа 441, ибо это 3*3*7*7 - произведение простых чисел). Решение спорное, впрочем, ибо архитектура DSP, ИМХО, ну ни разу не приспособлена для подобного рода выкрутасов со всеми этими адресными тасованиями, тем более в моём дилетантском исполнении. Впрочем, возникает вторая проблема, которая затмевает собой первую: как избежать эффекта Гиббса в данной ситуации? Напрашивается всем известный overlap-save, однако не получится ли так, что время, затрачиваемое на вычисление "лишних" точек, которые потом выкидываются, сведёт весь выигрыш от используемого алгоритма на нет?



Собственно, у меня вопрос к уважаемому сообществу: что можно ещё придумать, чтобы выполнить задачу? Приветствуются пинки ногами, крики "пшёл вон, нуб", а также ссылки на авторитетные источники, личный опыт и другую информацию. Напомню задачу: 44100 -> 12800. пропускание 0-6 кГц с неравномерностью 3 дБ, подавление 6200-6400 минимум 60 дБ, минимум процессорного времени, 2 кБ памяти.

Спасибо sm.gif


Сообщение отредактировал evil_laugh - Dec 18 2012, 16:03
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
evil_laugh
сообщение Dec 20 2012, 18:35
Сообщение #2


Участник
*

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



Serg76, похоже, Вы познали Дао. У меня только один вопрос: КАК? sm.gif Можно, пожалуйста, подробнее про алгоритм? sm.gif
Go to the top of the page
 
+Quote Post
Serg76
сообщение Dec 20 2012, 18:54
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(evil_laugh @ Dec 20 2012, 22:35) *
Serg76, похоже, Вы познали Дао. У меня только один вопрос: КАК? sm.gif Можно, пожалуйста, подробнее про алгоритм? sm.gif

да как и описывал выше на основе полифазника, здесь ничего сверхестественного, правильно подберите нужное окно. я взял распространенное Наттала, правда пришлось все-таки увеличить порядок фильтра до 300, вроде как в -70 дБ влезли (пардон, -60 дБ) sm.gif А вообще, -60 дБ - это еще по-Божески, где-то попадалось на просторах Инета ресамплер как раз звукового диапазона с подавлением чуть ли не -120 дБ.

Сообщение отредактировал Serg76 - Dec 20 2012, 19:02
Go to the top of the page
 
+Quote Post
evil_laugh
сообщение Dec 20 2012, 19:03
Сообщение #4


Участник
*

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



Цитата(Serg76 @ Dec 20 2012, 21:54) *
да как и описывал выше на основе полифазника, здесь ничего сверхестественного, правильно подберите нужное окно. я взял распространенное Наттала, правда пришлось все-таки увеличить порядок фильтра до 300, вроде как в -70 дБ влезли (пардон, -60 дБ) sm.gif

То есть Вы делаете простую однокаскадную передискретизацию, но с таким вот хитрым фильтром? А на какую частоту дискретизации фильтр считался? Я так понимаю, Вы не делали "честное" повышение частоты дискретизации до 44100*128, а сделали как-то по-другому? А как?
Go to the top of the page
 
+Quote Post
Serg76
сообщение Dec 20 2012, 19:30
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(evil_laugh @ Dec 20 2012, 23:03) *
То есть Вы делаете простую однокаскадную передискретизацию, но с таким вот хитрым фильтром? А на какую частоту дискретизации фильтр считался? Я так понимаю, Вы не делали "честное" повышение частоты дискретизации до 44100*128, а сделали как-то по-другому? А как?

Да, однокаскадная децимация. В полифазной фильтрации нет ничего "хитрого", она известна давно, есть даже статья в википедии http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%...%86%D0%B8%D1%8F
довольно понятно все описано. никакого повышения/понижения делать не надо. преимущество в том, что все вычисления производятся на выходной частоте дискретизации.
Go to the top of the page
 
+Quote Post
evil_laugh
сообщение Dec 20 2012, 20:09
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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
довольно понятно все описано. никакого повышения/понижения делать не надо. преимущество в том, что все вычисления производятся на выходной частоте дискретизации.

Это мне понятно. Но фильтр же рассчитывается на промежуточную частоту дискретизации? Полифазная фильтрация - это метод разбиения одного большого фильтра на несколько маленьких с низкой частотой дискретизации. Но исходный-то фильтр (который разбиваем) работает на большой частоте?
Go to the top of the page
 
+Quote Post
Serg76
сообщение Dec 20 2012, 20:24
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(evil_laugh @ Dec 21 2012, 00:09) *
Это мне понятно. Но фильтр же рассчитывается на промежуточную частоту дискретизации? Полифазная фильтрация - это метод разбиения одного большого фильтра на несколько маленьких с низкой частотой дискретизации. Но исходный-то фильтр (который разбиваем) работает на большой частоте?

нет, все фильтры работают на низкой частоте. изначально характеристика фильтра рассчитывается на нормированную частоту 12800/44100, а затем для каждого элементарного фильтра пересчитываем эту характеристику с учетом смещения. в процессе фильтрации для каждого выходного отсчета вычисляем отклики двух соседних фильтров и проводим линейную интерполяцию между ними. поэтому выходной спектр и "обогащается" гармониками, которых не было во входном сигнале.
Go to the top of the page
 
+Quote Post
alex_os
сообщение Dec 21 2012, 06:32
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030



Цитата(Serg76 @ Dec 20 2012, 23:24) *
нет, все фильтры работают на низкой частоте. изначально характеристика фильтра рассчитывается на нормированную частоту 12800/44100, а затем для каждого элементарного фильтра пересчитываем эту характеристику с учетом смещения. в процессе фильтрации для каждого выходного отсчета вычисляем отклики двух соседних фильтров и проводим линейную интерполяцию между ними. поэтому выходной спектр и "обогащается" гармониками, которых не было во входном сигнале.

Т.е метод эквивалентный предложенному ув. termit ? А сколько фаз и какая длина каждой фазы ?


--------------------
ну не художники мы...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 14:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016