Я использую двухканальный 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;
}
Спасибо, но похоже на линукс. Я использую C, это подходит?
А как насчет for(i = 6000; i < 7000; i++) { do_whatever_with array[i] }
?
Это функция C
@Davide Это выглядит самым простым и понятным, я попробую и посмотрю, спасибо!
Добро пожаловать
Есть ли в коде 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]))
я прав?
@кевин, да. Если я полностью не понимаю, что делает синтаксис MatLab.
Спасибо! Кстати, у меня возникла проблема с распечаткой ответа. Я написал: for (i = 0; i < 2; i++) { printf("a[%d] = %f\n", i, *ch2newBuffer); ch2newBuffer++;
что я выбираю только два значения из ch2Buffer
хочу проверить, являются ли они тем, что я хочу. Как я могу изменить эту функцию распечатки?
Exception thrown at 0x00007FFF4C2A1399 (vcruntime140d.dll) in Examplefordebug.exe: 0xC0000005: Access violation writing location 0x0000000000000000.
Проблема решена, но я все равно отдам вам должное, спасибо!
вы можете использовать memcpy, где вы можете указать свой исходный адрес в качестве начального адреса, откуда вы хотите скопировать данные, и вместо диапазона вы можете указать количество байтов, которые необходимо скопировать с этого начального адреса, и вам нужно дать адрес назначения для хранения этих данных. и взгляните на справочную страницу, чтобы увидеть ограничения (источник и место назначения не должны перекрываться)