Working with DICOM Waveforms

The DICOM standard supports waveform storage and communication: this includes hemodynamic curve data, cardiac electrophysiology, electrocardiography (ECG) and audio signals (WAV files). A waveform consists of one or more multiplex groups, each encoded into an item in the "Waveform Sequence" (5400,0100). All channels within a multiplex group are synchronously digitized at a common sampling frequency. The waveform samples can be 8 or 16 bit, with data representation as signed , unsigned , mu-law or A-law. DICOM also supports waveform annotations, which are typically generated as part of the data acquisition process, such as waveform maxima and minima, or the labeling of particular stimuli.

LEADTOOLS waveform support is comprehensive and handles the various features supported by the standard. The LDicomWaveformGroup class encapsulates the attributes of a multiplex group (the building block for waveforms in DICOM), while the LDicomWaveformChannel class provides functions to create and manipulate waveform channels. On the dataset level, the toolkit provides four simple, yet powerful functions for using waveforms:

The LDicomDS::AddWaveformGroup function, which you use to create a new waveform group.

The LDicomDS::DeleteWaveformGroup, which you use to delete an existing waveform group.

The LDicomDS::GetWaveformGroupCount, which you use to get the number of waveform groups.

The LDicomDS::GetWaveformGroup function, which you use to extract a waveform group from a dataset

The LDicomWaveformGroup Class

The functionality offered by the LDicomWaveformGroup class can be divided into three main categories:

Channel Manipulation

Audio Support

Management of Waveform Group Attributes

More information is provided in the following sections.

Channel Manipulation

At the heart of any waveform support is the creation and management of channels. To create a new channel, use the LDicomWaveformGroup::AddChannel function. To get an existing one use the LDicomWaveformGroup::GetChannel function. The following functions can also be used to manage channels:

LDicomWaveformGroup::DeleteChannel

LDicomWaveformGroup::GetNumberOfChannels

LDicomWaveformGroup::GetNumberOfSamplesPerChannel

LDicomWaveformGroup::SetNumberOfSamplesPerChannel

Audio Support

LEADTOOLS waveform support includes support for audio data. To load a wave file into a waveform group, use the LDicomWaveformGroup::LoadAudio function. This function is very useful when creating DICOM objects of type "Basic Voice Audio" (1.2.840.10008.5.1.4.1.1.9.4.1), which is typically used for report dictation.

To create a wave file from the channels in a waveform group, use the LDicomWaveformGroup::SaveAudio function. This function is very useful when extracting audio (wave) data from a DICOM object of type "Basic Voice Audio" (1.2.840.10008.5.1.4.1.1.9.4.1)

Management of Waveform Group Attributes

LEADTOOLS waveform support includes comprehensive support for the management of the attributes of a waveform group.

In DICOM it is mandatory to specify the waveform's originality (that is, whether the waveform data is original (source) data, or derived data), as well as its sampling frequency. Consequently it is important to call LDicomWaveformGroup::SetWaveformOriginality and LDicomWaveformGroup::SetSamplingFrequency and set these values in order to create a proper waveform group.

If the acquisition equipment adds padding values, DICOM makes it mandatory to set the LDicomWaveformGroup::SetWaveformPaddingValue value. For more information, refer to the "Waveform Padding Value" (5400,100A) element in the DICOM standard.

The following functions are other functions that can be used to set and get the different attributes of a waveform group:

LDicomWaveformGroup::GetMultiplexGroupLabel

LDicomWaveformGroup::GetMultiplexGroupTimeOffset

LDicomWaveformGroup::GetSampleInterpretation

LDicomWaveformGroup::GetSamplingFrequency

LDicomWaveformGroup::GetTriggerSamplePosition

LDicomWaveformGroup::GetTriggerTimeOffset

LDicomWaveformGroup::GetWaveformOriginality

LDicomWaveformGroup::GetWaveformPaddingValue

LDicomWaveformGroup::SetMultiplexGroupLabel

LDicomWaveformGroup::SetMultiplexGroupTimeOffset

LDicomWaveformGroup::SetSampleInterpretation

