![]() |
|
![]() ![]() ![]() |
|
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
Подскажите, пожалуйста!
Как нужно использовать оконные функции совместно с FFT, чтоб при обратном 'склеивании' обработанных фрагментов избежать щелчков ( создать безшовное соединение аудио-материала )? Пытался следующим образом: Оконную обработку применяю для 768 сэмплов. Дальше FFT обработка 512и центральных сэмплов. Снова беру 768 сэмплов и при этом следующие центральные 512 точно следуют за предудущей FFT секцией ( те с перекрытием, как я понимаю ). Разница существенна с оконной функцией и без нее, но заметный шов остается. ![]() Оконные функции использую hanning, hamming, nuttall... |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Просто обработка идёт с перекрытием 50-80%
|
|||
|
||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
Совсем НЕ понятно... ![]() Те методом подбора нужно определить количество сэмплов, которые необходимо 'подвергнуть' оконной функции ( исходя из того, какая именно оконная функция используктся ( hamming и тд )) ? Так? Пожалуйста, приведите практический пример при котором получается безшовное соединение, типа: Оконная функция - hamming для 700 сэмплов FFT обработка - 512 сэмплов ... Это сообщение отредактировал(а) Dimmak - 26.12.2012, 00:09 |
|||
|
||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
Dimmak вы фильтр хотите сделать на основе FFT ?
|
|||
|
||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
ДА! ![]() Я хочу чтобы после обратного БПФ ( FFTi ) обработанные секции соединялись без швов, для чего и использую оконные функции. Это сообщение отредактировал(а) Dimmak - 26.12.2012, 02:36 |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Пусть у тебя сигнал 1000 000 сэмплов.
Берёшь окно пусть 512. Применяешь окно. Делаешь БПФ фильтруешь делаешь обратный БПФ. Сдвигаешь окно на 128-256 сэмплов. количество выбираешь от скорости качества. Сново применяешь окно. Делаешь БПФ фильтруешь делаешь обратный БПФ. Результат от разных окон смешиваешь сложить и поделить там где есть перекрытие. |
|||
|
||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
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 и ниже появляются незначительные расхождения на стыках. Так должно быть??? Это сообщение отредактировал(а) Dimmak - 26.12.2012, 12:39 |
|||
|
||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
Посмотрите в этой книге, на странице 265. Там описан алгоритм фильтрации на основе ДПФ, а так же как правильно разбивать сигнал на секции с последующим склеиванием. |
|||
|
||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
vedun Спасибо, попробую разобраться...
Если честно, то я мало чего понял из прочтенного... ![]() ![]() Это сообщение отредактировал(а) Dimmak - 26.12.2012, 13:24 |
|||
|
||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
Для начала лучше напишите конкретные вопросы, что именно не понятно? И напишите чёткое ТЗ, что на входе что надо получить на выходе. Я давненько вопросами ЦОС не занимался, могу попробовать вечером своими словами изложить моё понимание вопроса
![]() |
|||
|
||||
Dimmak |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
Супер! ![]() Меня интересует процесс обработки аудиоматериала посредством FFT преобразования с использованием оконных функций ( Hamming, Hanning... ). Нашел интерсную статью на эту тему. 'Точных' рекомендаций в ней нет и по-этому некоторые мои вопросы выходят из этой самой статьи:
Cледовательно, как я понял: оконная функция( 1024 ) - FFT ( 512 центральных ) - фильтрация - iFFT( 512 центральных )
А в данном случае речь уже идет об усреднении результатов до обратного БПФ... Вариантов много... После того, как я разобрался с FTT и алгоритмом Герцеля мне все эти оконные дела показались простой ерундой, но немного покопавшись я запутался. А задача осталась прежней - качественный FFT фильтр с перекрытием( Ну и постичь возможности, которые дает БПФ ). Мне не нужна простая реализация: я хочу именно разобраться с данным вопросом. ![]() |
||||||||
|
|||||||||
Pavia |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Про 0.3 не очень понял. Так и должно быть. Окна не избавляют от искажений. Просто перекрытие и следующее усреднение делает их менее заметными. Чем больше окон приходиться на один сэмпл тем менее заметно.
оконная функция( 1024 ) - FFT ( 1024 центральных ) - фильтрация - iFFT( 1024 центральных ) А вот на выходе берут не все отсчёты. А только центральные и пишут стык в стык. |
||||||
|
|||||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
Dimmak выше вы написали что хотите реализовать фильтр на основе алгоритма БПФ. Предположительно это должен быть КИХ филтр (по буржуйски FIR). Вам наверно извесно что фильтрация есть процесс вычисления свёртки сигнала с импульсной характеристикой фильтра. Кроме того у вас наврняка есть расчитаная импульсная характеристика вашего фильтра. Дальше вы хотите ускорить вычислительный процесс за счёт применения алгоритма БПФ (FFT). Для наглядности возмём такие исходные данные:
Дополняем ИХ 63 нулями, и считаем БПФ. Результат запоминаем. Назовём вектор результата F. Входной сигнал делится на блоки по 64 отсчёта (без перекрытия, в стык). Каждый входной блок данных дополняется 64 нулями после чего расчитывается его БПФ. Результат БПФ поотсчётно умножается на F. После чего расчитываем ОБПФ, длина которого равна 128 отсчётам. Такие выходные блоки объединяются с перекрфтием 64 точки. Перекрывающиеся точки суммируются. В результате объединения мы имеем фильтрованый сигнал. Эфективность будет тем выше, чем большую размерность БПФ мы возмём. Как видите весовые функции не имеют никакого отношения к алгоритму фильтрации на основе БПФ. Они используются лишь на этапе расчёта коэфициентов фильтра (его ИХ). Сдесь я описал алгоритм перекрытия с суммированием (overlap-add). Вот как то так и надо делать цифровой фильтр в моём представлении ![]() |
|||
|
||||
Dimmak |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
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
К сожалению сюда я еще не добрался, но как только разберусь с оконными перекрытиями, то с радостью займусь данным материалом! ![]() Это сообщение отредактировал(а) Dimmak - 28.12.2012, 12:42 |
||||||
|
|||||||
vedun |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
![]() |
||||
|
|||||
Dimmak |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
Хорошо. В данном случае под фильтрацией я подразумевал простое изменение амплитуд ( magnitude ) сигнала, полученных с помощью БПФ.
Отфильтрованный сигнал... |
||||
|
|||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
С помощью простого выкидывания отсчётов результата БПФ, с последующим ОБПФ вы фильтр не получите, как бы заманчиво это не выглядело. Отсюда и проблемы на стыках при восстановлении сигнала после БПФ. Я бы вам рекомендовал вначале сделать фильтр без БПФ.
|
|||
|
||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
vedun
Насколько я понимаю, именно изменение величин ( magnitude ) является обычным FFT фильтром. Само собой, FFT фильтр и FIR фильтр немного разные темы..
Спасибо за рекомендацию, но я хотел бы все-таки сначала разобраться с оконным перекрытием. ![]() |
|||
|
||||
vedun |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
|
||||
|
|||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
Я понял в чем вопрос.
1. Делаем FFT получаем 2массива ( real & imag ) 2. Далее высчитывает по формулам величины частот( громкость гармоник( magnitude )) и фазу каждой из частот. Те если у нас, к примеру 1024 отчета, следовательно получаем 512 частот, равномерно расположенных друг от друга. Если взять SR 44100, то шаг будет составлять ~86гц. Понятное дело, что погрешность при таких расчетах просто опупительная, для чего и забивают массив нулями или увеличивают количество отчетов ( да или то и другое ). Можно к примеру понизить SR в 2, 4... раза. Вариаций много, но это уже детали. 3. Далее конвертируем массив отредактированных величин частот ( их у нас 512, в данном примере ) и массив фаз ( Magnitude, Phase ) в ( real & imag ) и только после этого делаем iFFT. Это и является обычным FFT фильтром, в моем понимании. ![]() |
|||
|
||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
Понятно. Я бы не стал называть это фильтром, в моём понимании это игра в напёрстки с сигналом с неизвестным результатом
![]() Добавлено: Хотя можно поступить так: сдвигать каждый раз окно на один отсчёт, тогда после прямого фурье можно крутить амплитуду и фазу каждой частоты как вам нужно. В итоге это будет эквивалентно банку фильтров с sinc огибающей на каждой частоте. Это сообщение отредактировал(а) vedun - 28.12.2012, 17:52 |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
![]() |
|||
|
||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
ОК! Давайте пробежимся по FFT базе знаний. Что именно в корне не верно? ![]() |
|||
|
||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
Не совсем понимаю что это дает. Пожалуйста, подробности по этому моменту. А вот по-поводу фазы, чтоб ее крутить, нужно чтоб сетка FFT довольно точно совпала с модифицируемой частотой ( 2 - 3 знака после запятой ) |
|||
|
||||
vedun |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
![]() |
||||
|
|||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Давай дай определение преобразование Фурье. И опиши переход к дискретному Фурье. Рассмотри переход от Дискретного случая с N к M отчётов. В качестве вопроса что дает добавления нулей? Подсказка переход от свёртки по модулю к линейной. В качестве пособия могу посоветовать "А.Б.Сергиенко_Цифровая обработка сигналов" Что будет если добавить нули? А ни чего хорошего тут результат показан http://websound.ru/articles/theory/filter.htm правда однобоко. |
|||
|
||||
Dimmak |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
vedun
Ясно.
В таком случае погрешность фазы до 2х градусов. Pavia
Нули добавляются для уменьшения шага сетки. Ели Вы о том, что сигнал с нулями невозможно обратно преобразовать, так ведь можно еще рассматрива оБПФ как гармонический синтезатор. Только в этом случае точность определения гармоник и фаз должна быть довольно высокой. vedun, Pavia Кроме Сергиенко вам известны книги, из которых можно подчерпнуть информацию об использовании оконных функций с FFT? |
||||||
|
|||||||
vedun |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 23.12.2010 Репутация: 2 Всего: 2 |
||||
|
||||
Dimmak |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2012 Репутация: нет Всего: нет |
Спасибо vedun
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |