tnoble8888 Posted November 18, 2010 Share Posted November 18, 2010 Hi, was wondering if you could suggest a method to convert rhythmic Analog data pulses (the voltage range is not valid logic levels) and extract an average BPM (beats per min). I was thinking along the lines of a 20X/sec sample for maybe 3 seconds and then add all the times the value is >X, then multiply by 15... what would be the best and efficient way to continuously do this and have the result (BPM) as a variable I can use for other sequence processes? Thanks in advance :^) Link to comment Share on other sites More sharing options...
AzeoTech Posted November 21, 2010 Share Posted November 21, 2010 Your method would only work if each beat was a peak with a single point, otherwise you have to find a trough between each beat. Anyhow, the method depends on whether you need to do this in real time, or you are going to take some data and then can run some code to analyze the data. If the second, then you could actually search for the troughs. It'd be something like this: private count = 0 private index = 0 while(index != -1) // find a peak index = search(signal > hiThresh, index+1) if (index == -1) break endif // add to count count++ // find a trough index = search(signal < loThresh, index+1) endwhile This code would actually execute quite quickly, but not fast enough, say, for use in a conversion. Link to comment Share on other sites More sharing options...
tnoble8888 Posted November 21, 2010 Author Share Posted November 21, 2010 Thank you for the feedback, I do need near real-time information and to be right, I would likely need to determine that the most common beat is say X samples duration of across the sample period. Sometimes is a 2 sample duration beat or 4 samples per beat. So, to count the number of most common sample duration groups would be required... I think. Finding a trough between each beat group is going to help, but how to do it quickly? I see only 2 usable signal levels in the analog data, and then the duration, so it ends up being just 1 and 0 in the end. Is doing a >X test slower or faster than find a peak(as in your example)? How to capture, group and compare the pulse duration sets is what I am lost on. Link to comment Share on other sites More sharing options...
AzeoTech Posted November 21, 2010 Share Posted November 21, 2010 > X is faster, but you are still going to have to count out groups, and that requires search. The code is identical, except that you can store signal > x in a private variable outside the loop and then just do search(y, index+1) and search(!y, index+1) where y = signal > x. You can determine the samples across the peak by using simple math once you find the through. You'll need another variable is all, setting the first index to that variable, and then you can subtract the second index from it. So you get something like this: private count = 0 private peaklengths private index = 0 private y = signal > x private lastpeak while(index != -1) // find a peak index = search(y, index+1) if (index == -1) break endif // add to count count++ lastpeak = index // find next trough index = search(!y, index+1) peaklengths[count-1] = index - lastpeak endwhile On a newer computer, this code probably wouldn't take more than 50ms to run. How long it takes is largely dependent on the number of iterations, therefore, the number of peaks it is finding. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.