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

 
 
> Оптимизация дискретного преобразования Фурье, Как уменьшить время вычисления ДПФ?
Olegas
сообщение Sep 26 2016, 11:25
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 28-11-15
Пользователь №: 89 496



Всем доброго времени суток!
Для реализации распознавания отдельных слов потребовалось вычисление дискретного преобразования Фурье. Быстрое преобразование применить нельзя, поскольку число отсчётов не является степенью двойки (в противном случае ухудшаются результаты работы основного алгоритма). Восстановление сигнала после преобразования не требуется, всё, что нужно от ДПФ - амплитуда и частота.

Сейчас вычисляю ДПФ формулами по определению (формулы ниже, плюс ещё вычисление амплитуды). При обработке одного слова требуется выполнить 30 преобразований Фурье. Число отсчётов лежит в пределах 200 - 500 (конкретное значение заранее неизвестно), но одинаковое для всех тридцати преобразований.



В результате при реализации такого алгоритма на stm32f417 при частоте 168 МГц и арифметике с 32-битными float эти 30 преобразований (анализ одного произнесённого слова) вычисляются четыре-пять секунд, что составляет большую часть времени всех вычислений (80%).

Для вычисления коэффициентов ДПФ и квадратных корней использую функции DSP-ядра этого микроконтроллера (синус, косинус, квадратный корень). И большую часть времени (68%) занимает как раз вычисление этих самых коэффициентов.

Как ещё можно ускорить вычисление ДПФ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение Sep 28 2016, 08:01
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Olegas @ Sep 26 2016, 11:25) *
Для вычисления коэффициентов ДПФ и квадратных корней использую функции DSP-ядра этого микроконтроллера (синус, косинус, квадратный корень). И большую часть времени (68%) занимает как раз вычисление этих самых коэффициентов. Как ещё можно ускорить вычисление ДПФ?

Ну так, заранее вычислите эти коэффициенты и разместите их в таблице.

У меня на 100 МГц ДСП двойной МАК для преобразования Фурье вычисляется за 10 нс. Т.о., для 200-500 точек время счёта Re/Im одной палки составит порядка 2-5 мкс. Для 30 частот время счета составит 60-150 мкс. Но это прикид для 100 МГц тактовой, а у вас 168 МГц тактовая, так что о каких секундах может идти речь?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Olegas
сообщение Sep 28 2016, 17:13
Сообщение #3





Группа: Участник
Сообщений: 5
Регистрация: 28-11-15
Пользователь №: 89 496



Цитата(=GM= @ Sep 28 2016, 11:01) *
Ну так, заранее вычислите эти коэффициенты и разместите их в таблице.


Я, наверное, неоптимально представляю, но для N отсчётов ДПФ требуется матрица размером N^2. Взяв по максимуму N=500 получим: 4*N^2=4*500^2/1024=976 КБ. Многовато.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 30 2016, 06:52
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Olegas @ Sep 28 2016, 16:13) *
Я, наверное, неоптимально представляю, но для N отсчётов ДПФ требуется матрица размером N^2. Взяв по максимуму N=500 получим: 4*N^2=4*500^2/1024=976 КБ

Ну прямо в лоб-то считать не надо. Ваша таблица по рядам (и по столбцам) будет многократно повторяться.

Лучше составьте таблицу одного периода синуса на N=500 точек (для двоичного ЦПУ практичнее брать число N степени двойки, например N=512).
Для первой палки считаете МАКи, беря синусы: 0,1,2,..,499 (всего 500), для второй палки берете каждый второй: 0,2,4,..,498,0,2,4,..,498 (всего 500).
Для третьей палки берете каждый третий:0,3,6,.. (всего 500) и так далее.

Ну и не надо считать компоненты спектра (пресловутые "палки") выше частоты Найквиста, поскольку амплитудный спектр симметричен.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Olegas   Оптимизация дискретного преобразования Фурье   Sep 26 2016, 11:25
- - ViKo   Например, увеличить в 4 раза частоту выборок, и де...   Sep 26 2016, 11:32
- - andyp   Цитата(Olegas @ Sep 26 2016, 14:25) В рез...   Sep 26 2016, 11:34
- - _pv   FFT требует ~100 тактов на отсчёт, соответственно ...   Sep 26 2016, 13:49
- - Olegas   Дело в том, что для распознавания необходим весь с...   Sep 27 2016, 06:29
- - Александр77   Глядя на первый график (на котором представлены сп...   Sep 27 2016, 06:42
- - _pv   интерполировать надо нормально. от линейной интерп...   Sep 27 2016, 06:50
- - Olegas   То, что частоты сдвинуты - не страшно. Гораздо хуж...   Sep 27 2016, 07:24
|- - Александр77   Цитата(Olegas @ Sep 27 2016, 10:24) То, ч...   Sep 27 2016, 12:02
|- - Olegas   Цитата(Александр77 @ Sep 27 2016, 15:02) ...   Sep 27 2016, 19:35
- - ViKo   Так вы не интерполируйте свой файл, тем более, лин...   Sep 27 2016, 07:33
- - _pv   этот файл "1.wav" сюда прикрепите   Sep 27 2016, 07:56
- - x893   Когда то для ускорения использовали только uint16 ...   Sep 27 2016, 12:25
|- - _pv   Цитата(x893 @ Sep 27 2016, 18:25) Когда т...   Sep 27 2016, 12:55
- - _pv   ЦитатаЭто хорошая идея, если коэффициент нормировк...   Sep 28 2016, 09:31
- - _pv   1) считайте ДПФ Герцелем - пример в предыдущем пос...   Sep 28 2016, 17:46
- - анатолий   Для обработки речи что ДПФ, что БПФ - всё едино, т...   Oct 5 2016, 15:34


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

 


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


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