Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自二进制输入的频率_Java_Android - Fatal编程技术网

Java 来自二进制输入的频率

Java 来自二进制输入的频率,java,android,Java,Android,背景:我有一个IOIO,我用它来测量光电二极管的输出,这是转换成数字输出。我需要找到信号在1和0之间变化的频率。到目前为止,我尝试的一切都挂断了我的测试应用程序,有什么建议吗 当前代码: if(diode == 1 && frequencyFound == false){ startTime = System.currentTimeMillis(); while((frequencyFound == false)){ if(diode == 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);
  }
}

这里有几个问题

首先,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);
//找到最接近的hz(+/-10%)的频率
//假设其他过程负责更新“二极管”
//变数。“二极管”必须声明为易失性。
长持续时间=1000;//1秒
最终整数间隔=100;//采样间隔=.1秒
int oldState=二极管;
整数计数=0;
最终长启动时间=System.currentTimeMillis();
最终长结束时间=开始时间+持续时间;
while(System.currentTimeMillis()
对于爱德华提出的一些计时准确性问题,还有两个极端的建议:

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

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


您不需要做些什么来实际采样
二极管的值吗
?是否在UI线程中执行上述代码(=没有创建
AsyncTask
或其他类型的
线程来执行该代码)?这就解释了你的应用程序挂起的原因。我必须在这里给克里斯·斯特拉顿投一票。他是对的;如果IOIO板是可编程的,那么你应该在那里进行频率测量。