Posso usare FFT per interpretare i gesti dell'accelerometro?


10

Ho la necessità di rilevare due diversi gesti che si verificano guardando i dati dell'accelerometro. Ecco un riassunto (il più breve possibile):

Diciamo che un iPhone viene oscillato avanti e indietro rimanendo a faccia in su. L'utente può eseguire un'oscillazione (una volta in avanti o all'indietro, gesticolarne una) o un'oscillazione continua per qualsiasi periodo di tempo (gesto due).

Attualmente il mio codice mantiene un elenco dei dati dell'accelerometro del dispositivo (asse y) degli ultimi 50 frame. Ogni frame di questi dati viene messo attraverso un algoritmo FFT (questo http://goo.gl/yi3mn ), e quindi provo a interpretare il dominio di frequenza fornito. Ho notato una forte relazione tra la velocità delle oscillazioni e la potenza della gamma medio-bassa dello spazio di frequenza.

Il problema è che ho bisogno di rilevare (in tempo reale mentre il movimento anima qualcosa sullo schermo) se l'oscillazione appena finita è singolare, o quella che continua in un'altra oscillazione nella direzione opposta. Qui dovrei sottolineare che gli accelerometri funzionano con le piastre di pressione. Quando un'oscillazione si arresta, i dati di input mostreranno il valore opposto rispetto a quando l'oscillazione veniva eseguita. Ciò rende difficile vedere l'evidente differenza tra un singolo movimento in avanti e un doppio in avanti, quindi movimento all'indietro (alla fine di ogni prima oscillazione).

Qualcuno può suggerire come potrei fare uso di un FFT per decifrare un valore di magnitudine preciso (o qualcos'altro utile) che posso usare per dire la differenza tra i gesti sopra descritti?

Ho registrato i dati che sto usando su file di testo. Sono i dati grezzi (valori della forza g) lungo l'asse y dell'ingresso dell'accelerometro.

http://pastebin.ca/2108123 mostra i dati per 2 oscillazioni singolari (tengo fermo il dispositivo all'inizio, alla fine e tra le due oscillazioni).

inserisci qui la descrizione dell'immagine

NOTA: sono stati caricati nuovi dati non elaborati con 20 oscillazioni, ma non ancora tracciati. http://pastebin.ca/2108387 mostra i dati per 20 oscillazioni continue (tengo fermo il dispositivo all'inizio e alla fine).

inserisci qui la descrizione dell'immagine


Non avendo visto i dati da solo, la mia prima impressione è che questa non sembra essere una buona applicazione per una FFT. Hai dei dati acquisiti che potresti pubblicare, in formato non elaborato o come trama?
Jason R,

Ciao, grazie per il feedback. Sarebbe accettabile solo un file che mostri cronologicamente ogni valore, con un delimitatore ','? Ricevo circa 60 valori al secondo. Sospetto che anche questa potrebbe non essere una buona applicazione. Forse potremmo risolverlo con alcuni dei dati però.
Rykardo,

2
Se pubblichi i dati grezzi, è probabile che qualcuno possa trasformarli in un diagramma e modificarli con esso.
Jason R,

Ok fantastico. Caricherà alcuni a breve.
Rykardo,

Ci è voluto molto più tempo di quanto mi aspettassi. Sto eseguendo il progetto con Unity, che può ricevere i dati di input dal dispositivo solo a 60 frame / secondo. Ciò significa che non posso avere una frequenza di campionamento elevata, ma comunque. È questo che intendevi con il tuo suggerimento?
Rykardo,

Risposte:


2

Guardando i dati non riesco a capire perché vorresti usare FFT per questo scopo (potrei sbagliarmi però). Diciamo che vuoi rilevare movimenti singoli o multipli in base a questo set di dati (che hai allegato), i metodi che vorrei esaminare sarebbero

  1. Qualcosa sulle linee del tasso di variazione dei valori assoluti. Il primo derivato farebbe bene immagino.
  2. Forse la trasformazione wavelet? Non posso approfondire la sua utilità finché non so se vuoi sapere la posizione delle vette o meno.

Se l'unica cosa che si desidera rilevare è oscillazione singola o multipla, la FFT non è, a mio avviso, un'ottima scelta per l'analisi.


Grazie per il feedback! Un amico ha suggerito che FFT potrebbe essere la strada da percorrere, prima che non ne avessi mai usato uno prima. Quello che devo rilevare è se una nuova oscillazione inizia o meno alla fine di ogni oscillazione. Le trame sopra dovrebbero esporre perché è difficile. Ho pensato di poter usare un algoritmo di grandezza, ma questo è complicato perché la potenza / velocità delle oscillazioni sarà diversa per utente.
Rykardo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.