用USB 1024HLS测量MATLAB中方波的频率

时间:2009-07-18 00:34:16

标签: matlab

我正在尝试通过MATLAB测量通过USB 1024 HLS Daq模块读取的方波频率。我所做的是创建一个循环,从数字输入读取100个值,并给出0和1的向量。此循环中还有一个计时器,用于测量循环运行的持续时间。

获取向量后,我计算1的数量,然后使用frequency = num_transitions / time来给出频率。然而,这似乎不能很好地工作:(我不断为循环的不同迭代次数获得不同的频率。任何建议?

6 个答案:

答案 0 :(得分:2)

我建议您尝试以下代码:

vec = ...(the 100-element vector of digital values)...
dur = ...(the time required to collect the above vector)...
edges = find(diff(vec));  % Finds the indices of transitions between 0 and 1
period = 2*mean(diff(edges));  % Finds the mean period, in number of samples
frequency = 100/(dur*period);

首先,代码找到从0到1或1到0的转换的索引。接下来,计算并平均这些索引之间的差异,给出零的长度和平均持续时间(样本数)那些。将该数乘以2得到方波的平均周期(样本数)。然后将该数字乘以dur/100以得到dur的任何时间单位的周期(即秒,毫秒等)。取倒数然后给出平均频率。

另外需要注意的一点是:为了更好地估算频率,您可能需要确保收集的100个样本至少包含几个重复的周期。

上面使用的兴趣功能:DIFFFINDMEAN

答案 1 :(得分:1)

首先,您必须确保您的100个样本至少包含一个完整的信号周期,否则您将得到错误的结果。您需要对采样率进行良好的折衷(即,每个周期的样本越多,测量结果越好)和样本数量。

准确地说,你应该有一个与每次测量相关联的时间戳(因为你通常不能确定你在for循环中得到等距的时间间隔),或者也许可以将你的USB模块切换成一些“运行“模式,不仅一次获得一个样本,而且获得固定采样率的完整波形。

关于频率的计算,gnovice已经指出了正确的方法。如果您有单独的时间戳(以秒为单位),则需要进行以下更改:

tst = ...(the timestamps associated with every sample)...
period = 2*mean(diff(tst(edges)));
frequency = 1/period;

答案 2 :(得分:0)

我无法弄清楚问题,但如果布尔向量是 v 那么,

frequency = sum(v)/time_to_give_me_the_frequency

答案 3 :(得分:0)

根据您的描述,它听起来不像是软件的问题,除非您使用Windows系统计时器,这是众所周知的不准确(它只精确到15毫秒)。

Windows中有高分辨率计时器,但我不知道如何在Matlab中使用它们。如果您可以访问.NET框架,则Stopwatch class的准确度(或更高)为1微秒,Win32中的QueryPerformanceCounter API也是如此。

除此之外,您可能会有一些抖动。您的信号链中可能存在导致错误触发等的事情。

更新:以下CodeProject文章应解决时间问题(如果有)。您应该查看您的Matlab版本的Matlab文档,看看它是否具有本机高分辨率计时器。否则,你可以使用:

C ++ / Mex包装器在WinXP下为Matlab添加微秒分辨率计时器 http://www.codeproject.com/KB/cpp/Matlab_Microsecond_Timer.aspx

答案 4 :(得分:0)

mersenne31:

感谢大家的回复。我已经尝试了gnovice和groovingandi提到的解决方案,我相信一旦解决了时间问题,它们就能正常工作。

我使用的代码如下所示:

表示i = 1:100 tic; value = getvalue(portCH); vector(i)= value(1); tst(i)= toc; %获得个人时间样本结束

%得到我在for循环后放置total_time = toc的总时间

totaltime = sum(tst); edges = find(diff(vec)); %找到0到1周期之间的转换索引= 2 * mean(diff(edges)); %查找平均周期,采样频率= 100 /(总时间*周期);

问题是测量一个样品的时间并没有多大帮助,因为它对所有样品几乎都是一样的。正如groovingandi所提到的,所需要的是一些“运行”模式,它可以读取100个样本3秒钟。

类似于(3秒),然后我们进行数据捕获。但我找不到这样的东西。 MATLAB中是否有任何功能可以做到这一点?

答案 5 :(得分:0)

这不会回答你的问题,但这是我在读完你的问题后想到的。方波具有无限频率。方波的FFT是sin(x)/ x,它从-inf到+ inf。

还尝试仅计算matlab中的上升沿。您可以将信号量化为仅+1和0,然后仅在看到矢量的[0 1]切片时递增计数。

OR

你可以量化,抽取,然后只是总和。这仅在每个方波脉冲长度相同且采样频率恒定时才有效。我认为这个更难做到。