我正在尝试测量一个方波的频率,这个方波是通过一个USB1024HLS Daq模块通过MATLAB读取的。我所做的是创建一个循环,它从数字输入读取100个值,并给出0和1的向量。在这个循环中还有一个计时器,它测量循环运行的持续时间。
在得到向量之后,我计算1的数量,然后使用frequency = num_transitions/time给出频率。然而,这似乎不能很好地工作:(对于循环的不同迭代次数,我不断获得不同的频率。有什么建议吗?
发布于 2009-07-18 03:07:46
我建议您尝试以下代码:
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的转换的索引。接下来,计算并平均这些指数之间的差异,给出0和1长度的平均持续时间(以样本数表示)。将这个数字乘以2,就得到了方波的平均周期(以样本数表示)。然后将这个数字与dur/100相乘,得到以dur的时间单位表示的周期(即秒、毫秒等)。取倒数然后给出平均频率。
一个额外的警告:为了更好地估计频率,您可能必须确保您收集的100个样本至少包含几个重复的周期。
上面使用的感兴趣的函数:DIFF、FIND、MEAN
发布于 2009-07-22 08:26:37
首先,你必须确保你的100个样本至少包含一个完整的信号周期,否则你会得到错误的结果。您需要很好地折衷采样率(即每个周期拥有的样本越多,测量效果就越好)和样本数量。
准确地说,你应该有一个与每个测量相关联的时间戳(因为你通常不能确保你在for循环中获得等距离的时间间隔),或者也许你可以将你的USB模块切换到某种“运行”模式,这种模式不只是一次只获得一个样本,而是一个具有固定采样率的完整波形。
关于频率的计算,新手已经指出了正确的方法。如果您有单独的时间戳(以秒为单位),则需要进行以下更改:
tst = ...(the timestamps associated with every sample)...
period = 2*mean(diff(tst(edges)));
frequency = 1/period;发布于 2009-07-18 00:36:51
我不知道问题是什么,但是如果布尔向量是v,
frequency = sum(v)/time_to_give_me_the_frequencyhttps://stackoverflow.com/questions/1146291
复制相似问题