LDicomWaveformGroup::SetTriggerSamplePosition

LDicomWaveformGroup::SetTriggerTimeOffset

LDicomWaveformGroup::SetWaveformOriginality

LDicomWaveformGroup::SetWaveformPaddingValue

The LDicomWaveformChannel Class

The LDicomWaveformChannel class provides functionality that can be divided into the following five categories:

1.

Setting/Getting Channel Samples

2.

Setting/Getting Channel Source

3.

Setting/Getting Channel Sensitivity

4.

Adding/Managing Waveform Annotations

5.

Setting/Getting Other WaveformChannel Attributes

More information is provided in the following sections.

Setting/Getting Channel Samples

Before setting channel data be sure to call the LDicomWaveformGroup::SetSampleInterpretation function to set the sample interpretation. To set the data for an 8-bit channel use the LDicomWaveformChannel::SetChannelSamples8 function. Use the LDicomWaveformChannel::SetChannelSamples16 function to set the data for a 16-bit one. Data representation for 8-bit channels can be signed, unsigned, mu-law or A-law, while the data representation for 16-bit channels can be signed or unsigned. To get the data for a channel call the LDicomWaveformChannel::GetChannelSamples function.

Setting/Getting Channel Source

In DICOM, it is mandatory to specify the source for a channel. For this reason it is important to call the LDicomWaveformChannel::SetChannelSource function to create a proper waveform channel. If you want to get a channel source, call the LDicomWaveformChannel::GetChannelSource function.

Setting/Getting Channel Sensitivity

In DICOM, it is mandatory to specify the channel sensitivity if the channel samples represent defined (not arbitrary) units. Since this is almost always the case, it is important to call LDicomWaveformChannel::SetChannelSensitivity to create a proper waveform channel. The members of the pChannelSensitivityUnits structure can be managed using the functions offered by the LDicomContextGroup class. For more information about this class and the use of Coded Concepts in DICOM, please refer to Working with Context Groups.

To get the channel sensitivity call the LDicomWaveformChannel::GetChannelSensitivity function.

Adding/Managing Waveform Annotations

To get the number of annotations call the LDicomWaveformChannel::GetAnnotationCount function. To create a new annotation, call the LDicomWaveformChannel::AddAnnotation function, while you call the LDicomWaveformChannel::GetAnnotation function to get an existing one. To delete an annotation call LDicomWaveformChannel::DeleteAnnotation.

Setting/Getting Other Waveform Channel Attributes

The following functions are other functions that can be used to set and get the different attributes of a waveform channel:

LDicomWaveformChannel::GetChannelLabel

LDicomWaveformChannel::GetChannelMaximumValue

LDicomWaveformChannel::GetChannelMinimumValue

LDicomWaveformChannel::GetChannelOffset

LDicomWaveformChannel::GetChannelSampleSkew

LDicomWaveformChannel::GetChannelStatus

LDicomWaveformChannel::GetChannelTimeSkew

LDicomWaveformChannel::GetFilterHighFrequency

LDicomWaveformChannel::GetFilterLowFrequency

LDicomWaveformChannel::GetIndex

LDicomWaveformChannel::GetNotchFilterBandwidth

LDicomWaveformChannel::GetNotchFilterFrequency

LDicomWaveformChannel::GetWaveformChannelNumber

LDicomWaveformChannel::GetWaveformGroup

LDicomWaveformChannel::SetChannelLabel

LDicomWaveformChannel::SetChannelMaximumValue

LDicomWaveformChannel::SetChannelMinimumValue

LDicomWaveformChannel::SetChannelOffset

LDicomWaveformChannel::SetChannelSampleSkew

LDicomWaveformChannel::SetChannelStatus

LDicomWaveformChannel::SetChannelTimeSkew

LDicomWaveformChannel::SetFilterHighFrequency

LDicomWaveformChannel::SetFilterLowFrequency

LDicomWaveformChannel::SetNotchFilterBandwidth

LDicomWaveformChannel::SetNotchFilterFrequency

LDicomWaveformChannel::SetWaveformChannelNumber