【问题标题】:Looping at a constant rate with high precision for signal sampling以恒定速率循环以高精度进行信号采样
【发布时间】:2014-11-06 07:44:39
【问题描述】:

我正在尝试在 Python 中以 10Khz 采样信号。尝试运行这段代码(1KHz)没有问题:

import sched, time

i = 0
def f(): # sampling function
    s.enter(0.001, 1, f, ())
    global i
    i += 1
    if i == 1000:
        i = 0
        print "one second"

s = sched.scheduler(time.time, time.sleep)

s.enter(0.001, 1, f, ())
s.run()

当我尝试减少时间时,它开始超过一秒(在我的电脑中,10e-6 时为 1.66 秒)。 是否可以在 Python 中以特定频率运行采样函数?

【问题讨论】:

    标签: python sampling


    【解决方案1】:

    您没有考虑代码的开销。每次迭代,这个错误都会累加并扭曲“时钟”。

    我建议使用带有time.sleep() 的循环来代替(请参阅https://stackoverflow.com/a/14813874/648265 的cmets)并从下一个reference 时刻开始计算睡眠时间,这样就不会添加不可避免的错误上:

    period=0.001
    t=time.time()
    while True:
        t+=period
        <...>
        time.sleep(max(0,t-time.time()))     #max is needed in Windows due to
                                             #sleep's behaviour with negative argument
    

    请注意,操作系统调度不允许您达到超出某个级别的精度,因为其他进程必须不时抢占您的。在这种情况下,您需要为多媒体应用程序使用一些特定于操作系统的工具,或者制定一个不需要这种精度级别的解决方案(例如,使用专门的应用程序对信号进行采样并使用其保存的输出)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多