00001
00002
00003
00004
00005
00006
00007 #ifndef CSL_LPC_H
00008 #define CSL_LPC_H
00009
00010 #include "CSL_Core.h"
00011 #include "SoundFile.h"
00012 #include "Filters.h"
00013 #include "Spectral.h"
00014 #include "Envelope.h"
00015
00016 namespace csl {
00017
00018
00019
00020
00021
00022
00023 typedef struct lpc_header {
00024 unsigned int keyword;
00025 unsigned int filesize;
00026 float duration;
00027 unsigned int numframes;
00028 unsigned int order;
00029 unsigned int windowSize;
00030 unsigned int hopSize;
00031 double preEmphasis;
00032 } CSL_LPC_HEADER;
00033
00034
00035
00036 typedef struct frame_header {
00037 unsigned int keyword;
00038 unsigned int framesize;
00039 unsigned int order;
00040 unsigned int windowSize;
00041 float rmsamp;
00042 float hifreq;
00043 float lofreq;
00044 float freqest1;
00045 float freqest2;
00046 unsigned int zeroes;
00047 float smoothfreq;
00048 float noisiness;
00049 float resid;
00050 float formant1;
00051 float formant2;
00052 float centroid;
00053
00054
00055 unsigned int MIDIKey;
00056 unsigned int isTransition;
00057
00058 } CSL_LPC_FRAME;
00059
00060 #define CSL_LPC_LKEY 0x55120942 // Magic number for files
00061 #define CSL_LPC_FKEY 0x55120943 // Magic number for frames
00062 #define CSL_LPC_MAXPOLES 150 // max pre-allocated frame size
00063 #define CSL_HPS_DEPTH 10 // size of harmonic product spectrum reduction
00064
00070
00071 class LPCAnalyzer : public Effect {
00072 public:
00073 LPCAnalyzer(UnitGenerator & in, unsigned size = CGestalt::blockSize(), unsigned hopSize = CGestalt::blockSize(), unsigned order = 50);
00074 ~LPCAnalyzer();
00076 unsigned windowSize() { return mWindowSize; }
00077 unsigned hopSize() { return mHopSize; }
00078 unsigned LPCOrder() { return mLPCOrder; }
00079 Buffer getCoefficients() { return mLPCCoefficients; }
00080 Buffer getResidual() { return mLPCResidual; }
00081 double getError() { return mPredErr; }
00082
00083 void setFileNames(char * coeff, char * resid);
00084 void setPreEmphasis(double factor) { mPreEmphasis = factor; }
00085 void setBWExpansion(double factor) { mBWExpansion = factor; }
00086 void closeFiles();
00087 void setOverwrite(bool reuse) { mOverwriteOutput = reuse; }
00088 void setUseWindow(bool use) { mUseWindow = use; }
00090 void nextBuffer(Buffer& outputBuffer, unsigned outBufNum) throw (CException);
00091
00092 protected:
00093 unsigned mWindowSize;
00094 unsigned mHopSize;
00095 unsigned mLPCOrder;
00096 double mPredErr;
00097 double mPreEmphasis;
00098 double mBWExpansion;
00099 bool mOverwriteOutput;
00100 bool mUseWindow;
00101
00102 Buffer mTempBuffer;
00103 Buffer mWindowBuffer;
00104 Buffer mLPCCoefficients;
00105 Buffer mFilterCoefficients;
00106 Buffer mFilterInput;
00107 Buffer mPCCoefficients;
00108 Buffer mLPCResidual;
00109
00110 RingBuffer mRing;
00111
00112 Butter * mLoPass;
00113 Butter * mHiPass;
00114 FFT * mFFT;
00115
00116 FILE * mCoeffFile;
00117 SoundFile * mResidFile;
00118
00119 };
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00133 class LPCFilter : public Effect, public Scalable {
00134 public:
00135 LPCFilter(UnitGenerator & in, char * lpcFile);
00136 LPCFilter(UnitGenerator & in, Buffer & lpcData, unsigned size, unsigned hopSize, unsigned order);
00137 ~LPCFilter();
00138
00139 unsigned windowSize() { return mWindowSize; }
00140 unsigned hopSize() { return mHopSize; }
00141 unsigned LPCOrder() { return mLPCOrder; }
00142 double deEmphasis() { return mDeEmphasis; }
00143
00144 Envelope * timeEnvelope() { return mTimeEnvelope; }
00145 void setTimeEnvelope(Envelope * env) { mTimeEnvelope = env; }
00146
00147 void nextBuffer(Buffer& outputBuffer, unsigned outBufNum) throw (CException);
00148
00149 protected:
00150 unsigned mWindowSize;
00151 unsigned mHopSize;
00152 unsigned mLPCOrder;
00153 double mDeEmphasis;
00154
00155 Envelope * mTimeEnvelope;
00156
00157 FILE * mLPCFile;
00158 Buffer mLPCBuffer;
00159
00160 Buffer mTempBuffer;
00161
00162 };
00163
00164 }
00165
00166 #endif