フィルターのクリア

Make a Truth Table

5 ビュー (過去 30 日間)
Edoardo
Edoardo 2023 年 4 月 22 日
コメント済み: chicken vector 2023 年 4 月 23 日
OK so I would like to clarify my question about Using mat2cell in a proper way.
To be honest what I want (in general) is to make something like a truth table for my final year project. I will take the data from MATLAB database as an example, since I cannot upload the data to this community due to the file size. The approachment is similar to what I have done in my project
So far what I have done is following (I divide the code in several parts so that all of you can understand what will be produced in each part):
tt = edfread('example.edf');
info = edfinfo("example.edf");
fs = info.NumSamples/seconds(info.DataRecordDuration);
for k=1:width(tt)
for l=2:4
recnum(l) = l;
signum(k) = k;
%t{k,l} = (0:info.NumSamples(signum(k))-1)/fs(signum(k));
y{l,k} = tt.(signum(k)){recnum(l)};
end
end
y = cell2mat(y);
waveletFunction = 'sym8';
for k = 1:width(tt)
[C{k},L{k}] = wavedec(y(:,k),6,waveletFunction);
s{k} = detcoef(C{k},L{k},6);
end
tc_d = linspace(0,20,74);
plot(tc_d,abs(s{1})); grid on; xticks(0:20); title(info.SignalLabels(1))
plot(tc_d,abs(s{2})); grid on; xticks(0:20); title(info.SignalLabels(2))
Then I need to create a truth table to indicate whether the high voltage occurs (in what seconds). For example, please refer to my drawing:
If you refer to the graph, the voltage that falls above the half will be considered as "high" (and the others considered as "low").
Actually, I can do it manually by looking at the graph and make the tables in Excel, but I hope there is an inbuilt tool in MATLAB to do the same things more efficiently, and in the other hand I can avoid trivial mistake like mistakenly read the graph.

回答 (2 件)

Steven Lord
Steven Lord 2023 年 4 月 23 日
See the islocalmax function.

chicken vector
chicken vector 2023 年 4 月 23 日
編集済み: chicken vector 2023 年 4 月 23 日
From the graph I see that the peaks marked are, as you say, over the half, but of the limits of the y axis, not of the maximum value. For this reason allow me to do something that I honestly don't like, that is to find the peaks by looking for valeus over 0.6 in the first graph, and over 0.06 in the second.
% Peaks thresholds:
threshold1 = 0.6;
threshold2 = 0.06;
% Determine respective timestamps:
times1 = unique(floor(tc_d(abs(s{1}) >= threshold1)));
times2 = unique(floor(tc_d(abs(s{2}) >= threshold2)));
% Initialise results cell:
truthCell = cell(20,3);
% Loop over time intervals:
for time = 1 : 20
% Build time interval name:
truthCell{time,1} = [num2str(time-1) '-' num2str(time) ' min'];
% Get result of ECG1 for current time interval:
if ismember(time,times1)
truthCell{time,2} = 'True';
else
truthCell{time,2} = 'False';
end
% Get result of ECG2 for current time interval:
if ismember(time,times2)
truthCell{time,3} = 'True';
else
truthCell{time,3} = 'False';
end
end
% Convert cell to table:
truthTable = cell2table(truthCell, ...
'VariableNames', ['Time', 'ECG1', 'ECG2']);
% Optional if you want to write data fo .xlsx:
writetable(truthTable,'TruthTable.xlsx');
  2 件のコメント
Edoardo
Edoardo 2023 年 4 月 23 日
@chicken vector if the peaks are the maximum value, is it possible, if yes, how?
chicken vector
chicken vector 2023 年 4 月 23 日
Not sure i understand what you are asking.
If you want to find the peaks and the corresponding time instants, you can use islocalmax as suggested by @Steven Lord.
% Base data:
threshold = 0.6;
ECG1 = abs(s{1});
% Find idx that are local max and over threshold:
localMaxIdx = islocalmax(ECG1) & tc_d(abs(s{1}) >= threshold));
% Find time instants corresponding to peaks over threshold:
peakTimes = tc_d(localMaxIdx);

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by