Как я могу выбрать определенный диапазон данных из массива в C?

Я использую двухканальный DAQ с режимом потоковой передачи данных.

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

Есть ли в коде C функция, аналогичная Matlab array(6000:7000)?

Вот мой код для получения данных канала 1 и канала 2, и я хочу выбрать определенный диапазон данных из ch1Buffer[i] и ch2Buffer[i]

uInt32 i, n;
uInt8* pu8Buffer = NULL;
int16* pi16Buffer = NULL;
int64 i64Sum = 0;
float max1 = 0;
float max2 = 0;
double Corrected = 0;
double AUC = 0;
int16* ch1Buffer = NULL;
int16* ch2Buffer = NULL;
double SumBufferData( void* pBuffer, uInt32 u32Size, uInt32 u32SampleBits )
{
    // In this routine we sum up all the samples in the buffer. This function 
    // should be replaced with the user's analysys function
    if ( 8 == u32SampleBits )
    {
        pu8Buffer = (uInt8 *)pBuffer;
        for (i = 0; i < u32Size; i++)
        {
            i64Sum += pu8Buffer[i];
        }
    }
    else
    {
        pi16Buffer = (int16 *)pBuffer;
        fftw_complex(hilbertedch2[N]);

        ch1Buffer       = (int16*)calloc(u32Size/2, sizeof(int16));
        ch2Buffer       = (int16*)calloc(u32Size/2, sizeof(int16));

        // Divide ch1 and ch2 data from pi16Buffer
        for (i = 0; i < u32Size/2; i++)
        {
            ch1Buffer[i] += pi16Buffer[i*2];
            ch2Buffer[i] += pi16Buffer[i*2 + 1];
        }
        // Here hilbert on the whole ch2
        hilbert(ch2Buffer, hilbertedch2);

        //Find max value in each segs of ch1 and ch2
        for (i = 0; i < u32Size/2; i++)
        {
            if (ch1Buffer[i] > max1)
                max1 = ch1Buffer[i];

            if (abs(hilbertedch2[i][IMAG])> max2)
                max2 = abs(hilbertedch2[i][IMAG]);
        }
        Corrected = (max2 / max1); // Calculate the signal correction
    }
    free(ch1Buffer);
    free(ch2Buffer);
    return Corrected;
}

вы можете использовать memcpy, где вы можете указать свой исходный адрес в качестве начального адреса, откуда вы хотите скопировать данные, и вместо диапазона вы можете указать количество байтов, которые необходимо скопировать с этого начального адреса, и вам нужно дать адрес назначения для хранения этих данных. и взгляните на справочную страницу, чтобы увидеть ограничения (источник и место назначения не должны перекрываться)

IrAM 17.12.2020 19:03

Спасибо, но похоже на линукс. Я использую C, это подходит?

Kevin 17.12.2020 19:54

А как насчет for(i = 6000; i < 7000; i++) { do_whatever_with array[i] }?

anotherOne 17.12.2020 19:58

Это функция C

IrAM 17.12.2020 20:02

@Davide Это выглядит самым простым и понятным, я попробую и посмотрю, спасибо!

Kevin 17.12.2020 22:13

Добро пожаловать

anotherOne 17.12.2020 22:16
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
6
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть ли в коде C аналогичная функция, такая как массив Matlab (6000: 7000)?

Да, это называется memcpy. Но будучи C, его сложнее использовать, и он не знает о структуре и размере ваших данных.

int source_array[500]; 
// assume array gets filled somehow

int dest_array[50];
// dest_array = source_array[100:150] (not C code)
memcpy(dest_array, &source_array[100], 50*sizeof(source_array[0]);

А поскольку memcpy сильно оптимизирован, он каждый раз опережает цикл for.

Привет, если я правильно понимаю, я создам новый массив с именем ch2newBuffer, чтобы получить интересующее меня значение в диапазоне от 6000 до 7000 от ch2Buffer, а с форматом записи memcpy оно станет memcpy(ch2newBuffer, &ch2Buffer[6000], 1000*sizeof(ch2Buffer[0])) я прав?

Kevin 22.12.2020 13:49

@кевин, да. Если я полностью не понимаю, что делает синтаксис MatLab.

koder 22.12.2020 13:54

Спасибо! Кстати, у меня возникла проблема с распечаткой ответа. Я написал: for (i = 0; i < 2; i++) { printf("a[%d] = %f\n", i, *ch2newBuffer); ch2newBuffer++; что я выбираю только два значения из ch2Buffer хочу проверить, являются ли они тем, что я хочу. Как я могу изменить эту функцию распечатки?

Kevin 22.12.2020 14:11
Exception thrown at 0x00007FFF4C2A1399 (vcruntime140d.dll) in Examplefordebug.exe: 0xC0000005: Access violation writing location 0x0000000000000000.
Kevin 22.12.2020 14:45

Проблема решена, но я все равно отдам вам должное, спасибо!

Kevin 22.12.2020 16:59

Другие вопросы по теме