1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
// lpcfilter.h
/******************************************************************************
*
* MiXViews - an X window system based sound & data editor/processor
*
* Copyright (c) 1993, 1994 Regents of the University of California
*
* Author: Douglas Scott
* Date: December 13, 1994
*
* Permission to use, copy and modify this software and its documentation
* for research and/or educational purposes and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation. The author reserves the right to distribute this
* software and its documentation. The University of California and the author
* make no representations about the suitability of this software for any
* purpose, and in no event shall University of California be liable for any
* damage, loss of data, or profits resulting from its use.
* It is provided "as is" without express or implied warranty.
*
******************************************************************************/
// This class contains the low-level implementation of the all-pole filter
// used for LPC filtering and resynthesis. It is used as one of the base
// classes in FormantFilter and FormantSynthesizer. This class has intimate
// knowledge of the LPCData class, and acts as an iterator of the LPCData
// frames.
#ifndef LPCFILTER_H
#ifdef __GNUG__
#pragma interface
#endif
#define LPCFILTER_H
#include "localdefs.h"
class Data;
class LPCData;
class LPC_Filter {
friend class FormantRequester;
protected:
enum InterpMode { Linear = 0x1, Computed = 0x2 };
LPC_Filter(Data *lpcdata, int nsamps, int normalize=1, Data* warp=nil);
virtual ~LPC_Filter();
boolean good() { return lpcdata != nil; } // containing classes check this
void initialize();
void reset();
float* getFrame(float* amp, float* error, float* pitch);
double filter(float* coeffs, double sig);
void advance();
int lpcSamplingRate() { return sampleRate; }
void setLPC(Data *);
void setWarp(Data *);
LPCData* getLPC() { return lpcdata; }
void setInterpMode(InterpMode);
private:
int needNewFrame() { return frameSamps == 0; }
void cacheFrames(int current);
float warpFrame(float*, float);
double standardFilter(float* coeffs, double sig);
double warpFilter(float* coeffs, double sig);
float* interpolate(double fraction);
static void linearInterp(float*, float*, float*, float, int);
static void computedInterp(float*, float*, float*, float, int);
private:
LPCData* lpcdata;
Data* amplitudes;
Data* warpData;
int doNormalize;
int doWarping;
int nPoles;
int sampleRate;
int counter;
int oldFrame, lastFrame;
double framesPerSamp;
int totalSamps, sampsToGo;
int frameSamps;
float warpFact;
float ampAdjust;
float filtAdjust;
double (LPC_Filter::*filterFunction)(float *, double);
float oldSig;
float* pastValues; // storage for allpole filter
float* coeffArray; // storage for actual frame
float* currentArray;
float* nextArray; // these are cached for optimization
private:
static void (*interpFunction)(float*, float*, float*, float, int);
};
#endif
|