Write the Timetable data to the EDF file

조회 수: 10 (최근 30일)
Wensor
Wensor 2024년 9월 2일
댓글: Wensor 2024년 9월 3일
>> hdr = edfheader("EDF");
>> hdr.NumSignals = 3;
hdr.NumDataRecords = 3;
>> edfw = edfwrite("rand.edf",hdr,TT);
Incorrect use of edfwrite
annotations should be arrays with columns equal to 2.
But I haven't annotations
How can I write a Timetable data into a EDF File?
  댓글 수: 2
Shashi Kiran
Shashi Kiran 2024년 9월 2일
I used edfwrite on my data without annotations, and it worked fine. Could you share your Timetable data(TT) so I can look into it further?
Wensor
Wensor 2024년 9월 2일
편집: Walter Roberson 2024년 9월 3일
Thank you @Shashi Kiran
Actually, I'm doing a practice.My data is
MeasurementTime = datetime({'2015-12-18 08:03:05';'2015-12-18 10:03:17';'2015-12-18 12:03:13'});
Temp = [37.3;39.1;42.3];
Pressure = [30.1;30.03;29.9];
WindSpeed = [13.4;6.5;7.3];
TT = timetable(MeasurementTime,Temp,Pressure,WindSpeed)

댓글을 달려면 로그인하십시오.

채택된 답변

Umar
Umar 2024년 9월 2일

Hi @Wensor ,

You asked, “How can I write a Timetable data into a EDF File?”

To address your inquiry regarding writing a Timetable to an EDF file in MATLAB, I broke down your requirements and analyzed the provided code.

Data Structure: You are working with a Timetable (TT) containing signal data. EDF File Format: You are attempting to write this data to an EDF file using the edfwrite function. Error Handling: The error indicates that annotations are expected as a two-column array, but you do not have any annotations to include.

So, to write your Timetable data into an EDF file without annotations, you need to make that the data structure and the header properties are correctly set up based on mathworks documentation provided in the link below.

https://www.mathworks.com/help/signal/ref/edfwrite.html

Below is the complete and corrected code based on your original snippet.

