Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Использование оконных функций |
Автор: Dimmak 25.12.2012, 10:59 |
Подскажите, пожалуйста! Как нужно использовать оконные функции совместно с FFT, чтоб при обратном 'склеивании' обработанных фрагментов избежать щелчков ( создать безшовное соединение аудио-материала )? Пытался следующим образом: Оконную обработку применяю для 768 сэмплов. Дальше FFT обработка 512и центральных сэмплов. Снова беру 768 сэмплов и при этом следующие центральные 512 точно следуют за предудущей FFT секцией ( те с перекрытием, как я понимаю ). Разница существенна с оконной функцией и без нее, но заметный шов остается. ![]() Оконные функции использую hanning, hamming, nuttall... |
Автор: Pavia 25.12.2012, 18:12 |
Просто обработка идёт с перекрытием 50-80% |
Автор: Dimmak 26.12.2012, 00:08 | ||
Совсем НЕ понятно... ![]() Те методом подбора нужно определить количество сэмплов, которые необходимо 'подвергнуть' оконной функции ( исходя из того, какая именно оконная функция используктся ( hamming и тд )) ? Так? Пожалуйста, приведите практический пример при котором получается безшовное соединение, типа: Оконная функция - hamming для 700 сэмплов FFT обработка - 512 сэмплов ... |
Автор: vedun 26.12.2012, 01:00 |
Dimmak вы фильтр хотите сделать на основе FFT ? |
Автор: Dimmak 26.12.2012, 02:16 | ||
ДА! ![]() Я хочу чтобы после обратного БПФ ( FFTi ) обработанные секции соединялись без швов, для чего и использую оконные функции. |
Автор: Pavia 26.12.2012, 05:34 |
Пусть у тебя сигнал 1000 000 сэмплов. Берёшь окно пусть 512. Применяешь окно. Делаешь БПФ фильтруешь делаешь обратный БПФ. Сдвигаешь окно на 128-256 сэмплов. количество выбираешь от скорости качества. Сново применяешь окно. Делаешь БПФ фильтруешь делаешь обратный БПФ. Результат от разных окон смешиваешь сложить и поделить там где есть перекрытие. |
Автор: Dimmak 26.12.2012, 11:04 |
Pavia Описываю весь процесс, как я делал: Пусть у меня сигнал размером в 768. Делю его на две секции ( с перекрытием ) по 512 те: 1я секция это сэмплы 1-512 2я - 257-768 перекрытие в данном случае составляет 256 сэмплов ( сэмплы 257 - 512 ). Теперь для каждой секции в отдельности: 1Окно Хамминга - 2FFT - 3фильтрация - 4FFTi Теперь из первой секции я беру последние 256 сэмплов ( 257-512 ), а из второй - первых 256 сэмплов( 1-256 ), сумирую их и делю на значение, при котором достигается максимальная слитность ( 1.2, к примеру ) И соединяю все вместе: 1-256 из первой секции, секция-перекрытие 256 и последних 256 из второй секции. Но при понижение фильтруемых частот до 0.3 и ниже появляются незначительные расхождения на стыках. Так должно быть??? |
Автор: vedun 26.12.2012, 12:41 | ||
Посмотрите в http://dl.dropbox.com/u/9133112/books/%D0%90.%D0%91.%D0%A1%D0%B5%D1%80%D0%B3%D0%B8%D0%B5%D0%BD%D0%BA%D0%BE_%D0%A6%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D1%8F%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2.djvu книге, на странице 265. Там описан алгоритм фильтрации на основе ДПФ, а так же как правильно разбивать сигнал на секции с последующим склеиванием. |
Автор: Dimmak 26.12.2012, 13:06 |
vedun Спасибо, попробую разобраться... Если честно, то я мало чего понял из прочтенного... ![]() ![]() |
Автор: vedun 26.12.2012, 15:45 |
Для начала лучше напишите конкретные вопросы, что именно не понятно? И напишите чёткое ТЗ, что на входе что надо получить на выходе. Я давненько вопросами ЦОС не занимался, могу попробовать вечером своими словами изложить моё понимание вопроса ![]() |
Автор: Dimmak 26.12.2012, 17:17 | ||||||||
Супер! ![]() Меня интересует процесс обработки аудиоматериала посредством FFT преобразования с использованием оконных функций ( Hamming, Hanning... ). Нашел интерсную статью на эту тему. 'Точных' рекомендаций в ней нет и по-этому некоторые мои вопросы выходят из этой самой статьи:
Cледовательно, как я понял: оконная функция( 1024 ) - FFT ( 512 центральных ) - фильтрация - iFFT( 512 центральных )
А в данном случае речь уже идет об усреднении результатов до обратного БПФ... Вариантов много... После того, как я разобрался с FTT и алгоритмом Герцеля мне все эти оконные дела показались простой ерундой, но немного покопавшись я запутался. А задача осталась прежней - качественный FFT фильтр с перекрытием( Ну и постичь возможности, которые дает БПФ ). Мне не нужна простая реализация: я хочу именно разобраться с данным вопросом. ![]() |
Автор: Pavia 26.12.2012, 19:25 | ||||||
Про 0.3 не очень понял. Так и должно быть. Окна не избавляют от искажений. Просто перекрытие и следующее усреднение делает их менее заметными. Чем больше окон приходиться на один сэмпл тем менее заметно.
оконная функция( 1024 ) - FFT ( 1024 центральных ) - фильтрация - iFFT( 1024 центральных ) А вот на выходе берут не все отсчёты. А только центральные и пишут стык в стык. |
Автор: vedun 26.12.2012, 23:53 | ||
Dimmak выше вы написали что хотите реализовать фильтр на основе алгоритма БПФ. Предположительно это должен быть КИХ филтр (по буржуйски FIR). Вам наверно извесно что фильтрация есть процесс вычисления свёртки сигнала с импульсной характеристикой фильтра. Кроме того у вас наврняка есть расчитаная импульсная характеристика вашего фильтра. Дальше вы хотите ускорить вычислительный процесс за счёт применения алгоритма БПФ (FFT). Для наглядности возмём такие исходные данные:
Дополняем ИХ 63 нулями, и считаем БПФ. Результат запоминаем. Назовём вектор результата F. Входной сигнал делится на блоки по 64 отсчёта (без перекрытия, в стык). Каждый входной блок данных дополняется 64 нулями после чего расчитывается его БПФ. Результат БПФ поотсчётно умножается на F. После чего расчитываем ОБПФ, длина которого равна 128 отсчётам. Такие выходные блоки объединяются с перекрфтием 64 точки. Перекрывающиеся точки суммируются. В результате объединения мы имеем фильтрованый сигнал. Эфективность будет тем выше, чем большую размерность БПФ мы возмём. Как видите весовые функции не имеют никакого отношения к алгоритму фильтрации на основе БПФ. Они используются лишь на этапе расчёта коэфициентов фильтра (его ИХ). Сдесь я описал алгоритм перекрытия с суммированием (overlap-add). Вот как то так и надо делать цифровой фильтр в моём представлении ![]() |
Автор: Dimmak 28.12.2012, 12:34 | ||||||
Pavia, vedun Как снег на голову неотложные дела, но я вернулся и снова в строю! Для того, чтобы избежать непониманий и с моей и вашей сторон предлагаю манипулировать более точными величинами. Изложу материал насколько понял: Есть 16 сэмплов ( разбил их на 2 секции для простоты и наглядности, оБПФ обозначил ==== ) секция А секция Б ( 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 ) ___=====____ ___=====____ ___======___ 1. ( для сэмлов А1 - А8 ) - Оконная функция - БПФ - фильтрация. ( для сэмплов А3-А6 ) - оБПФ. 2. ( для сэмлов А3 - Б2 ) - Оконная функция - БПФ - фильтрация. ( для сэмплов А5-А8 ) - оБПФ и тд.
3. В местах пересечения результат оБПФ( отфильтрованная волна ) суммирую и делю на 2. Так?
Не совсем понятно... vedun
К сожалению сюда я еще не добрался, но как только разберусь с оконными перекрытиями, то с радостью займусь данным материалом! ![]() |
Автор: vedun 28.12.2012, 12:56 | ||||
![]() |
Автор: Dimmak 28.12.2012, 13:58 | ||||
Хорошо. В данном случае под фильтрацией я подразумевал простое изменение амплитуд ( magnitude ) сигнала, полученных с помощью БПФ.
Отфильтрованный сигнал... |
Автор: vedun 28.12.2012, 14:07 |
С помощью простого выкидывания отсчётов результата БПФ, с последующим ОБПФ вы фильтр не получите, как бы заманчиво это не выглядело. Отсюда и проблемы на стыках при восстановлении сигнала после БПФ. Я бы вам рекомендовал вначале сделать фильтр без БПФ. |
Автор: Dimmak 28.12.2012, 16:12 | ||
vedun Насколько я понимаю, именно изменение величин ( magnitude ) является обычным FFT фильтром. Само собой, FFT фильтр и FIR фильтр немного разные темы..
Спасибо за рекомендацию, но я хотел бы все-таки сначала разобраться с оконным перекрытием. ![]() |
Автор: vedun 28.12.2012, 16:54 | ||||
|
Автор: Dimmak 28.12.2012, 17:17 |
Я понял в чем вопрос. 1. Делаем FFT получаем 2массива ( real & imag ) 2. Далее высчитывает по формулам величины частот( громкость гармоник( magnitude )) и фазу каждой из частот. Те если у нас, к примеру 1024 отчета, следовательно получаем 512 частот, равномерно расположенных друг от друга. Если взять SR 44100, то шаг будет составлять ~86гц. Понятное дело, что погрешность при таких расчетах просто опупительная, для чего и забивают массив нулями или увеличивают количество отчетов ( да или то и другое ). Можно к примеру понизить SR в 2, 4... раза. Вариаций много, но это уже детали. 3. Далее конвертируем массив отредактированных величин частот ( их у нас 512, в данном примере ) и массив фаз ( Magnitude, Phase ) в ( real & imag ) и только после этого делаем iFFT. Это и является обычным FFT фильтром, в моем понимании. ![]() |
Автор: vedun 28.12.2012, 17:46 |
Понятно. Я бы не стал называть это фильтром, в моём понимании это игра в напёрстки с сигналом с неизвестным результатом ![]() Добавлено: Хотя можно поступить так: сдвигать каждый раз окно на один отсчёт, тогда после прямого фурье можно крутить амплитуду и фазу каждой частоты как вам нужно. В итоге это будет эквивалентно банку фильтров с sinc огибающей на каждой частоте. |
Автор: Pavia 28.12.2012, 19:58 | ||
![]() |
Автор: Dimmak 28.12.2012, 20:30 | ||
ОК! Давайте пробежимся по FFT базе знаний. Что именно в корне не верно? ![]() |
Автор: Dimmak 28.12.2012, 21:12 | ||
Не совсем понимаю что это дает. Пожалуйста, подробности по этому моменту. А вот по-поводу фазы, чтоб ее крутить, нужно чтоб сетка FFT довольно точно совпала с модифицируемой частотой ( 2 - 3 знака после запятой ) |
Автор: vedun 28.12.2012, 22:18 | ||||
![]() |
Автор: Dimmak 29.12.2012, 07:44 | ||||||
vedun
Ясно.
В таком случае погрешность фазы до 2х градусов. Pavia
Нули добавляются для уменьшения шага сетки. Ели Вы о том, что сигнал с нулями невозможно обратно преобразовать, так ведь можно еще рассматрива оБПФ как гармонический синтезатор. Только в этом случае точность определения гармоник и фаз должна быть довольно высокой. vedun, Pavia Кроме Сергиенко вам известны книги, из которых можно подчерпнуть информацию об использовании оконных функций с FFT? |
Автор: vedun 29.12.2012, 11:05 | ||
http://lord-n.narod.ru/walla.html смотрим раздел ЦОС и выбираем. Ещё рекомендую зайти http://dsplib.ru/. |
Автор: Dimmak 29.12.2012, 13:39 |
Спасибо vedun ![]() |