-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
FoxyLab
committed
Sep 18, 2015
0 parents
commit a1c618c
Showing
1 changed file
with
131 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
% Geiger Counter in MATLAB | ||
% Version 1.0 | ||
% Alexey V. Voronin @ FoxyLab © 2015 | ||
% http:https://acdc.foxylab.com | ||
% ----------------------------------- | ||
% ñåðèÿ èç íåñêîëüêèõ èçìåðåíèé | ||
clc; % î÷èñòêà îêíà êîìàíä | ||
close all; % óäàëåíèå ôèãóð | ||
disp('© 2015 acdc.foxylab.com'); | ||
disp('***** Geiger counter *****'); | ||
disp('**************************'); | ||
disp('***Moving average algorithm***'); | ||
prompt = {'Measurement period, sec'}; | ||
defans = {'900'}; | ||
answer = inputdlg(prompt,'Measurement period',1,defans); | ||
[nums status] = str2num(answer{1}); | ||
if ~status | ||
error('Incorrect value!'); | ||
end; | ||
disp(sprintf('T = %d sec',nums)); | ||
prompt = {'Moving average window size, sec'}; | ||
defans = {'900'}; | ||
answer = inputdlg(prompt,'Moving average window size',1,defans); | ||
[window status] = str2num(answer{1}); | ||
if ~status | ||
error('Incorrect value!'); | ||
end; | ||
disp(sprintf('W = %d sec',window)); | ||
Fs = 44100; % ÷àñòîòà îöèôðîâêè | ||
duration = 1; % äëèòåëüíîñòü èçìåðåíèÿ = 1 ñåê | ||
threshold = 0.5; % ãðàíèöà èìïóëüñà | ||
pause = 5; % äëèíà ïàóçû â ñýìïëàõ | ||
ai = analoginput('winsound'); % creates the analog input object AI for a sound card having an ID of 0 (adaptor must be winsound) | ||
addchannel(ai,1); | ||
set (ai, 'SampleRate', Fs); % set the sample rate | ||
set (ai, 'SamplesPerTrigger', duration*Fs); % set number of samples to acquire | ||
set (ai, 'TriggerType', 'Manual'); % set acquisition start type | ||
set(ai,'TriggerRepeat',Inf); | ||
start(ai); % The start command will start the acquisition running | ||
MAs = []; % ñîçäàåì ìàññèâ äëÿ õðàíåíèÿ âñåõ MA | ||
MABuffer = []; % ñîçäàåì ìàññèâ äëÿ ïîäñ÷åòà MA | ||
MASize = window;%ðàçìåð áóôåðà ðàâåí ðàçìåðó îêíà | ||
MACount = 0;%ñáðîñ ñ÷åò÷èêà çàïîëíåíèÿ áóôåðà | ||
for m =1:1:MASize %î÷èñòêà áóôåðàû | ||
MABuffer(m) = 0; | ||
end; | ||
pulse = false;%ñáðîñ ôëàãà èìïóëüñà | ||
pauseCount = 0;% îáíóëåíèå äëèòåëüíîñòè ïàóçû | ||
count = 0;%îáíóëåíèå ñ÷åò÷èêà MA | ||
trigger(ai);%íà÷àëî çàõâàòà | ||
while (count < nums) %öèêë èçìåðåíèé | ||
data = getdata(ai); % And to read the data use the getdata function | ||
trigger(ai);% the data samples will not be stored in the data acquisition engine until the TRIGGER command is issued | ||
% GETDATA is a "blocking" function. This means that it will wait until all data have been collected | ||
size = length(data);%ðàçìåð ìàññèâà äàííûõ | ||
pulseCount = 0;% îáíóëåíèå ñ÷åò÷èêà èìïóëüñîâ â èçìåðåíèè | ||
for i = 1:1:size % öèêë ïî âñåì ñýìïëàì | ||
% åñëè èìïóëüñ åùå íå íà÷àëñÿ | ||
if (pulse == false) | ||
if (abs(data(i))>threshold) | ||
% åñëè óðîâåíü ïðåâûøàåò ïðåäåë, òî ïîäíèìàåì ôëàã íà÷àëà èìïóëüñà | ||
pulse = true; | ||
end | ||
else | ||
% åñëè èìïóëüñ óæå íà÷àëñÿ | ||
if (abs(data(i))<=threshold) | ||
% åñëè óðîâåíü íèæå ïðåäåëà | ||
pauseCount = pauseCount + 1;% èíêðåìåíò ñ÷åò÷èêà äëèòåëüíîñòè ïàóçû | ||
if (pauseCount > pause) | ||
% åñëè ïàóçà â òå÷åíèå íóæíîãî âðåìåíè | ||
pulse = false;% ôëàã èìïóëüñà ñïóùåí, áóäåì æäàòü íîâîãî èìïóëüñà | ||
pulseCount = pulseCount + 1;% èíêðåìåíò ñ÷åò÷èêà èìïóëüñîâ | ||
pauseCount = 0;% îáíóëåíèå äëèòåëüíîñòè ïàóçû | ||
end | ||
else | ||
% ïàóçà ïðåðâàíà äîñðî÷íî | ||
pauseCount = 0; | ||
end | ||
end | ||
end; | ||
%èíêðåìåíò ñ÷åò÷èêà çàïîëíåíèÿ áóôåðà | ||
if (MACount < MASize) | ||
MACount = MACount + 1; | ||
end; | ||
%ñìåùåíèå äàííûõ â áóôåðå ââåðõ | ||
m = MASize; | ||
while m>1 | ||
MABuffer(m) = MABuffer(m-1); | ||
m = m-1; | ||
end; | ||
%ñîõðàíåíèå òåêóùåãî ðåçóëüòàòà èçìåðåíèé â áóôåðå | ||
MABuffer(1) = pulseCount; | ||
%ïîäñ÷åò MA | ||
MA = 0; | ||
for m =1:1:MACount | ||
MA = MA+MABuffer(m); | ||
end; | ||
MA = MA / MACount * 60 / duration; %óñðåäíÿåì MA çà 1 ìèíóòó | ||
disp(strcat(sprintf('Full = %0.1f',MACount/MASize*100),'%'));% âûâîä % çàïîëíåíèÿ áóôåðà | ||
disp(sprintf('MA = %0.2f CPM',MA));% âûâîä MA | ||
count = count + 1;%èíêðåìåíò ñ÷åò÷èêà MA | ||
MAs(count) = MA;%ñîõðàíåíèå MA | ||
end; | ||
% ñòðîèì ãðàôèê MA | ||
x_s = [0:duration:(count-1)*duration];%ìåòêè ïî îñè x | ||
h = figure(1); | ||
plot(x_s,MAs,'LineWidth',3);%ãðàôèê MA | ||
grid on; | ||
ylim([0 2*duration*60]); % ïðåäåëû ïî îñè OY | ||
title('Moving Average'); | ||
xlabel('t, sec') % ìåòêà îñè OX | ||
ylabel('MA, CPM') % ìåòêà îñè OY | ||
%ñîõðàíåíèå MA â ôàéëå | ||
formatOut = 'yyyymmddHHMMSS'; | ||
unique = datestr(now,formatOut); | ||
% ñîñòàâëÿåì èìÿ ôàéëà | ||
unique_png = strcat(unique,'.png'); | ||
%Ñîõðàíåíèå ãðàôèêà â ôàéë c íóæíûì ðàñøèðåíèåì (ñìîòðè help) | ||
saveas(h, unique_png, 'png'); | ||
close(h); %çàêðûâàåì ïîñòðîåííûé ãðàôèê, ÷òîá íå çàñîðÿòü ïàìÿòü | ||
unique_txt = strcat(unique,'.txt'); | ||
dlmwrite(unique_txt,MAs,'precision',6) | ||
MA_min = min(MAs); % ìèíèìàëüíîå ÷èñëî èìïóëüñîâ | ||
MA_max = max(MAs); % ìàêñèìàëüíîå ÷èñëî èìïóëüñîâ | ||
disp(sprintf('Min = %0.2f CPM',MA_min)); | ||
disp(sprintf('Max = %0.2f CPM',MA_max)); | ||
stop(ai); % stop the analog input object from running | ||
delete(ai); % delete the analog input object to free memory and other physical resources | ||
% clears the finished object from the MATLAB workspace | ||
clear ai; | ||
clear all; % deletes all objects from memory |