0

背景:我有一个 IOIO,我用它来测量光电二极管的输出,这是转换成数字输出的。我需要找到信号在 1 和 0 之间变化的频率。到目前为止我所尝试的一切都挂起我的测试应用程序,有什么建议吗?

当前代码:

if(diode == 1 && frequencyFound == false){
  startTime = System.currentTimeMillis();
  while((frequencyFound == false)){
     if(diode == 0){
        while(frequencyFound == false){
            if(diode == 1){
                double endTime = System.currentTimeMillis();
                time = endTime - startTime;
                frequency = (long) (1.0 / time);
                frequencyFound = true;
            }
            Thread.sleep(100);
        }
     }
     Thread.sleep(100);
  }
}
4

2 回答 2

1

这里有几个问题。

首先,Android 是一个多任务系统,您可能会发现您的计时线程休眠的时间足够长,以至于错过了一些信号转换。有没有办法通知前沿(或后沿)转换,而不是在循环中对输入进行采样?

你在看什么样的频率?100 毫秒的采样间隔是否足够好?

不要指望 Thread.sleep() 在您指定的时间内准确睡眠。如果间隔太短,系统可能会决定立即返回,或者可能会将睡眠时间四舍五入到更大的量。

您的计时循环不会以任何优于 100 毫秒的精度(最多)记录时间,因此您对频率的估计将非常差。

Zapl 是对的,您必须从与您的 UI 线程不同的线程运行它。

观察一个单一的转变会给你一个非常不精确的频率估计。尝试这样的事情:

// Find frequency to the nearest hz (+/- 10%)
// It's assumed that some other process is responsible for updating the "diode"
// variable.  "diode" must be declared volatile.
long duration = 1000;   // 1 second
final int interval = 100;    // sampling inteval = .1 second
int oldState = diode;
int count = 0;
final long startTime = System.currentTimeMillis();
final long endtime = startTime + duration;
while (System.currentTimeMillis() < endtime) {
  // count all transitions, both leading and trailing
  if (diode != oldState) {
    ++count;
    oldState = diode;
  }
  Thread.sleep(interval);
}
// find the actual duration
duration = System.currentTimeMillis() - startTime;
// Compute frequency. The 0.5 term is because we were counting both leading and
// trailing edges.
float frequency = 0.5 * count / (duration/1000);
于 2012-05-12T17:03:22.090 回答
1

关于解决 Edward 提出的一些计时精度问题,还有两个极端的建议:

  • 在中断下测量 IOIO 板上的间隔时间,您大概可以完成(至少接近)实时操作。将这些时间测量值报告给 Android 设备。

  • 跳过ioio板并构建一些简单的东西来将信号路由到耳机连接器作为打开或关闭的音调。使用音频系统的内置时序保证录制音频,然后分析音频缓冲区(不再需要实时)以确定干预音频样本次数的间隔(与您的任何东西相比相对可靠)可以在 android 应用程序中执行)音频采样率。您还可以通过使用光传感器改变音频振荡器的频率轻松获得模拟输入。

于 2012-05-12T18:10:08.920 回答