Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: БПФ и ОБПФ с перекрытием
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
rx9cim
Здравствуйте!
Необходимо делать БПФ с перекрытием (overlapping). В моем случае будет буфер длиной 512 выборок.
БПФ будет длиной 256, перекрытие соответственно 50%. Т.е. на 512 сэмплов у меня будет 3 ДПФ - (1-256, 129-384, 256-512). Теперь собственно вопрос - как мне потом после трех ОБПФ склеить конец с началом каждого интервала? Я так понимаю, что нужно для каждого из трех интервалов сделать ОБПФ чтобы перейти в временную область. А после обпф мне необходимо просуммировать отсчеты? Т.е. допустим после первого ОБПФ я получил отсчеты для интервала 1-256, после второго - 129-384, третьего -256-512. Далее нужно просто просуммировать отсчеты ОБПФ (во временной области) в местах перекрытия? Нужно ли перемножать спектры в местах перекрытия а потом уже делать ОБПФ?
V_G
Вообще-то суммирование с перекрытием чаще всего делается для учета переходных процессов. В вашем случае первый сегмент во временной области должен содержать, к примеру, 128 первых отсчетов и 128 нулевых. Делаете БПФ длиной 256. Второй сегмент содержит отсчеты 129-256 и еще 128 нулевых, и так далее. Затем делается домножение спектров на ЧХ фильтра, ОБПФ и суммирование во временной области. Делается это для обработки непрерывных (в смысле не ограниченных по времени и числу отсчетов) сигналов.
А вам зачем для всего 512 отсчетов делать сегментирование?
rx9cim
Спасибо за ответ. Сигнал конечно будет непрерывный. Еще возник вопрос- мне нужен результат бпф для определения и коррекции характеристик дисбаланса
квадратурного сигнала. Так вот как при этом корректно использовать бпф, ведь половину входных отсчетов нужно обнулять, а мне нужна полная картина. И еще дает ли выигрыш применение окон для сглаживания стыков?
V_G
Я не писал, что половину отсчетов надо обнулять. Конкретно:
Сегмент 1: отсчеты 1-128 + 128 нулевых
Сегмент 2: отсчеты 129-256+128 нулевых...
Где здесь обнуление?
Вообще-то количество нулевых отсчетов должно соответствовать длине импульсной характеристики фильтра. Если длина = 56 отсчетов, то и перекрытие может быть всего 56 отсчетов:
Сегмент 1: отсчеты 1-200 + 56 нулевых
Сегмент 2: отсчеты 201-400+56 нулевых...

Дополнение нулевыми отсчетами нужно, чтобы при любом типе входного сигнала вся выходная реакция целиком укладывалась в длину сегмента
petrov
Цитата(V_G @ Jan 7 2013, 16:40) *
Дополнение нулевыми отсчетами нужно, чтобы при любом типе входного сигнала вся выходная реакция целиком укладывалась в длину сегмента


Только rx9cim хочет фильтровать непосредственно в частотной области c произвольными коэффициентами, при этом трудно обеспечить дополненность нулевыми отсчётами ИХ фильтра.
rx9cim
Пока ничего фильтровать не нужно. суть такова — мне нужно сделать бпф, набрать статистику, определить параметры дисбаланса и откорректировать бины бпф, затем сделать обпф и дальнейшую обработку проводить уже во временной области. Как дополнение нулями вляет на результат бпф? Если я делаю дополнение нулями, то как мне использовать результат бпф для расчета дисбаланса?
petrov
Цитата(rx9cim @ Jan 7 2013, 18:41) *
Пока ничего фильтровать не нужно. ...откорректировать бины бпф...


Это как бы оно и есть.

Как вы хотите с 50% перекрытием не выйдет качественной реализации, алиасинг будет большой, нужно что-то вроде 90% перекрытия с окном кайзера с beta=10, что по вычислительным затратам не самый оптимальный вариант.


thermit
Цитата
petrov:
90% перекрытия с окном кайзера с beta=10, что по вычислительным затратам не самый оптимальный вариант.


