Czy mogę używać FFT do interpretowania gestów akcelerometru?

10

Mam potrzebę wykrycia dwóch różnych gestów, które występują podczas przeglądania danych akcelerometru. Oto podsumowanie (tak krótkie, jak mogę to zrobić):

Powiedzmy, że iPhone jest oscylowany tam iz powrotem, pozostając odkrytym. Użytkownik może wykonać jedną oscylację (raz do przodu lub do tyłu, gest jeden) lub ciągłą oscylację przez dowolny czas (gest drugi).

Obecnie mój kod przechowuje listę danych akcelerometru urządzenia (oś y) z ostatnich 50 klatek. W każdej ramce dane te przechodzą przez algorytm FFT (ten http://goo.gl/yi3mn ), a następnie próbuję zinterpretować podaną domenę częstotliwości. Zauważyłem silny związek między prędkością oscylacji a mocą średniego do niskiego zakresu przestrzeni częstotliwości.

Problem polega na tym, że muszę wykryć (w czasie rzeczywistym, gdy ruch animuje coś na ekranie), czy właśnie zakończona oscylacja jest pojedyncza, czy też przechodzi w inną oscylację w przeciwnym kierunku. W tym miejscu należy podkreślić, że akcelerometry działają z płytami dociskowymi. Kiedy oscylacja ustaje, dane wejściowe pokażą wartość przeciwną do tej, kiedy oscylacja była wykonywana. Utrudnia to dostrzeżenie oczywistej różnicy między pojedynczym ruchem do przodu a podwójnym ruchem do przodu i do tyłu (na końcu każdej pierwszej oscylacji).

Czy ktoś może zasugerować, w jaki sposób mógłbym skorzystać z FFT do rozszyfrowania dokładnej wartości wielkości (lub czegoś innego użytecznego), którego mogę użyć, aby odróżnić gesty opisane powyżej?

Zapisałem dane, których używam do plików tekstowych. Są to nieprzetworzone dane (wartości siły g) wzdłuż osi y wejścia akcelerometru.

http://pastebin.ca/2108123 pokazuje dane dla 2 pojedynczych oscylacji (trzymam urządzenie wciąż na początku, na końcu i pomiędzy dwiema oscylacjami).

wprowadź opis zdjęcia tutaj

UWAGA: nowe nieprzetworzone dane z 20 oscylacjami zostały przesłane, ale nie zostały jeszcze wydrukowane. http://pastebin.ca/2108387 pokazuje dane dla 20 ciągłych oscylacji (trzymam urządzenie wciąż na początku i na końcu).

wprowadź opis zdjęcia tutaj

rykardo
źródło
Nie widząc danych osobiście, moje pierwsze wrażenie jest takie, że nie jest to dobra aplikacja dla FFT. Czy masz jakieś przechwycone dane, które możesz opublikować w formacie raw lub jako wykres?
Jason R
Cześć, dzięki za opinie. Czy tylko plik pokazujący każdą wartość chronologicznie byłby dopuszczalny, z separatorem „,”? Dostaję około 60 wartości na sekundę. Podejrzewam, że może to nie być dobra aplikacja. Być może uda nam się to przepracować z niektórymi danymi.
rykardo
2
Jeśli opublikujesz nieprzetworzone dane, prawdopodobnie ktoś może je przekształcić w fabułę i edytować za jego pomocą post.
Jason R
Ok świetnie. Niedługo prześlę.
rykardo
Trwało to dłużej niż się spodziewałem. Prowadzę projekt z Unity, który może odbierać dane wejściowe z urządzenia z prędkością 60 klatek / sekundę. Oznacza to, że nie mogę uzyskać wysokiej częstotliwości próbkowania, ale mimo to. Czy to masz na myśli swoją sugestię?
rykardo

Odpowiedzi:

2

Patrząc na dane, nie rozumiem, dlaczego chcesz używać FFT do tego celu (choć mogę się mylić). Powiedzmy, że chcesz wykryć pojedyncze lub wielokrotne ruchy na podstawie tego zestawu danych (do którego załączyłeś), metodami, na które bym patrzył

  1. Coś na linii szybkości zmian wartości bezwzględnych. Pierwsza pochodna byłaby ładna.
  2. Może transformacja falkowa? Nie mogę rozwinąć więcej na temat jego użyteczności, dopóki nie będę wiedział, czy chcesz poznać pozycję szczytów, czy nie.

Jeśli jedyną rzeczą, którą chcesz wykryć, jest oscylacja pojedyncza vs. wielokrotna, FFT nie jest moim zdaniem dobrym wyborem do analizy.

anasimtiaz
źródło
Dzięki za opinie! Przyjaciel zasugerował, że FFT może być właściwą drogą, wcześniej nigdy wcześniej jej nie używałem. Muszę wykryć, czy nowa oscylacja zaczyna się na końcu każdej oscylacji, czy nie. Powyższe wykresy powinny ujawniać, dlaczego jest to trudne. Pomyślałem, że mogę użyć algorytmu wielkości, ale jest to trudne, ponieważ moc / prędkość oscylacji będzie różna dla każdego użytkownika.
rykardo