WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Циклический буфер

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Циклический буфер
zlelik опубликован 21-09-2001 22:46 MSK   Click Here to See the Profile for zlelik   Click Here to Email zlelik  
Как создать циклический буфер.
migel опубликован 22-09-2001 13:26 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
"...Ну вы блин даете..."
читайте классику
// на птичьем языке
class Cyclic_Buffer// n()
{
public:
bool Add(const class Object& obj);
protected:
Array<Objects> m_arr; // сам буффера
int m_buffSize; // размер буфера
int m_bInsertPos;
}

// основная идея
bool Cyclic_Buffer::Add(const class Object& obj)
{
// переключимся на начало если заполнили буфер полностью
if (m_nInsertPos >= m_buffSize)
m_nInsertPos = 0;

m_arr[m_nInsertPos] = obj
}

migel опубликован 22-09-2001 16:22 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
sorry
m_arr[m_nInsertPos++] = obj
zlelik опубликован 24-09-2001 20:17 MSK     Click Here to See the Profile for zlelik  Click Here to Email zlelik     
Я понимаю что это просто, но мне нужно максимально быстро и без классов.

мне был предложен такой вариант

delay_buffer[n&delay_mask] = in;

delay_mask размер буфера -1
n меняется от 0 до delay_mask,

Я работаю со звуком и мне нужен задержанный сигнал.
Делаю так

out=delay_buffer[(n-delay)&delay_mask];

при твоем способе будет обращение к элементу с отрицательным индексом, а если сделать так
if (delay<nDelayBuffI)
out=delay_buffer[(n-delay)];
else
out=0;
то будет ноль через каждые delay_mask отсчетов (это не есть гуд)

Есть ли способ делать циклический буфер быстрее чем у меня?

migel опубликован 24-09-2001 23:30 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Ты спрашивал как сделать а не как оптимизировать
посему азы и приведены
так ведь не должно быть отрицательных индексов в циклическом буффере просто для него
if (n - delay < 0)
index = delay_mask+n-delay; //взять с хвоста
else
index = n-delay;

в принципе можно оптимизировать вычисления при переходе хвост голова через дополнения до 1 отрицательного числа (~)

Flex Ferrum опубликован 25-09-2001 10:08 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
zlelik:
Все правильно тебе предложили, только с одной оговоркой. Этот способ будет работать при величине буффера, равной одной из степеней двойки. Для произвольного размера лучше использовать такой способ:
delay_buffer[n % deleay_mask] = data;
А быстрее только на чистом асме.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.