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