![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
SAB |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 23 Репутация: ![]() ![]() ![]() |
В программе есть цикл, обрабатывающий данные из файла:
Код repeat Read(f_in,d); SinCos(j*2*pi*k/N,s1,c1); A1:=d.Zn*c1; SA:=SA+A1; B1:=d.Zn*s1; SB:=SB+B1; k:=k+1; until k>N-1; В файле более 50000 значений. Такой цикл выполняется несколько томительных секунд. Может кто знает: как ускорить его выполнение? Сообщение отредактировано: volvo - 5.01.2005 14:03 -------------------- Человек должен думать, а компьютер работать.
|
![]() ![]() |
Vit |
![]()
Сообщение
#2
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 156 Пол: Мужской Репутация: ![]() ![]() ![]() |
Привожу FFT-алгоритм, позволяющий оперировать 256 точками данных примерно за 0.008 секунд на P66 (с 72MB, YMMV). Создан на Delphi.
Данный алгоритм я воспроизвел где-то около года назад. Вероятно он не самый оптимальный, но для повышения скорости расчета наверняка потребуются более мощное аппаратное обеспечение. Но я не думаю что алгоритм слишком плох, в нем заложено немало математических трюков. Имеется некоторое количество рекурсий, но они занимается не копированием данных, а манипуляциями с указателями, если у нас есть массив размером N = 2^d, то глубина рекурсии составит всего d. Возможно имело бы смысл применить развертывающуюся рекурсию, но не пока не ясно, поможет ли ее применение в данном алгоритме. (Но вероятно мы смогли бы достаточно легко получить надежную математическую модель, развертывая в рекурсии один или два нижних слоя, то есть проще говоря: if Depth < 2 then {производим какие-либо действия} вместо текущего 'if Depth = 0 then...' Это должно устранить непродуктивные вызовы функций, что несомненно хорошо в то время, пока развертывающая рекурсия работает с ресурсами.) Имеется поиск с применением таблиц синусов и косинусов; здесь использован метод золотой середины: данный алгоритм весьма трудоемок, но дает отличные результаты при использовании малых и средних массивов. Вероятно в машине с большим объемом оперативной памяти следует использовать VirtualAlloc(... PAGE_NOCACHE) для Src, Dest и таблиц поиска. Если кто-либо обнаружит неверную на ваш взгляд или просто непонятную в данном совете функцию пожалуйста сообщите мне об этом. Что делает данная технология вкратце. Имеется несколько FFT, образующих 'комплексный FT', который понимает и о котором заботится моя технология. Это означает, что если N = 2^d, Src^ и Dest^ образуют массив из N TComplexes, происходит вызов FFT(d, Src, Dest) , далее заполняем Dest с применением 'комплексного FT' после того, как результат вызова Dest^[j] будет равен 1/sqrt(N) * Sum(k=0.. N - 1 ; EiT(2*Pi(j*k/N)) * Src^[k]) , где EiT(t) = cos(t) + i sin(t) . То есть, стандартное преобразование Фурье. Публикую две версии: в первой версии я использую TComplex с функциями для работы с комплексными числами. Во второй версии все числа реальные - вместо массивов Src и Dest мы используем массивы реальных чисел SrcR, SrcI, DestR, DestI (в блоке вычислений реальных чисел), и вызовы всех функций осуществляются линейно. Первая версия достаточна легка в реализации, зато вторая - значительно быстрее. (Обе версии оперируют 'комплексными FFT'.) Технология работы была опробована на алгоритме Plancherel (также известным как Parseval). Обе версии работоспособны, btw: если это не работает у вас - значит я что-то выбросил вместе со своими глупыми коментариями :-) Итак, сложная версия: ![]() ![]() ![]() ![]() ![]() ![]() **** Версия для работы с реальными числами: ![]() ![]() ![]() ![]() Взято с www.delphiworld.narod.ru -------------------- With the best regards Vit
Все всегда уезжают навсегда. Вернуться невозможно-вместо нас всегда возвращается кто-то другой |
![]() ![]() |
![]() |
Текстовая версия | 13.07.2025 23:23 |