ОБНОВЛЕННОЕ ОБНОВЛЕННОЕ РЕШЕНИЕ
Это решение примет ваш CSV и создаст массив, содержащий ваши значения времени, Ax, Ay и Az после того, как они былипреобразован в G.Вы должны быть в состоянии взять этот массив и вставить его прямо в график.
Значение, отображаемое на каждом интервале, будет усредненным ускорением "за" интервал не до или после него.
Я добавил параметр в функцию, чтобы вы могли определить, сколько интервалов в секунду вы хотите отобразить на графике.Это поможет немного сгладить ваш график.
Я также установил начальные и конечные значения.Так как это находит среднее ускорение на интервале, ему нужны данные с обеих сторон интервала.Очевидно, что в 0 мы пропускаем левую часть, а в последнем интервале мы пропускаем правую часть.
Я решил использовать все данные от одного интервала к следующему, это перекрывает половину значений от одногоинтервал до следующего.Это сгладит (уменьшит шум) средних значений вместо того, чтобы подниматься с одного интервала, где другой остановился.Я добавил параметр, в котором вы можете включать и выключать перекрытие.
Надеюсь, это работает для вас!
function formatAccelData($data, $split, $scale, $overlap = TRUE){
if(!$data || !$split || !$scale || !is_int($split) || !is_int($scale)){
return FALSE;
}
$g = 9.80665;
$round = 3;
$value1 = 1;
$value2 = 2;
if(!$overlap){ //Toggle overlapping data.
$value1 = 2;
$value2 = 1;
}
//Set the initial condition at t=0;
$results = array();
$results[0]['seconds'] = 0;
$results[0]['Ax'] = round(($data[0][1])/$g, $round);
$results[0]['Ay'] = round(($data[0][2])/$g, $round);
$results[0]['Az'] = round(($data[0][3])/$g, $round);
$count = 1;
$interval = (int)(1000/$split)/$scale;
for($i = $interval; $i < count($data); $i += $interval){
$Ax = $Ay = $Az = 0;
for($j = $i - ($interval/$value1); $j < $i + ($interval/$value1); $j++){
$Ax += $data[$j][1];
$Ay += $data[$j][2];
$Az += $data[$j][3];
}
$results[$count]['seconds'] = round($count/$scale, $round);
$results[$count]['Ax'] = round(($Ax/($interval * $value2))/$g, $round);
$results[$count]['Ay'] = round(($Ay/($interval * $value2))/$g, $round);
$results[$count]['Az'] = round(($Az/($interval * $value2))/$g, $round);
$count++;
}
array_pop($results); //We do this because the last interval
//will not have enought data to be calculated.
//Set the final condition with the data from the end of the last complete interval.
$results[$count - 1]['seconds'] = round(($count - 1)/$scale, $round);
$results[$count - 1]['Ax'] = round(($data[$i - $interval][1])/$g, $round);
$results[$count - 1]['Ay'] = round(($data[$i - $interval][2])/$g, $round);
$results[$count - 1]['Az'] = round(($data[$i - $interval][3])/$g, $round);
return $results;
}
Для использования:
$data = array_map('str_getcsv', file($path));
$split = 5; //(int) - # of milliseconds inbetween datapoints.
$scale = 4; // (int) # of data points per second you want to display.
$overlap = TRUE; //(Bool) - Overlap data from one interval to the next.
$results = formatAccelData($data, $split, $scale, $overlap);
print_r($results);
СТАРЫЕ ОБНОВЛЕННЫЕ РЕШЕНИЯ
Помните, что эта функция принимает среднее значение, приводящее к интервалу.Так что это действительно половина интервала позади.
function formatAccelData($data, $step){
$fps = 1000/$step;
$second = 1;
$frame = 0;
$count = 0;
for($i = 0; $i < count($data); $i += $fps){
$Ax = $Ay = $Az = 0;
for($j = 0; $j < $fps; $j++){
$Ax += $data[$frame][1];
$Ay += $data[$frame][2];
$Az += $data[$frame][3];
$frame++;
}
$results[$count]['seconds'] = $second;
$results[$count]['Ax'] = ($Ax/$fps) * 0.101971621297793;
$results[$count]['Ay'] = ($Ay/$fps) * 0.101971621297793;
$results[$count]['Az'] = ($Az/$fps) * 0.101971621297793;
$second++;
$count++;
}
return $results;
}
Как использовать:
$data = array_map('str_getcsv', file($path));
$step = 5; //milliseconds
$results = formatAccelData($data, $step);
print_r($results);