00001 #ifndef CSignal_HH 00002 #define CSignal_HH 00003 00004 #include <vector> 00005 #include <cmath> 00006 #include <sstream> 00007 00008 namespace RLC { 00009 class CNetworksArea; 00010 } 00014 class CWave{ 00015 public: 00016 virtual ~CWave(){}; 00017 virtual double time(double t)=0; 00018 }; 00022 class CSinWave:public CWave{ 00023 protected: 00024 double m_omega; 00025 double m_amplitude; 00026 double m_fi0; 00027 public: 00028 CSinWave(double a, double omega, double fi0):m_amplitude(a),m_omega(omega),m_fi0(fi0){}; 00029 double time(double t){ 00030 return m_amplitude * sin(m_omega*t+m_fi0); 00031 } 00032 void setAmplitude(double a){m_amplitude=a;} 00033 void setOmega(double o){m_omega=o;} 00034 void setFi(double fi0){m_fi0=fi0;} 00035 double getAmplitude(){return m_amplitude;} 00036 double getOmega(){return m_omega;} 00037 double getFi(){return m_fi0;} 00038 }; 00044 class CLineWave:public CWave{ 00045 protected: 00046 double m_amplitude; 00047 public: 00048 CLineWave(double a):m_amplitude(a){}; 00049 double time(double t){ 00050 return m_amplitude; 00051 } 00052 void setAmplitude(double a){m_amplitude=a;} 00053 double getAmplitude(){return m_amplitude;} 00054 }; 00055 00061 class CSignal 00062 { 00063 protected: 00064 std::vector<CWave *> m_waves; 00065 std::string m_description; 00066 std::string m_unit; 00067 00068 public: 00069 CSignal(std::string text="",std::string unit=""):m_description(text),m_unit(unit) {}; 00070 ~CSignal(){ 00071 for(int i=0;i<m_waves.size();++i) 00072 delete m_waves[i]; 00073 }; 00074 void addWave(double a, double omega, double fi0){ 00075 if(omega!=0) 00076 m_waves.push_back(new CSinWave(a,omega,fi0)); 00077 else 00078 m_waves.push_back(new CLineWave(a)); 00079 }; 00080 double time(double t){ 00081 double super_position=0; 00082 for(int i=0;i<m_waves.size();++i) 00083 super_position+=m_waves[i]->time(t); 00084 return super_position; 00085 } 00086 void clear(){ 00087 for(int i=0;i<m_waves.size();++i) 00088 delete m_waves[i]; 00089 } 00090 std::string getDescription(){return m_description;} 00091 std::string getText(){return m_description;} 00092 std::string getUnit(){return m_unit;} 00093 std::string getEq(){ 00094 std::string tmp; 00095 std::stringstream x; 00096 for(int i=0;i<m_waves.size();++i) 00097 { 00098 CSinWave *p; 00099 CLineWave *q; 00100 if(p=dynamic_cast<CSinWave *> (m_waves[i])) 00101 x<<p->getAmplitude()<<"*sin("<<p->getOmega()<<"t+"<<p->getFi()<<")"; 00102 else if(q=dynamic_cast<CLineWave *> (m_waves[i])) 00103 x<<q->getAmplitude(); 00104 x<<"+"; 00105 } 00106 x>>tmp; 00107 return tmp; 00108 } 00109 }; 00110 00111 #endif