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

 
 
 
Reply to this topicStart new topic
> данный алгоритм на плис, из своего опыта подскажите на сколько быстро будет работать
toshas
сообщение Sep 9 2007, 09:14
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 372
Регистрация: 14-02-06
Пользователь №: 14 339



Добрый день!
хотелось бы сделать на них следующее:

массив из N 16битных чисел и константа D0

for( ; ; ) {
1. каждое число в массиве сдвигается на соседнее место M[i]->M[i+1], M[N] при этом теряется, M[0] освобождается
2. записать извне (spi или паралл.) новое число на место M[0]
3. взять среднее от k чисел M[0],....,M[k] (M1) и M[N-k],.....,M[N] (M2)
4. вычислить (M2-M1)/(N-k)=D
5. сравнить D и D0
}

какова максимально возможная скорость реализации этого алгоритма ?
(так сказать вообще и на микросхемах стоимостью менее 100у.е.)
на сколько большими могут быть заданы числа N и k (хотелось бы N>1.000.000 k>1000)?

спасибо!
Go to the top of the page
 
+Quote Post
vetal
сообщение Sep 9 2007, 09:32
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Цитата
N>1.000.000

только с использованием внешней памяти.
скорость вычисления одного среднего для k=1000 ~ 10мкс при частоте работы памяти ~ 100MHz, или ~ 5мкс для 32битной памяти.
Алгоритм можно и ускорить, если куски 0...k и M-k...M не очень большие и расположены во внутренней памяти.
В общем, скорость вычисления может быть и меньше...
Go to the top of the page
 
+Quote Post
toshas
сообщение Sep 9 2007, 10:22
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 372
Регистрация: 14-02-06
Пользователь №: 14 339



спасибо,
думал будет быстрее, придется видимо использовать только сравнение средним с константой и отказаться от приозводной (
Go to the top of the page
 
+Quote Post
Gate
сообщение Sep 9 2007, 12:05
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943



Буду более оптимистичен, чем vetal.
чтобы посчитать сумму (что тоже самое, что и среднее) последовательно поступающих чисел, нет необходимости каждый раз суммировать весь массив, а можно на каждом такте считать новую сумму из предыдущей:
S(i) = S(i-1) + M[0] - M[N]
Т.о. надо иметь три очереди M[0]...M[k], M[k+1]...M[N-k-1], M[N-k]...M[N], с каждой очередью надо делать 2 операции - читать и записать, если вычисление средних, вычитание и сравнение сделать конвеером, то это 6 тактов. Очень похоже, что 1 и 3 можно хранить во внутренней памяти (если k ~ 1000-2000), тогда быстрее.


--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Sep 9 2007, 16:11
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!


Можно еще проще - кольцевой буфер на N отсчетов
На каждом такте 2 чтения (M[N] и M[k]) и одна запись M[0].
Дальше также как и описал Gate. Вместо длинной операции деления использовать умножения на обратные величины. Итого - 3 такта на входной отсчет и задержка результата на 15 -20 тактов.

При грубом прикиде на Spartan3 (30$) с внешней статической памятью (200 MHz) можно обрабатывать входные отсчеты с чатотой ~60 MHz. Можно и больше если оптимизировать работу с памятью.

Правда это при условии что коэффициенты k,N в процессе работы алгоритма не изменяются.

Успехов! Rob.
Go to the top of the page
 
+Quote Post
toshas
сообщение Sep 10 2007, 07:03
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 372
Регистрация: 14-02-06
Пользователь №: 14 339



спасибо, будем пробовать
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:28
Рейтинг@Mail.ru


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