File: lpcfilter.h

package info (click to toggle)
mixviews 1.10-3
  • links: PTS
  • area: main
  • in suites: hamm
  • size: 2,440 kB
  • ctags: 6,314
  • sloc: cpp: 31,647; ansic: 2,100; makefile: 1,782; sh: 17
file content (94 lines) | stat: -rw-r--r-- 3,198 bytes parent folder | download | duplicates (4)
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