Branch data Line data Source code
1 : : /*
2 : : * amplifier.cpp - amplifier class implementation
3 : : *
4 : : * Copyright (C) 2004, 2008, 2010 Stefan Jahn <stefan@lkcc.org>
5 : : * Copyright (C) 2008 Michael Margraf <Michael.Margraf@alumni.TU-Berlin.DE>
6 : : *
7 : : * This is free software; you can redistribute it and/or modify
8 : : * it under the terms of the GNU General Public License as published by
9 : : * the Free Software Foundation; either version 2, or (at your option)
10 : : * any later version.
11 : : *
12 : : * This software is distributed in the hope that it will be useful,
13 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : : * GNU General Public License for more details.
16 : : *
17 : : * You should have received a copy of the GNU General Public License
18 : : * along with this package; see the file COPYING. If not, write to
19 : : * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 : : * Boston, MA 02110-1301, USA.
21 : : *
22 : : * $Id$
23 : : *
24 : : */
25 : :
26 : : /*! \file amplifier.cpp
27 : : \brief amplifier class implementation
28 : :
29 : : An ideal amplifier increases signal strength from input
30 : : to output and blocks all signals flowing into the output.
31 : : */
32 : :
33 : : #if HAVE_CONFIG_H
34 : : # include <config.h>
35 : : #endif
36 : :
37 : : #include "component.h"
38 : : #include "amplifier.h"
39 : :
40 : : using namespace qucs;
41 : :
42 : : /*! Constructor */
43 : 0 : amplifier::amplifier () : circuit (2) {
44 : 0 : type = CIR_AMPLIFIER;
45 : 0 : }
46 : :
47 : : /*! Initialize S-parameter simulation.
48 : : An ideal amplifier is characterized by the following
49 : : S-matrix
50 : : \f[
51 : : S=\begin{pmatrix}
52 : : \dfrac{Z_1-Z_0}{Z_1+Z_0} & 0 \\
53 : : \dfrac{4\cdot Z_0\cdot\sqrt{Z_1\cdot Z_2}\cdot G}{(Z_1+Z_0)\cdot(Z_2+Z_0)}
54 : : & \dfrac{Z_2-Z_0}{Z_2+Z_0}
55 : : \end{pmatrix}
56 : : \f]
57 : : With \f$Z_1\f$ and \f$Z_2\f$ the impedance of the port 1 and 2 and
58 : : \f$G\f$ the gain.
59 : : */
60 : 0 : void amplifier::initSP (void) {
61 : 0 : nr_double_t g = getPropertyDouble ("G");
62 : 0 : nr_double_t z1 = getPropertyDouble ("Z1");
63 : 0 : nr_double_t z2 = getPropertyDouble ("Z2");
64 : :
65 : 0 : allocMatrixS ();
66 : :
67 [ # # ]: 0 : setS (NODE_1, NODE_1, (z1 - z0) / (z1 + z0));
68 [ # # ]: 0 : setS (NODE_1, NODE_2, 0);
69 [ # # ]: 0 : setS (NODE_2, NODE_2, (z2 - z0) / (z2 + z0));
70 [ # # ]: 0 : setS (NODE_2, NODE_1, 4 * z0 * std::sqrt (z1 * z2) * g / (z1 + z0) / (z2 + z0));
71 : 0 : }
72 : :
73 : 0 : void amplifier::calcNoiseSP (nr_double_t) {
74 : 0 : nr_double_t g = getPropertyDouble ("G");
75 : 0 : nr_double_t z2 = getPropertyDouble ("Z2");
76 : 0 : nr_double_t NF = getPropertyDouble ("NF");
77 [ # # ]: 0 : setN (NODE_1, NODE_1, 0);
78 [ # # ]: 0 : setN (NODE_2, NODE_2, 4 * z0 * z2 * sqr (g) * (NF - 1) / sqr (z2 + z0));
79 [ # # ]: 0 : setN (NODE_1, NODE_2, 0);
80 [ # # ]: 0 : setN (NODE_2, NODE_1, 0);
81 : 0 : }
82 : :
83 : : /*! DC model initialization.
84 : : An ideal amplifier is characterized by the following
85 : : Y-matrix:
86 : : \f[
87 : : \begin{pmatrix}
88 : : \dfrac{1}{Z_1} & 0 \\
89 : : \dfrac{-2}{\sqrt{Z_1\cdot Z_2}} & \dfrac{1}{Z_2}
90 : : \end{pmatrix}
91 : : \f]
92 : : With \f$Z_1\f$ and \f$Z_2\f$ the impedance of the port 1 and 2 and
93 : : \f$G\f$ the gain.
94 : : */
95 : 0 : void amplifier::initDC (void) {
96 : 0 : nr_double_t g = getPropertyDouble ("G");
97 : 0 : nr_double_t z1 = getPropertyDouble ("Z1");
98 : 0 : nr_double_t z2 = getPropertyDouble ("Z2");
99 : :
100 : 0 : allocMatrixMNA ();
101 : :
102 [ # # ]: 0 : setY (NODE_1, NODE_1, 1 / z1);
103 [ # # ]: 0 : setY (NODE_1, NODE_2, 0);
104 [ # # ]: 0 : setY (NODE_2, NODE_1, -2 * g / std::sqrt (z1 * z2));
105 [ # # ]: 0 : setY (NODE_2, NODE_2, 1 / z2);
106 : 0 : }
107 : :
108 : : /*! AC model initialization.
109 : :
110 : : Idem than DC model.
111 : : */
112 : 0 : void amplifier::initAC (void) {
113 : 0 : initDC ();
114 : 0 : }
115 : :
116 : 0 : void amplifier::calcNoiseAC (nr_double_t) {
117 : 0 : nr_double_t g = getPropertyDouble ("G");
118 : 0 : nr_double_t z2 = getPropertyDouble ("Z2");
119 : 0 : nr_double_t NF = getPropertyDouble ("NF");
120 [ # # ]: 0 : setN (NODE_1, NODE_1, 0);
121 [ # # ]: 0 : setN (NODE_2, NODE_2, 4 * sqr (g) * (NF - 1) / z2);
122 [ # # ]: 0 : setN (NODE_1, NODE_2, 0);
123 [ # # ]: 0 : setN (NODE_2, NODE_1, 0);
124 : 0 : }
125 : :
126 : : /*! Transient model initialization.
127 : :
128 : : Idem than DC model.
129 : : */
130 : 0 : void amplifier::initTR (void) {
131 : 0 : initDC ();
132 : 0 : }
133 : :
134 : : // properties
135 : : PROP_REQ [] = {
136 : : { "G", PROP_REAL, { 10, PROP_NO_STR }, PROP_MIN_VAL (1) },
137 : : PROP_NO_PROP };
138 : : PROP_OPT [] = {
139 : : { "Z1", PROP_REAL, { 50, PROP_NO_STR }, PROP_POS_RANGE },
140 : : { "Z2", PROP_REAL, { 50, PROP_NO_STR }, PROP_POS_RANGE },
141 : : { "NF", PROP_REAL, { 1, PROP_NO_STR }, PROP_MIN_VAL (1) },
142 : : PROP_NO_PROP };
143 : : struct define_t amplifier::cirdef =
144 : : { "Amp", 2, PROP_COMPONENT, PROP_NO_SUBSTRATE, PROP_LINEAR, PROP_DEF };
|