diff trunk/src/Modules/Output/FileOutputHTK.h @ 277:6b4921704eb1

- Ported over HTK file output - Added some more meat to the Slaney IIR gammatone implementation - Ported over the AIM-MAT sf2003 parabola strobe algorithm - Finished making the SAI implementation compile - Ported over the strobe list class (now uses STL deques internally)
author tomwalters
date Thu, 18 Feb 2010 16:55:40 +0000
parents
children f469d936337f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/Modules/Output/FileOutputHTK.h	Thu Feb 18 16:55:40 2010 +0000
@@ -0,0 +1,106 @@
+/*!
+ * \file
+ * \brief File output to HTK format class definition
+ *
+ * \author Tom Walters <tcw24@cam.ac.uk> and Willem van Engen <cnbh@willem.engen.nl>
+ * \date created 2006/10/30
+ * \version \$Header$
+ */
+/* (c) 2006, University of Cambridge, Medical Research Council
+ * http://www.pdn.cam.ac.uk/groups/cnbh/aimmanual
+ */
+#ifndef _AIMC_MODULE_OUTPUT_HTK_H_
+#define _AIMC_MODULE_OUTPUT_HTK_H_
+
+#include "Support/Module.h"
+#include "Support/SignalBank.h"
+
+
+// Defines taken from HTKwrite.c and The HTK Book
+#define H_WAVEFORM		0	//sampled waveform
+#define H_LPC			1	//linear prediction filter coefficients
+#define H_LPREFC		2	//linear prediction reflection coefficients
+#define H_LPCEPSTRA		3	//LPC cepstral coefficients
+#define H_LPDELCEP		4	//LPC cepstra plus delta coefficients
+#define H_IREFC			5	//LPC reflection coef in 16 bit integer format
+#define H_MFCC			6	//mel-frequency cepstral coefficients
+#define H_FBANK			7	//log mel-filter bank channel outputs
+#define H_MELSPEC		8	//linear mel-filter bank channel outputs
+#define H_USER			9	//user defined sample kind
+#define H_DISCRETE		10	//vector quantised data
+#define H_PLP           11  // Perceptual Linear Prediction
+#define H_ANON          12
+
+#define H_E 64 //has energy
+#define H_N 128 //absolute energy suppressed
+#define H_D 256 //has delta coefficients
+#define H_A 512 //has acceleration coefficients
+#define H_C 1024 //is compressed
+#define H_Z 2048 //has zero mean static coef.
+#define H_K 4096 //has CRC checksum
+#define H_O 8192 //has 0th cepstral coef.
+#define H_V 16384 // Attach vq index
+#define H_T 32768 // Attach delta-delta-delta index
+
+// HTK fomat is big-endian...
+#define ByteSwap16(n) \
+( ((((uint16_t) n) << 8) & 0xFF00) | \
+((((uint16_t) n) >> 8) & 0x00FF) )
+
+#define ByteSwap32(n) \
+( ((((uint32_t) n) << 24) & 0xFF000000) | \
+((((uint32_t) n) << 8) & 0x00FF0000) | \
+((((uint32_t) n) >> 8) & 0x0000FF00) | \
+((((uint32_t) n) >> 24) & 0x000000FF) )
+
+/*!
+ * \class FileOutputHTK "Output/FileOutputHTK.h"
+ * \brief File output to HTK class
+ *
+ * This class gives a method for saving either a signal or a profile to HTK format.
+ * \sa Signal, SignalBank
+ */
+namespace aimc {
+class FileOutputHTK : public Module {
+ public:
+	/*! \brief Create a new file output for an HTK format file. Use of this 
+	 *  class only really makes sense for the output of 1-D frames.
+	 */
+	FileOutputHTK(Parameters *pParam);
+	~FileOutputHTK();
+
+	/*! \brief Initialize the output to HTK.
+	 *  \param *filename Filename of the ouptut file to be created.
+	 *  If the file exists it will be overwritten
+	 *  \return Returns true on success of initialization.
+	 */
+	bool OpenFile(const char *filename, float frame_period_ms);
+  bool CloseFile();
+  virtual void Process(const SignalBank &input);
+protected:
+  virtual bool InitializeInternal(const SignalBank &input);
+  virtual void ResetInternal();
+
+  float ByteSwapFloat(float d);
+
+	void WriteHeader(int nelements, float sampPeriod);
+
+	//! \brief Whether initialization is done or not
+	bool header_written_;
+
+	//! \brief Filename
+	char filename_[PATH_MAX];
+	//! \brief Internal pointer to the output file
+	FILE *file_handle_;
+
+	//! \brief Count of the number of samples in the file, written on close
+	int sample_count_;
+
+  int channel_count_;
+  int buffer_length_;
+  float frame_period_ms_;
+};
+}  // namespace aimc
+
+#endif  // _AIMC_MODULE_OUTPUT_HTK_H_
+