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

 
 
> 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 19 2012, 18:30
Сообщение #2


Участник
*

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



Цитата(alex_os @ Dec 19 2012, 08:28) *
А если так попробовать:
1. Делаем ФHЧ тактовой 44100 с подавлением -60 дБ на 6.2 кГц
2. Полиноминальный интерполятор 3го порядка, или вообще линейный.

Порядок ФНЧ у меня получается что-то около 350. Можно его реализовать в частотной области на основе FFT512,
либо способом частотной маски.

Вот тут не совсем понял... Вы предлагаете сперва ограничить по частоте исходный сигнал, а потом куда-то его интерполировать?..

Тем временем я спешу доложить о результатах моих сегодняшних изысканий.

Цитата(des00 @ Dec 18 2012, 19:43) *
судя по всему в вас оверсамплинг в 44,1/6 = 7,35 раза. Берем кубический фарроу, делаем ресамплинг 44100 -> 38400 (тут только надо посмотреть, куда избыточный шум завернется) ну и затем классический дециматор на 3. Матлаб рисует фильтр 155 порядка (затухание на 6400 60дб, в полосе 6000 неравномерность 3дБ), что для децимирующего фильтра не так уж и много.



Сделал я Фарроу. Кубический. Симметричный. Децимирует с 44100 до 38400. Тестировал так: генерировал испытательный синус 0 dBFS с ЛЧМ модуляцией (от 0 до 20 кГц в течение 100 секунд) и прогонял через наскоро набросанную на Си программку. Результат печален. На частотах до 2-3 кГц всё неплохо, гармоники в сигнал не лезут. С повышением частоты начинаются весёлости. Какие - красочно иллюстрирует рисунок ниже. На входе синус 6 кГц, Fд = 44100. На выходе - вот что.



Хорошо видно, что из-за полиномиальной интерполяции в сигнал лезут ложные гармоники просто из-за ошибки интерполяции. Сгенерировал в маткаде идеальный дискретный синус и нашёл разность полученного мной сигнала и идеального. Полная шкала от -32768 до +32767.



Сдаётся мне, что либо этот метод не слишком хорошо применим, либо я что-то делаю не так... Программу проверял, кажется, Фарроу пашет правильно.

Сообщение отредактировал evil_laugh - Dec 19 2012, 18:33
Go to the top of the page
 
+Quote Post
alex_os
сообщение Dec 20 2012, 04:35
Сообщение #3


Знающий
****

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



Цитата(evil_laugh @ Dec 19 2012, 21:30) *
Вот тут не совсем понял... Вы предлагаете сперва ограничить по частоте исходный сигнал, а потом куда-то его интерполировать?..


Понижать частоту дискретизации до требуемой. Тем же фарроу или линейным интерполятором.
Суть в том, что нужно сначала отфильтровать сигнал до требуемых 6.2 кГц а потом переходить
на другую частоту дискретизации. В противном случае все что выше 6.2 кГц неизвестно куда завернется.

upd: По моим оценкам полинома 3го порядка должно хватить чтобы уйти с 44100 на 12800.


Код
Fs = 44100;
K =17   % коэф. передискритезации вверх не важно какой
h0 = ones(1,K);
h1 = conv(h0, h0);  % интерполяция полиномом 1го порядка
h1 = h1/sum(h1);
h2 = conv(h1, h1);
h2 = h2/sum(h2);   % интерполяция полиномом 3го порядка
hfir = firpm(380, [0,6000/(Fs/2), 6200/(Fs/2),1], [1,1,0, 0], [0.01,1]);
figure(1);
freqz(h2,1);
F = [1:Fs/2];
H = freqz(hfir, 1, F, Fs);
figure(1);
plot(F, 20*log10(abs(H)));

htmp = zeros(1, length(hfir)*K);
htmp(1:K:end) = hfir;

hall = conv(htmp, h2);

figure(2);
freqz(hall,1);

Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
ну не художники мы...
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
|- - 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


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

 


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


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