How can I make a scatter plot when the signal above a certain threshold in real time?

7 次查看(过去 30 天)
Hi all,
I am quite fresh in Matlab but want to design a program to simulate flowing paricles, the concept would close to flow cytometry.
The scenario is, the particle will induce several sine waves once it pass through the detecting zone. Each sine waves could be connected as a wave envelope since the particel transerving in the detection zone will have different sensitivity. Please see the fig1.
According to the sine wave amplitude, if the maximum value above a certain threshold which set by me, I can plot a dot on the XY scatter plot spontanously.
My question is, how can I modify my code for monitoring (real-time) measurement when I am scanning the particles?
I attached my code but they are just a sample for showing example, I think they should be more complicated if I want to use in my experiment.
Thanks! And hope everybody stay healthy and safe!
clc
close all
clear all
%Generate a similar signal
t=linspace(0,0.0025,10000);
fc= 5000;
fm= 200;
fs= 40000;
Am= 1;
Ac= 0.01;
m= Am/Ac;
wc= 2*pi*fc*t;
wm= 2*pi*fm*t;
ec= Ac*sin(wc);
em= Am*sin(wm);
y=Ac*(1+m*sin(wm).*sin(wc));
plot(t,y);
%Find the maximum amplitude and count it to make a XYscatter graph
[maxYvalue, indexAtmaxY]= max(y);
XvalueAtMaxYvalue= t(indexAtmaxY(1));
x= XvalueAtMaxYvalue.*1000;
scatter(x, maxYvalue)
xlabel('Time(us)')
ylabel('Voltage(a.u.)')

采纳的回答

darova
darova 2020-4-10
编辑:darova 2020-4-10
Here is my vision of your problem
x = -20:0.5:20;
f = @(x) sin(x).*sqrt(20^2-x.^2);
y = f(x);
ylim([-30 30])
cla
plot(x,y)
hold on
h1 = plot(0,0);
h2 = scatter(0,0);
for i = 1:length(x)
set(h2,'xdata',x(i),'ydata',f(x(i))*(f(x(i))>0));
set(h1,'xdata',[0 0]+x(i),'ydata',[-30 30])
xlim([-20 20]+x(i)) % move limits
pause(0.1) % wait a sec
drawnow
end
hold off
  10 个评论
Chen Kevin
Chen Kevin 2020-4-13
Perfect! It works, thanks!
But how do you save the file to animation? Like you responsed before with the comment.
darova
darova 2020-4-13
Example
clc,clear
% GRAPHICAL DRIVER
opengl software
x = linspace(0,5,20);
y = x.^2;
% axis([0 max(x) 0 max(y)])
h = plot(0,0,'or');
line(x,y)
filename = 'gif_animation.gif';
f = getframe(gcf);
[im,map] = rgb2ind(f.cdata,256);
imwrite(im,map,filename,'DelayTime',0,'Loopcount',inf);
for i = 1:length(x)
set(h,'xdata',x(i),'ydata',y(i))
pause(0.1)
f = getframe(gcf);
[im,map] = rgb2ind(f.cdata,256);
imwrite(im,map,filename,'DelayTime',0.1,'WriteMode','Append');
end

请先登录,再进行评论。

更多回答(1 个)

Image Analyst
Image Analyst 2020-4-10
Sometime you need to put a drawnow after your call() to plot to get the plot to show up in real time, otherwise, if it's in an intensive loop, it will only update the plot once the loop has finished:
plot(............)
drawnow; % Force screen to repaint immediately.
  5 个评论
Image Analyst
Image Analyst 2020-4-11
Yes, when pause hits, it gives time for the operating system to process other messages in the queue that have basically been held up while the OS is processing what it thinks are more important operations. So the MATLAB stuff like iterating on the loop and incrementing the loop counter (which it thinks are super important) are basically paused and it then gives it time to get around to handling the other messages that it considered lower priority, like updating the display. You might check out this Wikipedia article on message based computing: https://en.wikipedia.org/wiki/Message_queue

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Spectral Measurements 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by