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

 
 
> Закольцевать данные, программа на Си
Dubov
сообщение Jun 3 2014, 05:09
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Имеется буфер длины N
имеется подпрограмма, принимающая на вход указатель на блок данных длины N.

Буфер заполняется циклически (по заполнении буфера, новый отсчёт поступает в начало буфера).

с каждым новым вызовом подпрограммы, получаемый указатель увеличивается на единицу.

Как закольцевать адресацию массива?

Например, может получится ситуация когда указатель находится в произвольном месте массива:

| (a) ( b ) (PTR) (...) (N) |

тогда подпрограмма должна "знать", что она оперирует с массивом | (PTR) (...) (N) (a) ( b ) |

Сообщение отредактировал Dubov - Jun 3 2014, 05:10
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Jun 12 2014, 20:37
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
Так и обрабатывать. В цикле проверять не дошел ли текущий указатель до конца массива, если да, то сдвигаем его в начало массива

Недавно решал такую же проблему, только "заворот" указателя при использовании данных был недопустимым по потерям производительности.
В результате родился такой код с двойным размером буфера и дублированием данных - где всегда есть непрерывная область отсчётов.
Оптимизатор современных версий GCC очень качественно разворачивает такие конструкции.
Код
static float32_t filter_fir_rx_AUDIO(float32_t NewSample, int_fast8_t reset)
{
    enum { Ntap = Ntap_rx_AUDIO, NtapHalf = Ntap / 2 };
    float32_t v = 0.0f;            //output sample
    // буфер с сохраненными значениями сэмплов
    static float32_t x [Ntap * 2] = { 0.0f, }; // заставить расположить буфер в CCM
    static uint_fast16_t fir_stage = 0;

    if (reset != 0)
    {
        fir_stage = 0;
        memset(x, 0, sizeof x);
        return NewSample;
    }
    //shift the old samples
    fir_stage = (fir_stage == 0) ? (Ntap - 1) : (fir_stage - 1);
    //Calculate the new output
    x [fir_stage] = NewSample;
    x [fir_stage + Ntap] = NewSample;

    uint_fast16_t bh = fir_stage;            // Начало обрабатываемой части буфера
    uint_fast16_t bt = fir_stage + Ntap;    // Позиция за концом обрабатываемого буфера
    uint_fast16_t n = 0;
    while (n < NtapHalf)
    {    
        v += FIRCoef_rx_AUDIO [n ++] * (x [bh ++] + x [-- bt]);
    }
    // Выборка в середине буфера
    v += FIRCoef_rx_AUDIO [n] * x [bh];
    // Обеспечиваем масштабирование к ранее расчитанному усилению фильтра (1.0)
    return v * FIRScale_rx_AUDIO;
}


Сообщение отредактировал Genadi Zawidowski - Jun 12 2014, 20:43
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dubov   Закольцевать данные   Jun 3 2014, 05:09
- - menzoda   Вместе с указателем на данные передавать указатель...   Jun 3 2014, 05:59
|- - Dubov   Цитата(menzoda @ Jun 3 2014, 14:09) Вмест...   Jun 3 2014, 06:38
|- - megajohn   Цитата(Dubov @ Jun 3 2014, 14:48) В идеал...   Jun 3 2014, 06:42
||- - Dubov   Цитата(megajohn @ Jun 3 2014, 14:52) ну д...   Jun 3 2014, 06:47
||- - _pv   Цитата(Dubov @ Jun 3 2014, 17:57) прошу п...   Jun 3 2014, 07:43
||- - megajohn   Цитата(Dubov @ Jun 3 2014, 14:57) прошу п...   Jun 3 2014, 07:50
||- - mdmitry   Цитата(Dubov @ Jun 3 2014, 14:57) прошу п...   Jun 3 2014, 08:29
|- - menzoda   Цитата(Dubov @ Jun 3 2014, 14:48) допусти...   Jun 3 2014, 08:18
- - mempfis_   Цитата(Dubov @ Jun 3 2014, 12:19) Имеется...   Jun 3 2014, 06:02
|- - MaxiMuz   Цитата(mempfis_ @ Jun 3 2014, 13:12) Функ...   Jun 3 2014, 07:30
|- - mempfis_   Цитата(MaxiMuz @ Jun 3 2014, 14:40) Тольк...   Jun 3 2014, 08:13
|- - MaxiMuz   Цитата(mempfis_ @ Jun 3 2014, 15:23) Тогд...   Jun 5 2014, 08:15
|- - megajohn   Цитата(MaxiMuz @ Jun 5 2014, 16:25) тот ж...   Jun 5 2014, 08:24
|- - mempfis_   Цитата(megajohn @ Jun 5 2014, 15:34) авта...   Jun 5 2014, 09:34
|- - menzoda   Цитата(mempfis_ @ Jun 5 2014, 17:44) Тогд...   Jun 5 2014, 15:17
- - Voldemari4   Можно сделать указатель типом BYTE. Если размер ма...   Jun 3 2014, 07:43
- - x893   а может просто код посмотреть ? 1. http://c.learn...   Jun 5 2014, 09:15
- - alexeyv   ЦитатаДа в них и так нет необходимости. Что все пр...   Jun 9 2014, 01:14
|- - Сергей Борщ   Цитата(alexeyv @ Jun 9 2014, 08:24) Видат...   Jun 9 2014, 02:36
- - alexeyv   Цитатано совать его везде "потому что микроко...   Jun 9 2014, 22:27
|- - menzoda   Как раз таки я прекрасно представляю, что будет в ...   Jun 10 2014, 01:47


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

 


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


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