以恒定速率循环,具有高精度的信号采样

时间:2014-11-06 07:44:40

标签: python sampling

我试图在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中以特定频率运行采样函数吗?

1 个答案:

答案 0 :(得分:4)

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

我建议使用带有time.sleep()的循环(请参阅对https://stackoverflow.com/a/14813874/648265的评论)并计算从下一个参考时刻开始睡觉的时间,以免出现不可避免的错误没有加起来:

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

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