/**************************************************************************** ** Qucs Attenuator Synthesis ** attenuatorfunc.cpp ** ** since 2006/6/14 ** ** ** ** ** *****************************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include "attenuatorfunc.h" #include QUCS_Att::QUCS_Att(){} QUCS_Att::~QUCS_Att(){} int QUCS_Att::Calc(tagATT *ATT) { double Lmin, L, A; L = pow(10, ATT->Attenuation / 10); A = (L + 1) / (L - 1); if(ATT->Zin > ATT->Zout) { Lmin = (2 * ATT->Zin / ATT->Zout) - 1 + 2 * sqrt(ATT->Zin / ATT->Zout * (ATT->Zin / ATT->Zout - 1)); } else { Lmin = (2 * ATT->Zout / ATT->Zin) - 1 + 2 * sqrt(ATT->Zout / ATT->Zin * (ATT->Zout / ATT->Zin - 1)); } ATT->MinimumATT = 10 * log10(Lmin); if(ATT->MinimumATT > ATT->Attenuation) { return -1; } else { switch(ATT->Topology) { case PI_TYPE: { ATT->R2 = ((L - 1) / 2) * sqrt(ATT->Zin * ATT->Zout / L); ATT->R1 = 1 / (((A / ATT->Zin)) - (1 / ATT->R2)); ATT->R3 = 1 / (((A / ATT->Zout)) - (1 / ATT->R2)); break; } case TEE_TYPE: { ATT->R2 = (2 * sqrt(L * ATT->Zin * ATT->Zout)) / (L - 1); ATT->R1 = ATT->Zin * A - ATT->R2; ATT->R3 = ATT->Zout * A - ATT->R2; break; } case BRIDGE_TYPE: { L = pow(10, ATT->Attenuation / 20); ATT->R1 = ATT->Zin * (L - 1); ATT->R2 = ATT->Zin / (L - 1); break; } } return 0; } } QString* QUCS_Att::createSchematic(tagATT *ATT) { // create the Qucs schematic QString *s = new QString("Topology) { case PI_TYPE: *s += QString("\n").arg(ATT->R1); *s += QString("\n").arg(ATT->R2); *s += QString("\n").arg(ATT->R3); *s += "\n"; *s += "\n"; *s += "\n"; *s += "\n"; *s += "<240 130 280 130 \"\" 0 0 0 \"\">\n"; *s += "<140 130 180 130 \"\" 0 0 0 \"\">\n"; *s += "\n"; *s += "\n"; *s += "\n"; *s += "\n"; *s += QString("\n").arg(ATT->Attenuation); *s += QString("\n").arg(ATT->Zout); *s += QString("\n").arg(ATT->Zin); *s += "\n"; break; case TEE_TYPE: *s += QString("\n").arg(ATT->R1); *s += QString("\n").arg(ATT->R2); *s += QString("\n").arg(ATT->R3); *s += "\n"; *s +="\n"; *s += "\n"; *s += "<140 130 150 130 \"\" 0 0 0 \"\">\n"; *s += "<270 130 280 130 \"\" 0 0 0 \"\">\n"; *s += "\n"; *s += "\n"; *s += "\n"; *s += "\n"; *s += QString("\n").arg(ATT->Attenuation); *s += QString("\n").arg(ATT->Zout); *s += QString("\n").arg(ATT->Zin); *s += "\n"; break; case BRIDGE_TYPE: *s += QString("\n").arg(ATT->R1); *s += QString("\n").arg(ATT->Zin); *s += QString("\n").arg(ATT->Zout); *s += QString("\n").arg(ATT->R2); *s += "\n"; *s += "\n"; *s += "\n"; *s += "<240 130 280 130 \"\" 0 0 0 \"\">\n"; *s += "<140 130 180 130 \"\" 0 0 0 \"\">\n"; *s += "<180 190 240 190 \"\" 0 0 0 \"\">\n"; *s += "\n"; *s += "\n"; *s += "\n"; *s += "\n"; *s += QString("\n").arg(ATT->Attenuation); *s += QString("\n").arg(ATT->Zout); *s += QString("\n").arg(ATT->Zin); *s += "\n"; break; } return s; }