00001 #ifndef DOUBLEEXPONENTIALSPIKERESPONSE_H_
00002 #define DOUBLEEXPONENTIALSPIKERESPONSE_H_
00003
00004 #include "FiniteSpikeResponse.h"
00005
00006 class DoubleExponentialSpikeResponse : public FiniteSpikeResponse
00007 {
00008
00009 SIMOBJECT( DoubleExponentialSpikeResponse, AdvancePhase::SpikeDriven )
00010
00011 public:
00012 DoubleExponentialSpikeResponse(
00013 const float tau1=1e-3,
00014 const float tau2=3e-3
00015 ): FiniteSpikeResponse(), tau1(tau1), tau2(tau2)
00016 { };
00017
00018 virtual ~DoubleExponentialSpikeResponse()
00019 { };
00020
00022 float tau1;
00023
00025 float tau2;
00026
00027
00028 virtual int adjust( double dt );
00029
00030
00031 virtual int reset( double dt );
00032
00033 virtual int advance(AdvanceInfo const &);
00034
00035 virtual int spikeHit( spikeport_t port, SpikeEvent const& spike );
00036
00038
00041 virtual int psrLength(double dt) const;
00042
00043 private:
00044
00045 inline double C1( double const& delta ) {
00046 return exp( -delta/tau1 );
00047 };
00048
00049 inline double C2( double const& dt ) {
00050 return exp( - dt*(1.0/tau1+1.0/tau2) ) * ( exp(dt/tau2) - exp(dt/tau1) ) * pow( tau1 / tau2, (tau1+tau2)/(tau1-tau2) ) /
00051 ( pow( tau1/tau2, tau1/( tau1-tau2 ) ) - pow( tau1/tau2 , tau2/(tau1-tau2) ) );
00052 };
00053
00054 inline double C3( double const& delta ) {
00055 return exp( - delta/tau2 );
00056 };
00057
00059 double c1,c2,c3;
00060
00062 double x;
00063 };
00064
00065
00066 #endif