(instr)
| 1600 | return instr |
| 1601 | |
| 1602 | def _doPyNoise(instr): |
| 1603 | s2f = 2*sp.pi*sp.I*sp.Symbol('f', positive=True) |
| 1604 | if instr.numeric == True: |
| 1605 | s2f = float2rational(sp.N(s2f)) |
| 1606 | for name in instr.circuit.indepVars: |
| 1607 | if 'noise' in list(instr.circuit.elements[name].params.keys()): |
| 1608 | value = instr.circuit.elements[name].params['noise'] |
| 1609 | if instr.substitute == True: |
| 1610 | value = fullSubs(value, instr.parDefs) |
| 1611 | if instr.numeric == True: |
| 1612 | value = float2rational(sp.N(value)) |
| 1613 | instr.snoiseTerms[name] = value |
| 1614 | instr.gainType = 'gain' |
| 1615 | instr = _makeAllMatrices(instr, reduce=True, inductors=False) |
| 1616 | den = _doPyDenom(instr) |
| 1617 | den = assumeRealParams(den.denom[0].xreplace({ini.laplace: s2f})) |
| 1618 | den_sq = sp.Abs(den * sp.conjugate(den)) |
| 1619 | if instr.source != [None, None] and instr.source != None: |
| 1620 | instr = _doPyNumer(instr) |
| 1621 | num = assumeRealParams(instr.numer[-1].xreplace({ini.laplace: s2f})) |
| 1622 | if num != None: |
| 1623 | sl_num_sq = sp.Abs(num * sp.conjugate(num)) |
| 1624 | instr.gainType = 'vi' |
| 1625 | instr.dataType = 'noise' |
| 1626 | instr = _makeAllMatrices(instr, reduce=False, inductors=False) |
| 1627 | # Save full matrices |
| 1628 | M_noise = instr.M |
| 1629 | Iv_noise = instr.Iv |
| 1630 | Dv_noise = instr.Dv |
| 1631 | onoise = 0 |
| 1632 | inoise = 0 |
| 1633 | for src in instr.snoiseTerms.keys(): |
| 1634 | if src not in instr.onoiseTerms.keys(): |
| 1635 | instr.onoiseTerms[src] = [] |
| 1636 | instr.inoiseTerms[src] = [] |
| 1637 | Iv = Iv_noise |
| 1638 | for el in instr.snoiseTerms.keys(): |
| 1639 | name = sp.Symbol(el) |
| 1640 | if el == src: |
| 1641 | Iv = Iv.xreplace({name: 1}) |
| 1642 | else: |
| 1643 | Iv = Iv.xreplace({name: 0}) |
| 1644 | # Modify source and source vector (reduce to single input) |
| 1645 | instr.Iv = Iv |
| 1646 | instr = _doPyNumer(instr) |
| 1647 | num = assumeRealParams(instr.numer[-1].xreplace({ini.laplace: s2f})) |
| 1648 | if num != None: |
| 1649 | num_sq = sp.Abs(num * sp.conjugate(num)) |
| 1650 | gain_sq = num_sq/den_sq |
| 1651 | onoiseTerm = instr.snoiseTerms[src]*gain_sq |
| 1652 | if ini.factor: |
| 1653 | onoiseTerm = sp.factor(onoiseTerm) |
| 1654 | instr.onoiseTerms[src].append(clearAssumptions(onoiseTerm)) |
| 1655 | onoise += instr.onoiseTerms[src][-1] |
| 1656 | if instr.source != [None, None] and instr.source != None: |
| 1657 | inoiseTerm = clearAssumptions(instr.snoiseTerms[src]*num_sq/sl_num_sq) |
| 1658 | if ini.factor: |
| 1659 | inoiseTerm = sp.factor(inoiseTerm) |
no test coverage detected