Пн дек 11, 2017 21:56:49
Вт дек 12, 2017 18:51:47
Вт дек 12, 2017 19:52:34
Вт дек 12, 2017 20:01:59
Чт дек 21, 2017 15:40:13
Чт дек 21, 2017 15:57:06
Чт дек 21, 2017 15:58:33
void reverse_arr(int16_t *arr, uint16_t size) { // развернуть массив
uint16_t i;
int16_t temp;
for (i = 0; i < size / 2; i++) {
temp = arr[i];
arr[i] = arr[size - 1 - i];
arr[size - 1 - i] = temp;
}
}
void shift_arr(int16_t *arr, uint16_t shift, uint16_t size) { // циклически сдвинуть массив размером size на shift элементов
reverse_arr(&arr[size - shift], shift);
reverse_arr(arr, size - shift);
reverse_arr(arr, size);
}
void shift_arr(int16_t *arr, uint16_t shift, uint16_t size) { // циклически сдвинуть массив размером size на shift элементов
int16_t buf[100];
memcpy(buf, &arr[size - shift], shift * 2); // копируем последние елементы в буфер
memmove(&arr[shift], arr, (size - shift) * 2); // сдвигаем
memcpy(arr, buf, shift * 2); // копируем из буфера в начало
}
Чт дек 21, 2017 17:56:20
по идее memcpy для 32-битной платформы должна активно использовать именно 32-битные пересылки, поэтому должна выигрывать у 16-битного копирования... хотя кто знает, сделано это в arm-libc или нет... да и я не в курсе, есть ли разница у ARM-ов...Apparatchik писал(а):контроллер STM32 компилятор GCC
Чт дек 21, 2017 18:30:47
Чт дек 21, 2017 20:18:52
Чт дек 21, 2017 20:19:32
Чт дек 21, 2017 21:03:24
Чт дек 21, 2017 23:14:00
Пт дек 22, 2017 01:15:39
Пт дек 22, 2017 04:04:44
Пт дек 22, 2017 09:29:00
Пт дек 22, 2017 09:37:46
то есть я угадал, предположив, что libc содержит оптимальную memcpy. тогда снова предположу, что еще быстрее сдвинуть можно при помощи DMA...Apparatchik писал(а):Эксперементально выяснено что второй вариант работает лучше, но может есть более быстрые варианты.
Пт дек 22, 2017 09:47:38
Пт дек 22, 2017 10:16:22
да все понятно уже. все получается абсолютно без сдвиговApparatchik писал(а):Выборки две, они набираются паралельно, на 400 элементов, но одну нужно сдвинуть относительно другой, обычно на 5-6 элементов, но может менятся. Сдвинуть надо именно циклично, тоесть задние элемеенты должны оказатся с переди, это важно для следуйщих расчетов.
int16_t buf_U[400];
int16_t buf_I[400];
#define SDVIG 5
//обрабатываете свои буферы С УЧЕТОМ СДВИГА как-то так
uint16_t index_I=SDVIG;
int32_t sum;
for(int i=0; i<400; i++){
sum += buf_U[i] * buf_I[index_I];
if(++index_I >= 400) index_I = 0;
}
Пт дек 22, 2017 10:34:20
// пишем в первую половину массива разницу между первой и второй половиной,
for (i = max_index / 2, j = i; i < max_index; i++) {
current[i - j] -= current[i];
}
// во вторую половину пишем первую с противоположным знаком
for (i = max_index / 2, j = i; i < max_index; i++) {
current[i] = current[i - j] * (-1);
}