live operations on acquired data stream

6 vues (au cours des 30 derniers jours)
LO
LO le 14 Juil 2021
Commenté : dpb le 15 Juil 2021
I am trying to plot and make online calculation on analog data acquired through a national instrument device. I am using the following code. With this code I am able to plot the acquired data live, on two different subplots while writing data on file.
I would like at the same time to perform operations while data acquisition goes on. something simple: are voltage level passing a certain threshold? what's the freq of the signal ? I added a line (now commented) in the logData function... in the example I am trying to calculate the mean of the acquired data chunk plotted in that moment. However if I run the script it gives me a lot of warnings (it calculates the mean though).
If I try to perform slightly more complex operations I get no outputs and a lot of warnings about errors... I guess it could simply be that acquisition is too fast to perform any of these operations... would it be possible to buffer the data somehow to allow this to happen? I am not even sure if that's the problem, perhaps it is a matter of adding more listeners/callbacks/functions ? I tried to test these ideas but I had no success... I would be glad to get any feedback ! Thanks
% create session
% daq.reset
d = daq.getDevices;
s = daq.createSession('ni');
s.Rate = 20000; % sample rate
Fs = s.Rate;
s.DurationInSeconds = 10;
% add channels
ch4=addAnalogInputChannel(s,'Dev1','ai0','Voltage');
ch4.TerminalConfig = 'Differential';
ch5=addAnalogInputChannel(s,'Dev1','ai1','Voltage');
ch5.TerminalConfig = 'Differential';
% add listeners
lh = s.addlistener('DataAvailable', @(src, event) logData(src, event, fid1));
% start recording
tic
s.IsContinuous = true;
s.startBackground;
pause(duration);
s.stop % end recording
toc
delete(lh);
function logData(src, evt, fid)
% Add the time stamp and the data values to data. Toda write data sequentially,
% transpose the matrix.
% Copyright 2011 The MathWorks, Inc.
data = [evt.TimeStamps, evt.Data]' ;
subplot(2,1,1)
plot(data(1,:),data(2,:));
xlabel('Time (s)'), ylabel('Amplitude (V)'), legend('ai0')
ylim([-0.5 0.5]);
subplot(2,1,2)
plot(data(1,:),data(3,:));
xlabel('Time (s)'), ylabel('Amplitude (V)'), legend('ai1')
ylim([-0.5 0.5]);
% mean(data(1,:))
fwrite(fid,data,'double');
end
  5 commentaires
LO
LO le 15 Juil 2021
Tank you, this is actually useful. I wonder if there is a way to estimate the limit of "computing power" during an acquisition session. I will check the documentation. Thank you again.
Basically my aim is to perform online zerocrossing analysis to determine the instant frequency of a modulated signal. I will post the code here if I make it :)
dpb
dpb le 15 Juil 2021
Certainly is no way to estimate a priori; you'll find out when you can't get everything done you're trying to before the next packet arrives. With MATLAB and all in m-files unless you can keep things highly vectorized and minimize screen refreshes, you won't get a tremendously high throughput -- it is still, after all, interpreted/compiled, not fully compiled to object code.

Connectez-vous pour commenter.

Réponses (0)

Produits


Version

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by