android:如何通过ON / OFF模式控制振动频率

时间:2015-06-28 14:02:57

标签: android android-vibration

我试图控制Android手机的振动频率。

我理解android API提供了一个通过ON / OFF模式控制振动的界面:

  

public void vibrate(long [] pattern,int repeat)

     

以给定模式振动。

     

传入一组要打开的持续时间的整数   或者在几毫秒内关闭振动器。第一个值表示   打开振动器之前要等待的毫秒数。该   next值表示要保留的毫秒数   振动器打开之前关闭。后续值之间交替   持续时间(以毫秒为单位)关闭振动器或转动振动器   振动器。

     

要使模式重复,请将索引传递给模式数组   在哪个开始重复,或-1以禁止重复。

因此,我认为,要获得振动频率N,也许我可以在一秒内重复打开和关闭振动器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附近总有很大的功率。

我想知道它为什么不起作用?

1 个答案:

答案 0 :(得分:1)

文件明确指出:

第一个参数应该是一个长变量数组,它按以下方式解释,索引[0]上的值((以及索引上的数组的每个值{ {1}})充当缓冲区(每次后续振动之间应经过多长时间),并且数组的任何索引上的值(index%2==0))充当振动过程的持续时间(如何振动器应该持续几毫秒。

第二一个非常不言自明,您似乎也不需要它。 (传递-1只会循环遍历你的数组而不重复)

让我们继续你的实施: 你创建一个长度为300的长值数组, 你用它填充它和四十九 然后你调用。

如果您希望振动过程如下:每次振动与振动之间的1毫秒持续49毫秒(整个过程为50毫秒)您是对的。

但请记住,这种精确度很难实现,任何错误的计算都将开始“积累”#34;因此错误计算频率的一小部分。