我有原始的心电图(ECG)电压样本,格式为csv,例如:
time voltage (mV)
0.000 9.169110459
0.001 9.144672532
0.002 9.144672532
0.003 9.169110459
0.004 9.169110459
0.005 9.169110459
0.006 9.169110459
0.007 9.144672532
0.008 9.217986315
0.009 9.169110459
0.01 9.169110459
0.011 9.169110459
0.012 9.169110459
0.013 9.144672532
0.014 9.144672532
0.015 9.169110459
0.016 9.169110459
0.017 9.169110459
0.018 9.169110459
0.019 9.169110459
0.02 9.169110459
0.021 9.169110459
0.022 9.144672532
0.023 9.169110459
我想将这个文件转换为DICOM文件,以便我可以在ECG toolkit for c#等心电图查看器中查看:https://sourceforge.net/projects/ecgtoolkit-cs/ 如何进行此转换?我已经搜索了一些内容,但没有找到能够从原始数据编写DICOM文件的工具。
编辑:最终我选择了SCP文件,因为这更容易。我最终使用上面的库创建了一个SCP文件。下面是代码:
using System;
using System.Linq;
using ECGConversion;
using ECGConversion.ECGDemographics;
using ECGConversion.ECGSignals;
namespace SCPWriter
{
public static class CreateScpEcg
{
public static void CreateScpEcgFile(double[] voltages, int sampleRate, string directory, string patientId)
{
var rhythm = voltages;
var filePath = directory + patientId;
// get an empty ECG format file
IECGFormat format = ECGConverter.Instance.getFormat("SCP-ECG");
if (format != null)
{
// five required actions for the demographic info.
format.Demographics.Init();
format.Demographics.PatientID = patientId;
format.Demographics.LastName = "";
format.Demographics.TimeAcquisition = DateTime.Now;
// make an AcquiringDeviceID object
AcquiringDeviceID acqID = new AcquiringDeviceID(true);
// can also specify your own acquiring device info
Communication.IO.Tools.BytesTool.writeString("MYDEVI", acqID.ModelDescription, 0, acqID.ModelDescription.Length);
// set the Acquiring Device ID (required)
format.Demographics.AcqMachineID = acqID;
// declare the signal part.
var leadType = new LeadType[] { LeadType.I };
var rhythmAVM = 1;
var rhythmSPS = sampleRate;
Signals sigs = new Signals((byte)leadType.Length);
sigs.RhythmAVM = rhythmAVM;
sigs.RhythmSamplesPerSecond = rhythmSPS;
for (int i = 0; i < sigs.NrLeads; i++)
{
// very important to assign signal.
sigs[i] = new Signal();
sigs[i].Type = leadType[i];
sigs[i].Rhythm = rhythm.Select(Convert.ToInt16).ToArray();
sigs[i].RhythmStart = 0;
sigs[i].RhythmEnd = rhythm.Length - 1;
}
// store signal to the format.
if (format.Signals.setSignals(sigs) != 0)
{
Console.Error.WriteLine("setSignals failed!");
return;
}
// write the file
var outputFile = filePath + ".scp";
ECGWriter.Write(format, outputFile, true);
if (ECGWriter.getLastError() != 0)
{
Console.Error.WriteLine("Writing failed: {0}!", ECGWriter.getLastErrorMessage());
return;
}
}
}
}
}
NB: 我只对 "lead I" 感兴趣,但您可以在此行中添加更多线索: var leadType = new LeadType[] { LeadType.I }
NB: 这不是我的代码,而是来自上面链接中的讨论之一。