Androidフォンの振動周波数を制御しようとしています。
Android API は、オン/オフ パターンを介して振動を制御するためのインターフェイスを提供することを理解しています。
public void vibrate (long[] パターン、int リピート)
所定のパターンで振動します。
バイブレーターをオンまたはオフにする期間をミリ秒単位で表す int の配列を渡します。最初の値は、バイブレーターをオンにする前に待機するミリ秒数を示します。次の値は、バイブレーターをオフにする前にオンにしておくミリ秒数を示します。後続の値は、バイブレータをオフにするかバイブレータをオンにするかをミリ秒単位で交互に切り替えます。
パターンを繰り返すには、繰り返しを開始するインデックスをパターン配列に渡すか、-1 を渡して繰り返しを無効にします。
そこで、振動数 N を求めるには、1 秒間に振動子のオンとオフを N 回繰り返せばよいのではないかと考えました。
たとえば、20Hz の 10 秒間の振動を取得するには、次のようにパターンを割り当てます。
Vibrator vib = (Vibrator)this.context.getSystemService(Context.VIBRATOR_SERVICE);
...
long[] arrPattern = new long[20*10];
for (int i =0; i<arrPattern.length; ++i) // each duty circle is 50 ms
{
arrPattern[i] = (i%2==0)?1:49;
}
vib.vibrate(pattern, -1);
この素朴なアイデアに基づいて、振動周波数 N をさまざまな値に設定し、電話に加速度計を取り付けて、振動中の加速度データをキャプチャするといういくつかの実験を行いました。
これらの時間領域の加速度データを DFT を介して周波数領域に変換した後、設定した振動周波数に関係なく、常に 10Hz と 175Hz 付近にかなりのパワーがあることに気付きました。
なぜうまくいかないのだろうと思っていました。