Title: | Read and Process 'Pamguard' Binary Data |
---|---|
Description: | Functions for easily reading and processing binary data files created by 'Pamguard' (<https://www.pamguard.org/>). All functions for directly reading the binary data files are based on 'MATLAB' code written by Michael Oswald. |
Authors: | Taiki Sakai [aut, cre], Michael Oswald [aut], Douglas Gillespie [ctb] |
Maintainer: | Taiki Sakai <[email protected]> |
License: | GNU General Public License |
Version: | 1.9.2 |
Built: | 2025-02-07 02:56:19 UTC |
Source: | https://github.com/taikisan21/pambinaries |
Adds items freq
and time
to a Pamguard binary file
from the Whistle & Moan Detector
contourToFreq(data, verbose = FALSE)
contourToFreq(data, verbose = FALSE)
data |
either a |
verbose |
logical flag to print calculated parameters |
data
with items freq
and time
added. These use the
calculated FFT window length, hope size, and sample rate to compute the frequency
and time values of the saved whistle contour
Taiki Sakai [email protected]
# load example whistle file wmFile <- system.file('extdata', 'WM.pgdf', package='PamBinaries') wmData <- loadPamguardBinaryFile(wmFile) # converts contour and FFT slice numbers to frequency and time values wmData <- contourToFreq(wmData) wmData$data[[1]]$contour wmData$data[[1]]$freq wmData$data[[1]]$time
# load example whistle file wmFile <- system.file('extdata', 'WM.pgdf', package='PamBinaries') wmData <- loadPamguardBinaryFile(wmFile) # converts contour and FFT slice numbers to frequency and time values wmData <- contourToFreq(wmData) wmData$data[[1]]$contour wmData$data[[1]]$freq wmData$data[[1]]$time
a simple helper to convert Pamguard's numeric date to POSIXct format
convertPgDate(dateNum)
convertPgDate(dateNum)
dateNum |
date as a numeric, seconds since 1970-01-01 per standard Pamguard output. Timezone is UTC |
A POSIXct date in UTC
Taiki Sakai [email protected]
# load the example click binary data, leaving date as numeric clickFile <- system.file('extdata', 'Click.pgdf', package='PamBinaries') clickData <- loadPamguardBinaryFile(clickFile, convertDate = FALSE) # convert date to POSIXct convertPgDate(clickData$data[[1]]$date)
# load the example click binary data, leaving date as numeric clickFile <- system.file('extdata', 'Click.pgdf', package='PamBinaries') clickData <- loadPamguardBinaryFile(clickFile, convertDate = FALSE) # convert date to POSIXct convertPgDate(clickData$data[[1]]$date)
Counts the number of active channels given a channel mapping
countChannels(channelMap)
countChannels(channelMap)
channelMap |
Mapping of channels as a binary number |
The number of active channels (number of ones)
Altered from original script to loop through 30 instead 32 because R stores only 32 bit integers. Should not ever have enough channels for this to matter.
Taiki Sakai [email protected]
Converts numeric date to millisecond date.
dateNumToMillis(datenum)
dateNumToMillis(datenum)
datenum |
Numeric value of a date. |
Date as milliseconds
Conversion to milliseconds to match how Java stores dates. Doesn't appear to ever be used.
Taiki Sakai [email protected]
Reads and formats background noise data from Pamguard binary files or if not present in the original file will try to read the accompanying .pgnf noise file if it exists
loadBackgroundNoise(x) plotBackgroundNoise(x) combineBackgroundNoise(x, forPlot = FALSE)
loadBackgroundNoise(x) plotBackgroundNoise(x) combineBackgroundNoise(x, forPlot = FALSE)
x |
character pointing to a Pamguard binary file, or a |
forPlot |
logical flag when combining noise data. If used for plotting
purposes this will insert NA columns into background data so that images show
up with time gaps as expected. Leave as |
A list with times
storing the POSIXct time of each background
measurement, and background
a matrix of background values. For binary
data based on spectrogram measurements, there will also be freq
the
frequency in Hertz for each column of background measurement
Taiki Sakai [email protected]
# load the example click binary data, leaving date as numeric gplFile <- system.file('extdata', 'GPL.pgdf', package='PamBinaries') gplNoise <- loadBackgroundNoise(gplFile) print(gplNoise) plotBackgroundNoise(gplNoise)
# load the example click binary data, leaving date as numeric gplFile <- system.file('extdata', 'GPL.pgdf', package='PamBinaries') gplNoise <- loadBackgroundNoise(gplFile) print(gplNoise) plotBackgroundNoise(gplNoise)
This function will load in the data from a Pamguard binary file. It will figure out the type of data being read based on the header of the file. All functions based on Matlab code written by Michael Oswald.
loadPamguardBinaryFile( fileName, skipLarge = FALSE, skipData = FALSE, debug = FALSE, keepUIDs = NULL, convertDate = FALSE, ... )
loadPamguardBinaryFile( fileName, skipLarge = FALSE, skipData = FALSE, debug = FALSE, keepUIDs = NULL, convertDate = FALSE, ... )
fileName |
The name of the binary file to be read |
skipLarge |
Should we skip large parts of binaries? Currently only applicable to whistle, click, and DIFAR data |
skipData |
Should we skip all data and only read headers and footers? |
debug |
logical flag to show more info on errors |
keepUIDs |
If not |
convertDate |
logical flag to convert date from numeric to POSIXct. Defaults to
|
... |
Arguments passed to other functions |
This function returns a list containing two objects. Data contains all the binary data read. fileInfo contains metadata information for the file.
Taiki Sakai [email protected]
# read example whistle data wmFile <- system.file('extdata', 'WM.pgdf', package='PamBinaries') whistleData <- loadPamguardBinaryFile(wmFile) # works the same for different kinds of binary files clickFile <- system.file('extdata', 'Click.pgdf', package='PamBinaries') clickData <- loadPamguardBinaryFile(clickFile) # convert date to POSIXct (default does not because it is faster) clickPOSIX <- loadPamguardBinaryFile(clickFile, convertDate = TRUE) clickData$data[[1]]$date clickPOSIX$data[[1]]$date # read only the fileInfo portion, has empty $data item clickInfo <- loadPamguardBinaryFile(clickFile, skipData = TRUE) # skip reading the large click waveforms, much faster if you dont need them clickLess <- loadPamguardBinaryFile(clickFile, skipLarge = TRUE) object.size(clickData) object.size(clickLess) # only read specific UID numbers clickSpecific <- loadPamguardBinaryFile(clickFile, keepUIDs = c(4000006, 4000007)) names(clickSpecific$data)
# read example whistle data wmFile <- system.file('extdata', 'WM.pgdf', package='PamBinaries') whistleData <- loadPamguardBinaryFile(wmFile) # works the same for different kinds of binary files clickFile <- system.file('extdata', 'Click.pgdf', package='PamBinaries') clickData <- loadPamguardBinaryFile(clickFile) # convert date to POSIXct (default does not because it is faster) clickPOSIX <- loadPamguardBinaryFile(clickFile, convertDate = TRUE) clickData$data[[1]]$date clickPOSIX$data[[1]]$date # read only the fileInfo portion, has empty $data item clickInfo <- loadPamguardBinaryFile(clickFile, skipData = TRUE) # skip reading the large click waveforms, much faster if you dont need them clickLess <- loadPamguardBinaryFile(clickFile, skipLarge = TRUE) object.size(clickData) object.size(clickLess) # only read specific UID numbers clickSpecific <- loadPamguardBinaryFile(clickFile, keepUIDs = c(4000006, 4000007)) names(clickSpecific$data)
Converts Java millisecond time into numeric time that R uses.
millisToDateNum(millis)
millisToDateNum(millis)
millis |
Millisecond time from Java |
Numeric time used by R.
Original function was more relevant as Matlab and Java use different time origins. Java & R both use 1970-01-01, but Java stores as milliseconds vs seconds in R.
Taiki Sakai [email protected]
A wrapper for reading various types of binary data.
pamBinRead( fid, what = c("int8", "int16", "int32", "int64", "uint8", "uint16", "float", "double", "character"), n, seek = FALSE )
pamBinRead( fid, what = c("int8", "int16", "int32", "int64", "uint8", "uint16", "float", "double", "character"), n, seek = FALSE )
fid |
The binary file being read |
what |
The type of data to read. Int64 is not handled natively by R, see note. |
n |
The number of objects to read. |
seek |
Whether or not to just seek instead of reading |
Data of the type and number specified.
R does not natively support 64-bit integers. Current implementation is to read an int64 as 8 separate 1-byte raw pieces. These are converted from hexidecimal, shifted by the appropriate power of 2, then summed. Currently cannot read more than one int64 at a time, shouldn't be necessary.
Taiki Sakai [email protected]
Converts a PamBinary object into a data frame. The data.frame
will combine all of the data from the data
part of the PamBinary
object, but will not include annotations data, click waveforms, DIFAR demux
data, or contours from the WMD detector. These are skipped because they are
either inconsistent in their size, or are large objects. The function
pbToDf
is also called when as.data.frame
is called on a PamBinary
class object.
pbToDf(pb, templateNames = NULL)
pbToDf(pb, templateNames = NULL)
pb |
a PamBinary class object created by
|
templateNames |
if using the click template classifier, the names of the species for the click templates. These will be used as the names of the columns in the dataframe, and the length of this must exactly match the number of templates used. Will add columns for the threshold, match, and reject correlation values for each template name provided |
a data.frame containing most of the binary data read in. Will not
contain most annotation data, click waveforms, DIFAR demux data, or contour
information from WMD detector. These are skipped because they are either
incosistent in their size, or are large objects. Click template classifier
information will be included if templateNames
are supplied. If binary
is from noise band monitor, noise data will be stored in columns noiseMean,
noisePeak, and octaveBands, and the resulting dataframe will have a row for
each separate octave band stored
Taiki Sakai [email protected]
# load the data clickFile <- system.file('extdata', 'Click.pgdf', package='PamBinaries') clickData <- loadPamguardBinaryFile(clickFile) # two methods two convert to a dataframe head(pbToDf(clickData)) head(data.frame(clickData))
# load the data clickFile <- system.file('extdata', 'Click.pgdf', package='PamBinaries') clickData <- loadPamguardBinaryFile(clickFile) # two methods two convert to a dataframe head(pbToDf(clickData)) head(data.frame(clickData))
Plots the entire whistle contour saved in a Pamguard Whistle & Moan Detector binary file, highlighting the selected contour
plotWMD(data, id = 1, ...)
plotWMD(data, id = 1, ...)
data |
either a |
id |
the id of the whistle to plot, either an index or Pamguard UID |
... |
parameters to pass to other functions |
A ggplot object
Taiki Sakai [email protected]
# load example whistle file wmFile <- system.file('extdata', 'WM.pgdf', package='PamBinaries') wmData <- loadPamguardBinaryFile(wmFile) plotWMD(wmData, 1) plotWMD(wmData, 2)
# load example whistle file wmFile <- system.file('extdata', 'WM.pgdf', package='PamBinaries') wmData <- loadPamguardBinaryFile(wmFile) plotWMD(wmData, 1) plotWMD(wmData, 2)
Reads binary data stored by the AIS Processing module.
readAISData(fid, fileInfo, data, debug = FALSE, ...)
readAISData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by beam former annotation module
readBeamFormerAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
readBeamFormerAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
anVersion |
annotation version |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by bearing annotation module
readBearingAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
readBearingAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
anVersion |
annotation version |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads in the background data saved by the Click Detector
readClickBackground(fid, fileInfo, data)
readClickBackground(fid, fileInfo, data)
fid |
binary file identifier |
fileInfo |
structure holding the file header, module header, and the appropriate function to read module specific data |
data |
a structure containing standard data |
a structure containing data from a single object
Michael Oswald [email protected]
Reads binary data stored by Click Classifier annotations
readClickClsfrAnnotation(fid, fileInfo, debug = FALSE)
readClickClsfrAnnotation(fid, fileInfo, debug = FALSE)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
debug |
logical flag to show more info on errors |
a vector of click classifiers, represented by the click type flag
Taiki Sakai [email protected]
Reads binary data stored by the Click Detector module.
readClickData( fid, fileInfo, data, skipLarge = FALSE, debug = FALSE, getWave, onlyWave )
readClickData( fid, fileInfo, data, skipLarge = FALSE, debug = FALSE, getWave, onlyWave )
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
skipLarge |
a flag for whether or not to skip reading large wave file |
debug |
logical flag to show more info on errors |
getWave |
DEPRECATED: see skipLarge |
onlyWave |
DEPRECATED: see skipLarge |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by the click detector trigger
readClickTriggerData(fid, fileInfo, data, debug = FALSE, ...)
readClickTriggerData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads file header information specific to the click trigger module
readClickTriggerHeader(file)
readClickTriggerHeader(file)
file |
binary file to be read |
header information for the click trigger
Taiki Sakai [email protected]
Reads binary data stored by the Clip Generator module.
readClipData(fid, fileInfo, data, debug = FALSE, ...)
readClipData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by the DbHt module.
readDbHtData(fid, fileInfo, data, debug = FALSE, ...)
readDbHtData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by the Difar Processing module.
readDifarData(fid, fileInfo, data, skipLarge = FALSE, debug = FALSE)
readDifarData(fid, fileInfo, data, skipLarge = FALSE, debug = FALSE)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
skipLarge |
a flag of whether or not to skip reading the waveform |
debug |
logical flag to show more info on errors |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by the DbHt module.
readDLAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
readDLAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
anVersion |
annotation version |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by the DbHt module.
readDLDetData(fid, fileInfo, data, debug = FALSE, ...)
readDLDetData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by the Deep Learning Model module
readDLModelData(fid, fileInfo, data, debug = FALSE, ...)
readDLModelData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads file header information common to all files
readFileHeader(file, readExtra = FALSE)
readFileHeader(file, readExtra = FALSE)
file |
binary file to be read |
readExtra |
flag if there is extra information to read |
header information common to all files
Taiki Sakai [email protected]
Reads binary data stored by the GPL Module.
readGPLDetections(fid, fileInfo, data, debug = FALSE, ...)
readGPLDetections(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Michael Oswald [email protected]
Reads a Java UTF-8 string. The first 2 bytes are the length of the string, then the string itself.
readJavaUTFString(file)
readJavaUTFString(file)
file |
binary file to be read |
the string and its length
Taiki Sakai [email protected]
Reads binary data stored by the LTSA module.
readLTSAData(fid, fileInfo, data, debug = FALSE, ...)
readLTSAData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads file header information specific to the LTSA module
readLTSAHeader(file)
readLTSAHeader(file)
file |
binary file to be read |
header information for the LTSA module
Taiki Sakai [email protected]
Reads annotations from the matched click classifier. The matched matched click classifier annotates click detections with a threshold, matchcorr and rejectcorr values. The threshold value is used in the binary classification process. If it exceeds a hard value then the click is classified with the set type. The matchcorr and rejectcorr values are simply the correlation values of the match and reject templates with the click.
readMatchClsfrAnnotation(fid, fileInfo, anVersion, debug = FALSE)
readMatchClsfrAnnotation(fid, fileInfo, anVersion, debug = FALSE)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
anVersion |
version id of annotation module |
debug |
logical flag to show more info on errors |
a vector with the threshold, matchcorr, and rejectcorr values. See description.
Taiki Sakai [email protected]
Reads binary data stored by the Noise Band Monitor.
readNoiseBandData(fid, fileInfo, data, debug = FALSE, ...)
readNoiseBandData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by the Noise Monitor.
readNoiseMonData(fid, fileInfo, data, debug = FALSE, ...)
readNoiseMonData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads file header information specific to the Noise Monitor module
readNoiseMonHeader(file)
readNoiseMonHeader(file)
file |
binary file to be read |
header information for the Noise Monitor module
Taiki Sakai [email protected]
Reads in the object data that is common to all modules. This reads up to (but not including) the object binary length, and then calls a function to read the module-specific data.
readPamData(fid, fileInfo, skipLarge, debug = FALSE, keepUIDs, ...)
readPamData(fid, fileInfo, skipLarge, debug = FALSE, keepUIDs, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header, module header, and the appropriate function to read module specific data |
skipLarge |
Should we skip large parts of binaries? Currently only applicable to whistle, click, and DIFAR data |
debug |
logical flag to show more info on errors |
keepUIDs |
If not |
... |
Arguments passed to other functions |
a structure containing data from a single object
Taiki Sakai [email protected]
Reads binary data stored by the Right Whale Edge Detector.
readRWEDetectorData(fid, fileInfo, data, debug = FALSE, ...)
readRWEDetectorData(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads in the background data saved by various detectors (e.g WMD, Right Whale Edge Detector, etc) EXCEPT FOR the Click Detector
readSpectralBackground(fid, fileInfo, data)
readSpectralBackground(fid, fileInfo, data)
fid |
binary file identifier |
fileInfo |
structure holding the file header, module header, and the appropriate function to read module specific data |
data |
a structure containing standard data |
a structure containing data from a single object
Michael Oswald [email protected]
Reads the module header information common to all modules. Differs from the legacy code in that it does not read in or skip any information specific to a module.
readStdModuleHeader(file)
readStdModuleHeader(file)
file |
binary file to be read |
header information common to all modules
Taiki Sakai [email protected]
Reads binary data stored by TDBL annotation module
readTDBLAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
readTDBLAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
anVersion |
annotation version |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by beam former annotation module
readTMAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
readTMAnnotation(fid, fileInfo, anVersion, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
anVersion |
annotation version |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads binary data stored by the Gemini Tritech Module
readTritechTrack(fid, fileInfo, data, debug = FALSE, ...)
readTritechTrack(fid, fileInfo, data, debug = FALSE, ...)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
debug |
logical flag to show more info on errors |
... |
Arguments passed to other functions |
a structure containing data from a single object, and a logical flag if an error has occurred
Benjamin Blundell [email protected]
Reads binary data stored by the Whistle & Moan Detector
readWMDData(fid, fileInfo, data, skipLarge = FALSE, debug = FALSE)
readWMDData(fid, fileInfo, data, skipLarge = FALSE, debug = FALSE)
fid |
binary file identifier |
fileInfo |
structure holding the file header and module header |
data |
a structure containing standard data |
skipLarge |
a flag for whether or not to skip reading large contours |
debug |
logical flag to show more info on errors |
a structure containing data from a single object, and a logical flag if an error has occurred
Taiki Sakai [email protected]
Reads file header information specific to the Whistle & Moan Detector module
readWMDHeader(file)
readWMDHeader(file)
file |
binary file to be read |
header information for the Whistle & Moan Detector module
Taiki Sakai [email protected]