我试图控制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附近总有很大的功率。
我想知道它为什么不起作用?
答案 0 :(得分:1)
文件明确指出:
第一个参数应该是一个长变量数组,它按以下方式解释,索引[0]上的值((以及索引上的数组的每个值{ {1}})充当缓冲区(每次后续振动之间应经过多长时间),并且数组的任何索引上的值(index%2==0))
充当振动过程的持续时间(如何振动器应该持续几毫秒。
第二一个非常不言自明,您似乎也不需要它。 (传递-1只会循环遍历你的数组而不重复)
让我们继续你的实施: 你创建一个长度为300的长值数组, 你用它填充它和四十九 然后你调用。
如果您希望振动过程如下:每次振动与振动之间的1毫秒持续49毫秒(整个过程为50毫秒)您是对的。
但请记住,这种精确度很难实现,任何错误的计算都将开始“积累”#34;因此错误计算频率的一小部分。