tomwalters@8: // Copyright 2006-2010, Thomas Walters, Willem van Engen tomwalters@8: // tomwalters@8: // AIM-C: A C++ implementation of the Auditory Image Model tomwalters@8: // http://www.acousticscale.org/AIMC tomwalters@8: // tomwalters@45: // Licensed under the Apache License, Version 2.0 (the "License"); tomwalters@45: // you may not use this file except in compliance with the License. tomwalters@45: // You may obtain a copy of the License at tomwalters@8: // tomwalters@45: // http://www.apache.org/licenses/LICENSE-2.0 tomwalters@8: // tomwalters@45: // Unless required by applicable law or agreed to in writing, software tomwalters@45: // distributed under the License is distributed on an "AS IS" BASIS, tomwalters@45: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. tomwalters@45: // See the License for the specific language governing permissions and tomwalters@45: // limitations under the License. tomwalters@8: tomwalters@5: /*! tomwalters@5: * \file tomwalters@9: * \brief File output to HTK format tomwalters@5: * tomwalters@11: * \author Thomas Walters tomwalters@8: * \author Willem van Engen tomwalters@5: * \date created 2006/10/30 tomwalters@5: * \version \$Header$ tomwalters@5: */ tomwalters@8: tomwalters@11: #ifndef AIMC_MODULES_OUTPUT_HTK_H_ tomwalters@11: #define AIMC_MODULES_OUTPUT_HTK_H_ tomwalters@5: tomwalters@5: #include "Support/Module.h" tomwalters@5: #include "Support/SignalBank.h" tomwalters@5: tomwalters@8: // Defines taken from HTKwrite.c and The HTK Book tomwalters@8: #define H_WAVEFORM 0 // sampled waveform tomwalters@8: #define H_LPC 1 // linear prediction filter coefficients tomwalters@8: #define H_LPREFC 2 // linear prediction reflection coefficients tomwalters@8: #define H_LPCEPSTRA 3 // LPC cepstral coefficients tomwalters@8: #define H_LPDELCEP 4 // LPC cepstra plus delta coefficients tomwalters@8: #define H_IREFC 5 // LPC reflection coef in 16 bit integer format tomwalters@8: #define H_MFCC 6 // mel-frequency cepstral coefficients tomwalters@8: #define H_FBANK 7 // log mel-filter bank channel outputs tomwalters@8: #define H_MELSPEC 8 // linear mel-filter bank channel outputs tomwalters@8: #define H_USER 9 // user defined sample kind tomwalters@8: #define H_DISCRETE 10 // vector quantised data tomwalters@8: #define H_PLP 11 // Perceptual Linear Prediction tomwalters@8: #define H_ANON 12 // Anonymous tomwalters@5: tomwalters@8: #define H_E 64 // has energy tomwalters@8: #define H_N 128 // absolute energy suppressed tomwalters@8: #define H_D 256 // has delta coefficients tomwalters@8: #define H_A 512 // has acceleration coefficients tomwalters@8: #define H_C 1024 // is compressed tomwalters@8: #define H_Z 2048 // has zero mean static coef. tomwalters@8: #define H_K 4096 // has CRC checksum tomwalters@8: #define H_O 8192 // has 0th cepstral coef. tomwalters@8: #define H_V 16384 // Attach vq index tomwalters@8: #define H_T 32768 // Attach delta-delta-delta index tomwalters@5: tomwalters@5: // HTK fomat is big-endian... tomwalters@5: #define ByteSwap16(n) \ tomwalters@5: ( ((((uint16_t) n) << 8) & 0xFF00) | \ tomwalters@5: ((((uint16_t) n) >> 8) & 0x00FF) ) tomwalters@5: tomwalters@5: #define ByteSwap32(n) \ tomwalters@5: ( ((((uint32_t) n) << 24) & 0xFF000000) | \ tomwalters@5: ((((uint32_t) n) << 8) & 0x00FF0000) | \ tomwalters@5: ((((uint32_t) n) >> 8) & 0x0000FF00) | \ tomwalters@5: ((((uint32_t) n) >> 24) & 0x000000FF) ) tomwalters@5: tomwalters@5: namespace aimc { tomwalters@5: class FileOutputHTK : public Module { tomwalters@5: public: tomwalters@7: /*! \brief Create a new file output for an HTK format file. Use of this tomwalters@7: * class only really makes sense for the output of 1-D frames. tomwalters@7: */ tomwalters@8: explicit FileOutputHTK(Parameters *pParam); tomwalters@7: ~FileOutputHTK(); tomwalters@5: tomwalters@7: /*! \brief Initialize the output to HTK. tomwalters@7: * \param *filename Filename of the ouptut file to be created. tomwalters@7: * If the file exists it will be overwritten tomwalters@7: * \return Returns true on success of initialization. tomwalters@7: */ tomwalters@7: bool OpenFile(const char *filename, float frame_period_ms); tomwalters@5: bool CloseFile(); tomwalters@5: virtual void Process(const SignalBank &input); tomwalters@7: private: tomwalters@5: virtual bool InitializeInternal(const SignalBank &input); tomwalters@5: virtual void ResetInternal(); tomwalters@5: tomwalters@5: float ByteSwapFloat(float d); tomwalters@5: tomwalters@7: void WriteHeader(int nelements, float sampPeriod); tomwalters@5: tomwalters@8: /*! \brief Whether initialization is done or not tomwalters@8: */ tomwalters@7: bool header_written_; tomwalters@5: tomwalters@8: /*! \brief Internal pointer to the output file tomwalters@8: */ tomwalters@7: FILE *file_handle_; tomwalters@5: tomwalters@8: /*! \brief Count of the number of samples in the file, written on close tomwalters@8: */ tomwalters@7: int sample_count_; tomwalters@5: tomwalters@5: int channel_count_; tomwalters@5: int buffer_length_; tomwalters@5: float frame_period_ms_; tomwalters@5: }; tomwalters@5: } // namespace aimc tomwalters@5: tomwalters@11: #endif // AIMC_MODULES_OUTPUT_HTK_H_ tomwalters@5: