view Source/Decoder.h @ 13:989865d55c73 tip

Commit.
author martinm_home <martin.morrell@eecs.qmul.ac.uk>
date Thu, 27 Sep 2012 23:30:29 +0100
parents 87dc3d84c120
children
line wrap: on
line source
/*
 *  Decoder.h
 *  ClassicAmbiDec
 *
 *  Created by Martin Morrell on 14/06/2012.
 *  Copyright 2012 Queen Mary University of London. All rights reserved.
 *
 */


class Decoder
{	
	friend class MyEditor;
public:
    Decoder();
    
    //Transforms & Zoom
	double Rotate; //+/-180 degrees
	double Tilt; //+/-180 degrees
	double Tumble; //+/-180 degrees
	double Zoom; //+/-100
	int    ZoomMethod; //4 positions
    
    //Decoder Speaker Layout
    int    decoderMode; //Decoder mode
    int    channelOrder; //Natural or 5.1 ordering
    int    mode5x; //Hidden mode for 5.x decoders accessed by programs
    
    //Front Stereo Speaker Decoding & Reverb
	double Width; //0-90 degrees
	double Pattern; //0-1 Omni amount
	int    Mode; //0 or 1 for xy or ms
	double RearVerb; //0-24dB
	double HiVerb; //0-24dB
	
    //Centre Speaker Decoding
    double centrePattern; //Centre mic pattern
    double centreGain; //Centre mic gain
    
    //Subwoofer Signal
    double subGain; //Subwoofer gain
    
    //Surround Speaker Decoding
    int    surMode; //Rear mics mode
    double surPattern; //Rear mics pattern
    double surWidth; //Rear mics width
    double surGain; //Rear mics gain
    
    //Filter Code
    int Fs; //Sample Rate
    int Fc; //Crossover Frequency
    void   clearFilter(); //Clears the previous filter values
    void filterCoefs(); //Calculates the filter coefficients
    
	//Overall Decoding Functions
    double output[6]; //Final Output
    int processDecoder(double &w, double &x, double &y, double &z); //Called fucntion to do the decoding
   
    
	
private:
    //Conversion Functions
	double degRad(double angle); //Convert degreesto radians
	double radDeg(double angle); //Convert radians to degrees
	
	//Sound Field Rotations
	void rotateField(double &x, double &y);
	void tiltField(double &x, double &y);
	void tumbleField(double &x, double &y);
	
	//Zoom Methods
	void dominanceZoom(double &w, double &x, double &y, double &z);
	void pressZoom(double &w, double &x, double &y, double &z);
	void pushZoom(double &w, double &x, double &y, double &z);
	void focusZoom(double &w, double &x, double &y, double &z);
	
	//Stereo Decoders
	void xyDecode(double &w, double &x, double &y, double &z);
	void msDecode(double &w, double &x, double &y, double &z);
	
	//Reverbs
	void rearVerb(double &w, double &x, double &y, double &z);
	void hiVerb(double &w, double &x, double &y, double &z);
    
    //Surround
    void centreMic(double &w, double &x);
    void xySurDecode(double &w, double &x, double &y, double &z);
	void msSurDecode(double &w, double &x, double &y, double &z);
    
    //Filter Code
    void filterLF(double &w);
    void filterHF(double &w, double &x, double &y, double &z);
    double bLF[3]; //b Coefficients for Lower Frequency Band
    double bHF[3]; //b Coefficients for Higher Frequency Band
    double a[3]; //a Coefficients
    double prevInS[2]; //Previous Input LF Samples
    double prevOutS[2]; //Previous Output LF Samples
    double prevInw[2]; //Previous Input w Samples
    double prevOutw[2]; //Previous Output w Samples
    double prevInx[2]; //Previous Input x Samples
    double prevOutx[2]; //Previous Output x Samples
    double prevIny[2]; //Previous Input y Samples
    double prevOuty[2]; //Previous Output y Samples
    double prevInz[2]; //Previous Input z Samples
    double prevOutz[2]; //Previous Output z Samples
    
    //Decoder Types
    void monoDecoder(double &w, double &x, double &y, double &z); //Decode to mono, implemented but not used
	void stereoDecoder(double &w, double &x, double &y, double &z); //Decode to stereo
    void twoOneDecoder(double &w, double &x, double &y, double &z); //Decode to stereo
    void quadDecoder(double &w, double &x, double &y, double &z); //Decode to LRCS
    void fiveDecoder(double &w, double &x, double &y, double &z); //Decode to 5.0
	void fiveOneDecoder(double &w, double &x, double &y, double &z); //Decode to 5.1
    void heller1(double &w, double &x, double &y, double &z);
    void heller2(double &w, double &x, double &y, double &z);
    double outputL; //Left output
    double outputR; //Right output
    double outputC; //Centre output
    double outputS; //Subwoofer output
    double outputSL; //Surround Left output
    double outputSR; //Surround Right output
};