N.T. Posted September 7, 2021 Report Share Posted September 7, 2021 I have a test rig capturing different values from sensors (momentum, position etc). Unfortunately those devices are USB, non-realtime and don't give a timestamp. I record the values within parallel loops and also storing the current time stamp value using the timer with high accuracy. Access times to the usb devices differ so I don't have a common timebase for the measurement. I eventually have a couple of arrays containing the values and timestamps. Now I try to bring them all to a common time base. I look up the first and the last timestamp, use the ramp pattern vi to create a fixed time interval and use the sum of the number of all arrays to not loose values inbetween. Unfortunately, the Interpolate 1D array vi is not capable of shifting the start time to bring the specific array within the start/end Range. As a very simplified example: Array A Timestamp 1 2 3 4 5 6 7 Value 10 30 50 70 90 110 130 Array B Timestamp 1.5 2.5 3.5 4.5 5.5 6.5 7.5 Value 20 40 60 80 100 120 140 Data after merging Timestamp 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 Value A 10 20 30 40 50 60 70 80 90 100 110 120 130 --- Value B --- 20 30 40 50 60 70 80 90 100 110 120 130 140 Have you any idea how to solve this? Quote Link to comment
Lipko Posted September 7, 2021 Report Share Posted September 7, 2021 How about usig Threshold 1D array instead? Timestamp-by-timestamp linear interpolation. Quote Link to comment
Lipko Posted September 7, 2021 Report Share Posted September 7, 2021 (edited) Forget my previous reply, I was in a rush. The loop where you use the interpolation is wrong, because of different array lengths. Y and X should be of same size for Interpolate 1D.vi. The time channels for each device should be fed to the Interpolate 1D.vi, not the concatenated time channel. You shouldn't build a 2D array from your raw signals anyway (what happens if your different devices are not in sync and array lengths differ?), you should compose it as an array of clusters, and each cluster should be of the time array and the signal array. It will be easier to work with that and easier to put them on graph. I can't comment on your common time channel generator code, I guess you tested it and is okay. Since the time is "commonized" and everything will have the same length, the interpolated signals can be put in a 2D array. Edited September 7, 2021 by Lipko Quote Link to comment
N.T. Posted September 7, 2021 Author Report Share Posted September 7, 2021 Thank you for your help. Unfortunately the lenght is not normalized. But that's, what Interpolate 1d does. It's quite a mess, but it's working. A real pain is the behavior of the interpolate 1d vi, as it is using the given points as center for it's interpolation. You cannot specify the given point to be the beginning. Direction and Servo Load are binary values (as doubles) that have only 11 members, whereas the other arrays have around 2000-6000 members. The interpolation doesn't help that much. But that's another matter. Quote Link to comment
Lipko Posted September 7, 2021 Report Share Posted September 7, 2021 I honestly don't understand how it can work at all, I didn't test your code (for some reason drag-dropping the snippet doesn't work for me). Your signal arrays doesn't match: Y is the original signal while X is the common concatenated and sorted time, so it can even be 0,0,0,0,1,1,1,1,2,2,2,2 and so on. And you fed this to the interpolator, no wonder it might behave strangely depending on the test data. But even if it doesn't look strange, your code will produce wrong results. Did you try my code? It's not a big change to implement. Quote Link to comment
N.T. Posted September 10, 2021 Author Report Share Posted September 10, 2021 It took me a while to figure out, what's from. Sure it doesn't look beautiful and there's enough room for improvement, but the code does exactly, what it should. Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.