2014-12-17 5 views
2

기기가있는 표면의 노크 패턴을 감지하려고합니다. 사용자가 표면에 한 번 노크 경우Android 가속도계로 진동 감지

예를 들어, 사용자가 두 번 노크 경우 실행 방법 A., 나는 이것이 논리에서 제외 일어날 수 있도록 할 필요가 내가 모든 것을 가지고 방법 B.에게

을 실행 onSensorChanged 방법. 이 내 코드는 바로 지금입니다 :

@Override 
public void onSensorChanged(SensorEvent event) { 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 

    //Check time interval, not sure if this is correct though. 
    long actualTime = System.currentTimeMillis(); 
    if ((actualTime - lastUpdate) > 100) { 
     long diffTime = (actualTime - lastUpdate); 
     lastUpdate = actualTime; 

     //This is where the magic should happen 
    } 
} 

내가 주요 문제는 생각, 내가 진동을 감지 어떻게? 그물에있는 거의 모든 다른 예들은 흔들림과 움직임을 감지하는 방법에 관한 것입니다.

답변

3

진짜 대답 - 좋은 결과를 얻으려면 DSP를 연구해야합니다. 이것은 사소한 문제는 아닙니다.

간략한 개요 - 진동이 발생하면 정현파 감쇠 웨이브 패턴 (주 진동을 "링잉"이라고 부른 후 감쇠 신호가 표시됨)은 우리에게 나쁜 것입니다. 즉, 우리는 실제 결과에서 울림). 이것은 감지 될 수 있고 진동은 진폭 벡터의 급격한 변화 (현재 중력에 중력을 가짐)에 기반하여 신호를받습니다. 파동의 피크의 상대 높이는 노크의 상대적 강도이어야합니다.

그래서 한 노크를 탐지하는 것은 매우 쉽습니다. 쉬운 일이 아닌 것 :

* 방을 가로 지르는 노크와 발자국의 차이를 말하면 진동이 발생합니다. 그들은 똑같이 보일거야. 주파수 분석 및 필터를 통해 필터링 할 수 있습니다.

* 두 번의 노크 대 짧은 노크 한 번의 노크 말하기. 두 번째 노크는 약한 경향이 있으며 첫 번째 노크의 울림을 구분하기가 어려울 것입니다. 또한 첫 번째 물결과 소멸 간섭을 일으킬 수 있습니다.

* 노크가 발생했을 때 정확히 알려줍니다. 일정하지 않을 수있는 시간 지연이있을 수 있으며 정확한 피크를 찾으려고한다는 것을 의미합니다. 소음과 관련이 없습니다.

* 잡음이있는 환경에서 노크를 말합니다 (잡음이 심하거나 소리가 나지 않음). 다시 필터링이 필요합니다.

나는 실제로 이것을 다소 해왔다. 그리고 대부분은 실패했다고 생각합니다. 우리는 노크를 잘 감지 할 수 있었지만 전혀 노이즈를 걸러 낼 수는 없었습니다. 물론 우리는 매우 작은 (손가락 1 개) 노크를 찾고 있었지만 날카로운 랩을 찾고 있다면 노이즈 레벨에 비해 스파이크가 더 커지기 때문에 문제가 줄어들 것입니다. 한 번의 날카로운 노크가 예상되는 경우 큰 스파이크를 찾는 기본 사항과 N 밀리 초 동안 2 차 스파이크를 무시하면 충분할 수 있습니다. 그렇지 않다면 이것에 많은 시간을 할애 할 것입니다.

+0

매우 유익한 답변을 보내 주셔서 감사합니다. 당신의 대답을 읽은 후에 저는 문제와 해결책에 대해 더 잘 이해하게되었습니다. 내가 생각하지 못했던 많은 문제가 있습니다. 이것은 실험을 좀 거칠 것입니다. 나는 이것을 할 수있는 쉬운 방법이 있기를 희망했다. – Feodalherren

+0

그러면 코드에서 한 번의 노크를 어떻게 감지합니까? – powder366