git-svn-id: svn://db.shs.com.ru/libs@2 a8b55f48-bf90-11e4-a774-851b48703e85
249 lines
9.5 KiB
C++
249 lines
9.5 KiB
C++
#ifndef BRICK_MATH_H
|
|
#define BRICK_MATH_H
|
|
|
|
#include "brick_base.h"
|
|
#include "brick_manager.h"
|
|
|
|
|
|
class BrickMathBase: public BrickBase {
|
|
public: BrickMathBase(int inputs_num = 1, int outputs_num = 1, int parameters_num = 0): BrickBase(inputs_num, outputs_num, parameters_num) {lib = "Mathematic";}
|
|
};
|
|
|
|
|
|
class BrickMathAmplifier: public BrickMathBase {
|
|
MBRICK(BrickMathAmplifier)
|
|
BrickMathAmplifier(double gain = 1.): BrickMathBase(2, 1) {setGain(gain); type = "Gain"; setName(type); inNames[1] = "Gain";}
|
|
enum Inputs {Input, Gain};
|
|
void setGain(double gain) {inputs[Gain] = gain;}
|
|
virtual bool tick_body(double time) {outputs[0] = inputs[Gain] * inputs[Input]; return true;}
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathAmplifier)
|
|
|
|
|
|
class BrickMathSum: public BrickMathBase {
|
|
MBRICK(BrickMathSum)
|
|
BrickMathSum(int inputs_num = 2): BrickMathBase(inputs_num, 1, inputs_num) {
|
|
parameters.resize(inputs_num);
|
|
parameters.fill(1.);
|
|
type = "Sum";
|
|
setName(type);
|
|
parametersName_ = "Preamps";
|
|
inNames[0] = "";
|
|
io_Type = BrickBase::VariableInputs;
|
|
}
|
|
virtual void parameterChanged(int index) {inNames[index] = parameters[index].toFloat() >= 0. ? "+" : "-";}
|
|
virtual void inputsCountChanged(int count) {setParametersCount(count, 1.);}
|
|
void setPreamp(int input, double preamp) {parameters[input].setValue(preamp);}
|
|
virtual bool tick_body(double time);
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathSum)
|
|
|
|
|
|
class BrickMathSign: public BrickMathBase {
|
|
MBRICK(BrickMathSign)
|
|
BrickMathSign(): BrickMathBase(1, 1) {type = "Sign"; setName(type);}
|
|
enum Inputs {Input};
|
|
virtual bool tick_body(double time) {outputs[0] = sign(inputs[Input]); return true;}
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathSign)
|
|
|
|
|
|
class BrickMathAbsolute: public BrickMathBase {
|
|
MBRICK(BrickMathAbsolute)
|
|
BrickMathAbsolute(): BrickMathBase(1, 1) {type = "Abs"; setName(type);}
|
|
enum Inputs {Input};
|
|
virtual bool tick_body(double time) {outputs[0] = fabs(inputs[Input]); return true;}
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathAbsolute)
|
|
|
|
|
|
class BrickMathMultiply: public BrickMathBase {
|
|
MBRICK(BrickMathMultiply)
|
|
BrickMathMultiply(int inputs_num = 2): BrickMathBase(inputs_num, 1) {type = "Multiply"; setName(type); inNames[0] = ""; io_Type = BrickBase::VariableInputs;}
|
|
virtual bool tick_body(double time);
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathMultiply)
|
|
|
|
|
|
class BrickMathDivide: public BrickMathBase {
|
|
MBRICK(BrickMathDivide)
|
|
BrickMathDivide(): BrickMathBase(2, 1) {type = "Divide"; setName(type); inNames[0] = "Divident"; inNames[1] = "Divider"; inputs[1] = 2.;}
|
|
enum Inputs {Input, Divider};
|
|
virtual bool tick_body(double time) {if (inputs[Divider] == 0.) return false; outputs[0] = inputs[Input] / inputs[Divider]; return true;}
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathDivide)
|
|
|
|
|
|
class BrickMathPower: public BrickMathBase {
|
|
MBRICK(BrickMathPower)
|
|
BrickMathPower(double power = 2.): BrickMathBase(2, 1) {setPower(power); type = "Power"; setName(type); inNames[1] = "Power";}
|
|
enum Inputs {Input, Power};
|
|
void setPower(double power) {inputs[Power] = power;}
|
|
virtual bool tick_body(double time) {outputs[0] = pow(inputs[Input], inputs[Power]); return true;}
|
|
private:
|
|
double p;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathPower)
|
|
|
|
|
|
class BrickMathIntegral: public BrickMathBase {
|
|
MBRICK(BrickMathIntegral)
|
|
BrickMathIntegral(double initial = 0.);
|
|
enum Inputs {Input, Enable, Reset, Initial};
|
|
virtual void started();
|
|
virtual void reset_specified() {KF.fromTF(TF); KF.X[0] = inputs[Initial];}
|
|
virtual void parameterChanged(int index) {KF.setMethod((PIMathSolver::Method)parameters[0].toInt());}
|
|
virtual bool tick_body(double time);
|
|
protected:
|
|
PIMathSolver KF;
|
|
TransferFunction TF;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathIntegral)
|
|
|
|
|
|
class BrickMathIntegralSaturated: public BrickMathIntegral {
|
|
MBRICK(BrickMathIntegralSaturated)
|
|
BrickMathIntegralSaturated(double initial = 0.): BrickMathIntegral(initial) {type = "IntegralSaturated"; setName(type); setInputsCount(6); inputs[Min] = -1.; inputs[Max] = 1.; inNames[4] = "Min"; inNames[5] = "Max";}
|
|
enum Inputs {Input, Enable, Reset, Initial, Min, Max};
|
|
virtual bool tick_body(double time) {BrickMathIntegral::tick_body(time); if (KF.X[0] < inputs[Min]) {KF.X[0] = inputs[Min]; outputs[0] = KF.X[0];} if (KF.X[0] > inputs[Max]) {KF.X[0] = inputs[Max]; outputs[0] = KF.X[0];} return true;}
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathIntegralSaturated)
|
|
|
|
|
|
class BrickMathDerivate: public BrickMathBase {
|
|
MBRICK(BrickMathDerivate)
|
|
BrickMathDerivate(): BrickMathBase(1, 1) {v = 0.; type = "Derivate"; setName(type);}
|
|
virtual bool tick_body(double time);
|
|
private:
|
|
double v;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathDerivate)
|
|
|
|
|
|
class BrickMathDeadZone: public BrickMathBase {
|
|
MBRICK(BrickMathDeadZone)
|
|
BrickMathDeadZone(double zone = 1.): BrickMathBase(2, 2) {setZone(zone); type = "DeadZone"; setName(type); inNames[1] = "Zone"; outNames[1] = "In Zone";}
|
|
enum Inputs {Input, Zone};
|
|
enum Outputs {Output, InZone};
|
|
void setZone(double zone) {inputs[Zone] = zone;}
|
|
virtual bool tick_body(double time);
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathDeadZone)
|
|
|
|
|
|
class BrickMathSaturation: public BrickMathBase {
|
|
MBRICK(BrickMathSaturation)
|
|
BrickMathSaturation(double min = -1., double max = 1.): BrickMathBase(3, 3) {setRange(min, max); type = "Saturation"; setName(type); inNames[1] = "Min"; inNames[2] = "Max"; outNames[1] = "< min"; outNames[2] = "> max";}
|
|
enum Inputs {Input, Min, Max};
|
|
enum Outputs {Output, InMin, InMax};
|
|
void setRange(double min, double max) {inputs[Max] = max; inputs[Min] = min;}
|
|
virtual bool tick_body(double time);
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathSaturation)
|
|
|
|
|
|
class BrickMathQuantize: public BrickMathBase {
|
|
MBRICK(BrickMathQuantize)
|
|
BrickMathQuantize(double step = 1.): BrickMathBase(2, 1) {setStep(step); type = "Quantize"; setName(type); inNames[1] = "Step";}
|
|
enum Inputs {Input, Step};
|
|
void setStep(double step) {inputs[Step] = step;}
|
|
virtual bool tick_body(double time) {outputs[0] = piRound(inputs[Input] / inputs[Step]) * inputs[Step]; return true;}
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathQuantize)
|
|
|
|
|
|
class BrickMathRelay: public BrickMathBase {
|
|
MBRICK(BrickMathRelay)
|
|
BrickMathRelay(double size = 1., double active = 1., double inactine = 0.): BrickMathBase(4, 1) {setParameters(size, active, inactine); v = 0.; type = "Relay"; setName(type); inNames[1] = "Size"; inNames[2] = "Active Value"; inNames[3] = "Inactive Value";}
|
|
virtual void reset_specified() {v = 0.;}
|
|
enum Inputs {Input, Size, ActiveValue, InactiveValue};
|
|
void setParameters(double size, double active, double inactine) {inputs[Size] = size; inputs[ActiveValue] = active; inputs[InactiveValue] = inactine;}
|
|
virtual bool tick_body(double time);
|
|
private:
|
|
double v;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathRelay)
|
|
|
|
|
|
class BrickMathDelayTicks: public BrickMathBase {
|
|
MBRICK(BrickMathDelayTicks)
|
|
BrickMathDelayTicks(uint ticks = 1): BrickMathBase(1, 1, 1) {setDelay(ticks); type = "DelayTicks"; setName(type); paramNames[0] = "Ticks"; parameters[0].setValue(1);}
|
|
virtual void reset_specified() {v.assign(v.size(), 0.);}
|
|
void setDelay(int ticks) {parameters[0].setValue(ticks); v.resize(ticks); v.assign(ticks, 0.);}
|
|
virtual bool tick_body(double time);
|
|
private:
|
|
PIDeque<double> v;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathDelayTicks)
|
|
|
|
|
|
class BrickMathDelaySeconds: public BrickMathBase {
|
|
MBRICK(BrickMathDelaySeconds)
|
|
BrickMathDelaySeconds(double secs = 1.): BrickMathBase(1, 1, 1) {setDelay(secs); type = "DelaySeconds"; setName(type); paramNames[0] = "Seconds"; parameters[0].setValue(1.);}
|
|
virtual void reset_specified() {v.assign(v.size(), 0.);}
|
|
void setDelay(double secs) {parameters[0].setValue(secs);}
|
|
virtual bool tick_body(double time);
|
|
private:
|
|
PIDeque<double> v;
|
|
uint t;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathDelaySeconds)
|
|
|
|
|
|
class BrickMathThreshold: public BrickMathBase {
|
|
MBRICK(BrickMathThreshold)
|
|
BrickMathThreshold(double value = 0.5): BrickMathBase(2, 1) {setThreshold(value); type = "Threshold"; setName(type); inNames[1] = "Threshold";}
|
|
enum Inputs {Input, Threshold};
|
|
void setThreshold(double value) {inputs[Threshold] = value;}
|
|
virtual bool tick_body(double time) {outputs[0] = (inputs[Input] >= inputs[Threshold] ? 1. : 0.); return true;}
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathThreshold)
|
|
|
|
|
|
class BrickMathFunction: public BrickMathBase {
|
|
MBRICK(BrickMathFunction)
|
|
BrickMathFunction();
|
|
virtual void parameterChanged(int index);
|
|
virtual bool tick_body(double time);
|
|
private:
|
|
PIEvaluator eval;
|
|
complexd res;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathFunction)
|
|
|
|
|
|
class BrickMathFFT: public BrickMathBase {
|
|
MBRICK(BrickMathFFT)
|
|
BrickMathFFT();
|
|
virtual bool tick_body(double time);
|
|
virtual void started() {t = 0;}
|
|
virtual void reset_specified() {t = 0;}
|
|
private:
|
|
PIFFT fft;
|
|
PIVector<complexd> v, o;
|
|
uint t;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathFFT)
|
|
|
|
|
|
class BrickMathCopy: public BrickMathBase {
|
|
MBRICK(BrickMathCopy)
|
|
BrickMathCopy(): BrickMathBase(1, 2) {type = "Copy"; setName(type); outNames[0] = "0"; io_Type = VariableOutputs;}
|
|
virtual bool tick_body(double time) {for (int i = 0; i < outputs_count; ++i) outputs[i] = inputs[0]; return true;}
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathCopy)
|
|
|
|
|
|
class BrickMathBessel: public BrickMathBase {
|
|
MBRICK(BrickMathBessel)
|
|
BrickMathBessel(): BrickMathBase(1, 1, 2) {type = "Bessel"; setName(type); paramNames[0] = "Kind"; paramNames[1] = "Order"; setParameterValue(0, 0); setParameterValue(1, 0);}
|
|
virtual void parameterChanged(int index);
|
|
virtual bool tick_body(double time);
|
|
private:
|
|
int o, k;
|
|
};
|
|
ADD_NEW_TO_COLLECTION(Mathematic, BrickMathBessel)
|
|
|
|
|
|
#endif // BRICK_MATH_H
|