1

我正在尝试控制安卓手机的振动频率。

我了解 android API 提供了一个接口来通过 ON/OFF 模式控制振动:

公共无效振动(long []模式,int重复)

以给定的模式振动。

传入一个整数数组,它们是打开或关闭振动器的持续时间(以毫秒为单位)。第一个值表示打开振动器之前要等待的毫秒数。下一个值表示在关闭振动器之前保持振动器开启的毫秒数。随后的值在持续时间(以毫秒为单位)之间交替,以关闭振动器或打开振动器。

要使模式重复,请将索引传递到开始重复的模式数组中,或 -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 附近总是有很大的功率。

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

4

1 回答 1

1

该文件明确指出:

一个参数应该是一个长变量数组,按以下方式解释,index[0] 上的值((以及索引上的数组的每个值(index%2==0)))充当缓冲区(应该经过多少时间在每个后续振动之间),以及它所在的阵列的任何索引上的值(index%2!=0)作为振动过程的持续时间(振动器应该继续运行多少毫秒)。

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

让我们开始你的实现:创建一个长度为 300 的 long 值数组,用 1 和 49 填充它,然后调用。

如果您希望振动过程像这样:每次振动之间有 1 毫秒,并且振动持续 49 毫秒(整个过程总计 50 毫秒),那么您是对的。

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

于 2015-06-28T15:13:31.330 回答