天天看点

采样率、采样点数及缓冲区的确定与理解

       注:本文为自我学习,并记录的过程,主要转发至其他官网,这里说明一下。

        采样率:指每秒钟采集多少次。如采样率5kHz(或S/s),即每秒采样5000次。

        采样点数:即从buffer里读取的数据长度。如500。

        在这里附上相关链接:

(3条消息) 数据采集中的采样率、缓冲区大小以及,每通道采样数之间的关系_菜的不行的IT民工-CSDN博客_待读取采样数和采样率怎么确定缓冲区    

        关于数据采集时缓冲区大小的探讨 - 百度文库 (baidu.com)

        在做数据采集时经常碰到缓冲区大小的问题,很多朋友在遇到此类问题时往往束手无策,即使通过调整参数解决了此问题,但还是很难避免下次不再出现此问题,鉴于网上对该问题的解决方法不够好,因此有必要对此问题探讨一下。

        在探讨之前,先说明一下,由于我没有真实的数据采集卡,因此我用虚拟的NI PCl-6251采集卡来代替真实的数据采集卡,为此,我在MAX中创建了一个仿真设备,如下图:

采样率、采样点数及缓冲区的确定与理解

        紧接着我利用该仿真设备在MAX中创建了一个多通道(双通道〉电压多点连续采样任务,如下图:

采样率、采样点数及缓冲区的确定与理解

         参数配置如下:

采样率、采样点数及缓冲区的确定与理解

         采集模式为连续采样,待读取采样为800,采样率是20K,其余参数均采用默认值。配置好之后点击上面的保存按钮保存该任务。红色框中的三个参数从左至右分别对应于DAQmx定时vi的采样模式、每通道采样、采样率。如下图:

采样率、采样点数及缓冲区的确定与理解

        接下来,我们打开 LabVIEW 创建一个数据采集演示示例程序。其前面板和程序框图分别如下:

采样率、采样点数及缓冲区的确定与理解
采样率、采样点数及缓冲区的确定与理解

         现在我们程序,等待一段时间后程序弹出错误,如下图:

采样率、采样点数及缓冲区的确定与理解

        点击继续关闭对话框,此时的前面板运行结果如下:

采样率、采样点数及缓冲区的确定与理解

         我们注意到程序已经运行了5610毫秒。出现上面错误的原因是数据采集卡采集数据速度要远快于读取数据速度,致使缓冲区已满。那么我们如何避免这种情况呢?

        我们来关注在这个数据采集演示示例中的几个重要的参数,采样率(我们用f,表示八、单次循环执行时间(我们用T表示)、每次循坏读取的采样数(我们用n表示)、缓冲区大小(我们用N表示)。在本次示例中,各个参数的值如下:

f。= 20K Hz(见下图红色部分)

采样率、采样点数及缓冲区的确定与理解

        T = 0.1s 

采样率、采样点数及缓冲区的确定与理解

         在NI- DAQmx帮助文档中有如下说明:

采样率、采样点数及缓冲区的确定与理解

         从说明中我们可以知道当采样率为20KHz时,Nl - DAQmx将把100K作为缓冲区的大小,因此N = 100K

        由于缓冲区是环形的,程序在执行的过程中不断的从缓冲区读取数据,每当读取一部分数据后缓冲区中读取之前的该部分将在读取后变为可写,便于数据采集卡不断的从外部采集数据存储到环形缓冲区中。当缓冲区中的数据被填满即没有可写的部分后将发生溢出从而导致上述错误。我们假设在发生错误之前程序运行之后的任意时刻程序运行时间为 t,那么在这t时间内数据采集卡一共采集的数据点数N1为

采样率、采样点数及缓冲区的确定与理解

         在t时间内DAQmx读取.vi一共读取的数据点数N2为

采样率、采样点数及缓冲区的确定与理解

         要想使环形缓冲区不溢出,就必须满足如下条件:

采样率、采样点数及缓冲区的确定与理解

        由于在实际的程序中,fs、n、T、N都是确定的值,这就意味着N- Ng的结果是关于t的一次函数,令K =fs-n/T, 则当K >0时,随着t的增加,最终会存在一个临界值t0使得K× t0=N, 

        虽然不能阻止缓冲区的溢出,但是我们可以使程序出错时的t足够大。当K = 0时,Ni-N<N永远成立!这是理想的情况,它表示在任意时刻,数据采集卡放进环形缓冲区的数据点数和DAQmx读取.vi从环形缓冲区中读取的数据点数相等,当K < 0时,N1- N>< N也是永远成立!但是这种情况一般不采用。现在我们把前面演示示例程序的参数数值带入上述公式:

采样率、采样点数及缓冲区的确定与理解

         解出时间t = 5.556s = 5556ms这说明程序运行5556毫秒后缓冲区溢出,程序弹出错误,这与我们前面观察到的5610毫秒非常接近。现在我们假设改变参数n和T,并且保证程序在3个小时内不发生上述错误,那么n和T应满足如下关系:

采样率、采样点数及缓冲区的确定与理解

         考虑到n是一个整数,并且T的小数点后三位有效,经过实际的计算,我们发现这个n和T的具体指的确很难选取,比如我们取n = 1000那么T的范围是(0.05,0.050023158),由于T是以秒为单位,转换为毫秒后T就只能取50毫秒,n取其它值时的情况也是如此,那么这样一来就是K=0的情况,即永远不会出现缓冲区溢出的情况。

继续阅读