Мне нужно выполнить алгоритм динамического переноса времени (DTW) с некоторыми ранее сохраненными данными и данными акселерометра. Но я не могу обрабатывать огромное количество данных, поступающих с акселерометра. Мне нужно определить шаг. Для этого я предварительно сохранил ряд данных и пытаюсь сопоставить их с текущими данными.

ArrayList<Double> test=new ArrayList<Double>();

public void onSensorChanged(SensorEvent event) {
   double x=event.value[0];
   double y=event.value[1];
   double z=event.value[2];

   double a=Math.sqrt(x*x+y*y+z*z);
   test.add(a);
   new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);

private class ProgressRunner extends AsyncTask<Double, Integer, Boolean>
{
   @Override
    protected Boolean doInBackground(Double... params) {
       new Thread(new Runnable() {
            @Override
            public void run() {

        double r=DTWDistance(StepSamples.sample1, standTest);
        if(r<700) /* "Step Detected */
            }
        }).start();
        return null;
    }

Но я получаю огромные данные от датчика. Мой вопрос в том, как мне обрабатывать эти данные и постоянно сопоставлять их с образцами данных. Также я тестировал с помощью Log.d, я уверен, что проблема связана с тем, как я обрабатываю эти Live-данные, но я не могу найти выхода. Любое предложение будет полезно.
Я также пробовал это, делая это с интервалом в 2 секунды, но OutOfMemeoryBoundsException выбрасывает

if((System.currentTimeMillis()-sTime)/1000>2){
        new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);
    }
0
Somnath Kayal 20 Фев 2015 в 15:48

2 ответа

Лучший ответ

Одним из решений этой проблемы является сохранение порогового значения для изменения значений датчика. Если изменение в deltaX, deltaY, deltaZ больше, то вы можете запустить AsyncTask, иначе не делайте этого.

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

ИЗМЕНИТЬ 1:

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

Ссылка на руководство

0
Gowtham Raj 20 Фев 2015 в 13:22

Вам нужно обрабатывать каждое отдельное значение или вы обрабатываете каждые x (например, 0,1) секунды? Я вызываю метод, который проверяет «сейчас - lastProcessedTime». Если это значение> 100 мс, я обработаю данные и обновлю lastProcessedTime = now. Если нет - выкину значение датчика.

0
ori-k 20 Фев 2015 в 22:39