Хватит и 50%. Окно кайзера или kbd.
анатолий
Всякое изменение спектра после БПФ и перед ОБПФ - это фильтрация. Следует рассматривать методы секционированной свертки с исп. БПФ, описанные в литературе. Иначе выходной сигнал будет совсем не похожий на входной.
rx9cim
Применил алгоритм перекрытие с накоплением. Применяю алгоритм БПФ radix4, исходники из библиотеки CMSIS для STM32. Так вот при наложении окна (у меня БЛэкмэн-Наталл) на входной буфер, пи прослушивании возникают искажения. Если окно не использую - то все нормально звучит. Перекрытие 50%. После ОБПФ результат практически совпадает с входными значениями для расчета БПФ. Почему при наложении окана возникают искажения?
petrov
Цитата(rx9cim @ Jan 20 2013, 13:22) *
Применил алгоритм перекрытие с накоплением. Применяю алгоритм БПФ radix4, исходники из библиотеки CMSIS для STM32. Так вот при наложении окна (у меня БЛэкмэн-Наталл) на входной буфер, пи прослушивании возникают искажения. Если окно не использую - то все нормально звучит. Перекрытие 50%. После ОБПФ результат практически совпадает с входными значениями для расчета БПФ. Почему при наложении окана возникают искажения?


Окно должно обладать свойством, чтобы сумма окон с данным сдвигом равнялась константе.
V_G
Я писал о разбиении входного сигнала без перекрытий, перекрытия возникали при суммирование ВЫХОДНЫХ сегментов. В этом случае наложение оконной функции на входной сегмент принципиально вызывает искажения.
Если и входные сегменты делаются с перекрытием, см. совет от petrov, но смысла перекрытия по входу я лично не понимаю.
Т.е., в моем представлении, оконные функции нужны чисто для спектрального анализа без восстановления временных характеристик. Если здесь есть крутые спецы в ЦОС, пусть меня поправят.
rx9cim
Попробовал окна Ханна и Хэмминга - искажения все-равно есть. С Хэммингом, правда меньше. Размер БПФ/ОБПФ - 256 точек.
petrov
Цитата(rx9cim @ Jan 20 2013, 16:05) *
Попробовал окна Ханна и Хэмминга - искажения все-равно есть. С Хэммингом, правда меньше. Размер БПФ/ОБПФ - 256 точек.


Для идеального восстановления Хэммингу нужно 75% перекрытие.
https://ccrma.stanford.edu/~jos/sasp/STFT_H..._Window_75.html

А вообще можно и для 50% Хэмминга сделать.
https://ccrma.stanford.edu/~jos/sasp/Overla...omposition.html
thermit
Вообще-то что хемминг, что ханн дают идеальное восстановление с 50% перекрытием.
Просто для таких операций надо брать вместо a-b*cos(2*pi*(0:255)/255);
a-b*cos(2*pi*(0:255)/256). Т е окно будет несимметричным.
Кроме того, если с дпф будут осуществлятся какие-то операции нужно применять окно как по входу, так и по выходу.
Причем в качестве окна берется корень из исходного.
petrov
Цитата(thermit @ Jan 21 2013, 16:25) *
Кроме того, если с дпф будут осуществлятся какие-то операции нужно применять окно как по входу, так и по выходу.
Причем в качестве окна берется корень из исходного.


Причём для Хэмминга в этом случае потребуется оверсамплинг 6(перекрытие 83%), чтобы алиасинг был только по боковикам, да и те не маленькие. Всё это обработка низкого качества, не могут быть хорошими фильтры с импульсной типа один большой лепесток.

https://ccrma.stanford.edu/~jos/sasp/Hop_Sizes_WOLA.html
Alexey Lukin
Извлечение корня заметно портит частотную характеристику окна. Лучше корень не извлекать, а взять окно Хана и оверсэмплинг 4, либо окно Блэкмана и оверсэмплинг 8. Применять дважды: при анализе и синтезе.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.