% Create your Timetable data
time = duration(0, 0, 0.1*(0:6)');  % Create a duration vector for time
data1 = randn(length(time), 1);  % Signal 1
data2 = randn(length(time), 1);  % Signal 2
data3 = randn(length(time), 1);  % Signal 3
% Create a timetable
TT = timetable(time, data1, data2, data3);
% Prepare the EDF Header
hdr = edfheader("EDF");
hdr.NumSignals = 3;  % Number of signals
hdr.NumDataRecords = height(TT);  % Number of data records
hdr.DataRecordDuration = duration(0, 0, 0.1); % Duration of each data record
% Specify signal labels and other properties
hdr.SignalLabels = ["Signal 1"; "Signal 2"; "Signal 3"];
hdr.TransducerTypes = ["EEG"; "EEG"; "EEG"];  % Example transducer type
hdr.PhysicalDimensions = ["uV"; "uV"; "uV"];  % Signal units
hdr.PhysicalMin = [-500; -500; -500];  % Min physical values
hdr.PhysicalMax = [500; 500; 500];  % Max physical values
hdr.DigitalMin = [-32768; -32768; -32768];  % Min digital values
hdr.DigitalMax = [32767; 32767; 32767];  % Max digital values
% Prepare signal data
sigdata = [TT.data1, TT.data2, TT.data3];  % Extract signal data from the 
timetable
% Write to EDF file without annotations
edfw = edfwrite("rand.edf", hdr, sigdata);  % Correct method call

Please see attached.

If you later decide to include annotations, you would need to create a separate timetable for them, ensuring it contains the required columns: Onset, Annotations, and Duration. Make sure that the length of the sigdata matches the number of data records in the header.

Hope this answers your questions please let me know if you have any further questions.

  댓글 수: 4
Umar
Umar 2024년 9월 3일

Hi @Wensor,

I have executed the code above and attached the file below. Please let me know if this answers your question.

Wensor
Wensor 2024년 9월 3일
I think it's very hlepful ,thank you very much!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Shashi Kiran
Shashi Kiran 2024년 9월 2일
I see you are using edfwrite on timetables. The edfwrite function is specifically designed to work with numerical data, not with timetables. However, you can convert the timetable to a numeric matrix and then use edfwrite to write the data to an EDF file.
Below is an implementation based on the data you have provided:
% Create timetable with your data
MeasurementTime = datetime({'2015-12-18 08:03:05'; '2015-12-18 10:03:17'; '2015-12-18 12:03:13'});
Temp = [37.3; 39.1; 42.3];
Pressure = [30.1; 30.03; 29.9];
WindSpeed = [13.4; 6.5; 7.3];
TT = timetable(MeasurementTime, Temp, Pressure, WindSpeed);
% Prepare signal data
sigdata = [TT.Temp, TT.Pressure, TT.WindSpeed];
% Prepare the EDF Header
hdr = edfheader("EDF");
hdr.NumSignals = 3;
hdr.NumDataRecords = height(TT);
hdr.DataRecordDuration = duration(0, 0, 0.1);
% Specify signal labels and other properties
hdr.SignalLabels = ["Temperature"; "Pressure"; "Wind Speed"];
hdr.PhysicalDimensions = ["C"; "hPa"; "m/s"];
hdr.PhysicalMin = [min(Temp); min(Pressure); min(WindSpeed)];
hdr.PhysicalMax = [max(Temp); max(Pressure); max(WindSpeed)];
hdr.DigitalMin = [-32768; -32768; -32768];
hdr.DigitalMax = [32767; 32767; 32767];
% Write the data to an EDF file
edfw = edfwrite("rand.edf", hdr, sigdata);
disp(edfw)
edfwrite with: File properties (Read-only): Filename: "rand.edf" FileType: "EDF" FileModDate: "02-Sep-2024 06:38:10" FileSize: 1042 Show all properties
Ensure that you have correctly defined the EDF header according to your requirements.
Refer the below documentation for more information regarding edfwrite
  1. https://in.mathworks.com/help/signal/ref/edfwrite.html#mw_2b309c94-5d2e-455e-86ef-d8dc48275b0b
Hope this helps!
  댓글 수: 3
Shashi Kiran
Shashi Kiran 2024년 9월 2일
Since we cannot use datetime directly in the EDF file, we can use relative time to store the time data in hours or minutes as required.
Here is the revised code as per your requirement.
% Create timetable with your data
MeasurementTime = datetime({'2015-12-18 08:03:05'; '2015-12-18 10:03:17'; '2015-12-18 12:03:13'});
Temp = [37.3; 39.1; 42.3];
Pressure = [30.1; 30.03; 29.9];
WindSpeed = [13.4; 6.5; 7.3];
TT = timetable(MeasurementTime, Temp, Pressure, WindSpeed);
timeHours = hours(TT.MeasurementTime - TT.MeasurementTime(1));
sigdata = [timeHours, TT.Temp, TT.Pressure, TT.WindSpeed];
% Prepare the EDF Header
hdr = edfheader("EDF");
hdr.NumSignals = 4;
hdr.NumDataRecords = height(TT);
hdr.DataRecordDuration = duration(0, 0, 0.1);
% Specify signal labels and other properties
hdr.SignalLabels = ["Time", "Temperature", "Pressure", "Wind Speed"];
hdr.PhysicalDimensions = ["h", "C", "hPa", "m/s"]; % Dimensions for each signal
hdr.PhysicalMin = [min(timeHours), min(Temp), min(Pressure), min(WindSpeed)];
hdr.PhysicalMax = [max(timeHours), max(Temp), max(Pressure), max(WindSpeed)];
hdr.DigitalMin = [-32768, -32768, -32768, -32768];
hdr.DigitalMax = [32767, 32767, 32767, 32767];
% Write the data to an EDF file
edfw = edfwrite("rand.edf", hdr, sigdata);
disp(edfw)
edfwrite with: File properties (Read-only): Filename: "rand.edf" FileType: "EDF" FileModDate: "02-Sep-2024 08:01:58" FileSize: 1304 Show all properties
Wensor
Wensor 2024년 9월 3일
편집: Wensor 2024년 9월 3일
I think it's very helpful,Thank you so much!

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 AI for Signals에 대해 자세히 알아보기

제품


릴리스

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by