首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自二进制输入的频率

来自二进制输入的频率
EN

Stack Overflow用户
提问于 2012-05-12 23:46:04
回答 2查看 152关注 0票数 0

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

当前代码:

代码语言:javascript
复制
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);
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-13 01:03:22

这里有几个问题。

首先,Android是一个多任务系统,你可能会发现你的计时线程处于睡眠状态的时间足够长,以至于错过了一些信号转换。除了在循环中对输入进行采样之外,还有没有办法通知前沿(或尾部)边缘转换?

你看到的是哪种频率?100ms的采样间隔就足够了吗?

不要指望Thread.sleep()完全按照您指定的时间休眠。如果间隔太短,系统可能会决定立即返回,或者将睡眠时间向上舍入到更大的值。

您的计时循环不会将时间记录到优于100ms的任何精度(充其量),因此您对频率的估计将非常差。

Zapl是对的,你必须从一个独立于你的UI线程的线程中运行它。

观察一个单一的转换将给你一个非常不精确的频率估计。试试下面这样的代码:

代码语言:javascript
复制
// 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);
票数 1
EN

Stack Overflow用户

发布于 2012-05-13 02:10:09

对于Edward提出的一些计时精度问题,有两个更极端的建议:

  • 在中断情况下在IOIO板上测量间隔时间,您可以在其中完成(至少接近)实时操作。将这些时间测量值报告给安卓设备。
  • 跳过IOIO板,构建一个简单的工具来将信号路由到耳机接口,作为打开或关闭的铃声。使用音频系统的内置定时保证录制音频,然后分析音频缓冲区(不再需要实时),以音频采样率(与android应用程序中的任何操作相比,相对可靠)为单位,根据插入的音频采样次数确定间隔。您还可以通过使用光传感器来改变音频振荡器的频率,从而轻松获得模拟输入。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10565144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档