Simulating a lowpass filter with gEDA and ngspice

Getting started with ngspice can be quite tricky. It’s a very powerful piece of software and although the user manual is quite comprehensive, its complexity can easily scare off beginners.
Here’s a simple step-by-step tutorial on how to simulate a very simple electronic circuit. It should enable you to run your own simulations of circuits you designed.

Creating the circuit

The sample circuit is a lowpass RC filter. It’s simple, contains a reasonable amount of components and yet we can do different types of analysis. I assume, you already know how to use gschem. If not, have a look at the gEDA wiki for a list of tutorials.

Start up gschem and draw the following circuit:

Simple lowpass RC filter

Of course, you can name your buses differently. I chose n0 and n1 here. The bus named 0 is mandatory as it specifies the reference (ground) net.

V1 is an independent AC voltage source. It’s parameters are wave form (sin), voltage offset in Volts (0[V]), amplitude in Volts (1[V]) and frequency (200kHz).

Save the schematic as rcSIN.sch.

Generating the netlist

SPICE doesn’t use gschem schematics as input but so-called netlists. To generate a netlist file from a schematic, gnetlist can be used:

$ gnetlist -g spice -o rcSIN.net rcSIN.sch 
Command line passed = gnetlist -g spice -o rcSIN.net rcSIN.sch 
Loading schematic [rcSIN.sch]

The resulting rcSIN.net should look like this:

* Spice netlister for gnetlist
R1 n1 n0 10k
C1 n1 0 1nF
V1 n0 0 sin(0 1 200kHz)
.END

The file is quite self-explanatory: Each line contains a single component, the first column of each line the component’s reference designator, the subsequent columns the netnames for each pin and finally the value attribute.

Running a transient simulation

SPICE can run different types of analysis, e.g.

  • A transient analysis shows how the circuit behaves over time
  • An AC analysis shows the behaviour of the circuit with varying frequency
  • A parametrized analysis can be either a transient or an AC analysis. It varies one or more values of a given circuit, e.g. the resistance of a Resistor.

Let’s run a transient analysis first. Start up ngspice

$ ngspice 
******
** ngspice-23 : Circuit level simulation program
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Please get your ngspice manual from http://ngspice.sourceforge.net/docs.html
** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html
** Creation Date: Sat Jan 14 14:20:54 UTC 2012
******
ngspice 230 -> 

and load the netlist file

ngspice 230 -> source rcSIN.net

Circuit: * spice netlister for gnetlist

ngspice 231 -> 

Our voltage source runs at a frequency of \(200kHz\), which means our oscillating period is \(200kHz^{-1} = 5{\mu}s\). Let’s say, we want to see how the input voltages behaves during the first 5 oscillations (i.e. \(5 \cdot 5{\mu}s = 25{\mu}s\)) and we want to have a data point every \(0.05{\mu}s\):

ngspice 231 -> tran 0.05us 25us
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Warning: v1: no DC value, transient time 0 value used

Initial Transient Solution
--------------------------

Node                                   Voltage
----                                   -------
n1                                           0
n0                                           0
v1#branch                                    0

%100.00

No. of Data Rows : 508
ngspice 232 -> 

We can now plot the results:

ngspice 232 -> plot n0 n1

Output graph of the transient analysis

Running an AC simulation

You can easily see that the signal at the resistor R1 is significantly smaller as the input voltage. Of course, you can adjust the values for R1 and C1 to archive even lower signal levels, but the signal level is also determined by the input frequency. So let’s run and AC analysis to see how the RC filter behaves when we alter the input frequency.

Open up gschem again and change the input voltage to AC:

Changed input voltage (AC)

Save the schematic as rcAC.sch and generate a netlist file (rcAC.net)

$ gnetlist -g spice -o rcAC.net rcAC.sch 
Command line passed = gnetlist -g spice -o rcAC.net rcAC.sch 
Loading schematic [rcAC.sch]

We are now ready to run an AC analysis. For a detailed explanation of the ac command syntax, have a look at “SPICE – A Brief Tutorial”. Don’t forget to load the rcAC.net netlist file before you run the analysis!

ngspice 236 -> source rcAC.net

Circuit: * spice netlister for gnetlist

ngspice 237 -> ac lin 1000 0.1 250kHz
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Warning: v1: has no value, DC 0 assumed


No. of Data Rows : 1000
ngspice 238 -> plot n0 n1
ngspice 239 -> 

This command performs a linear frequency analysis (lin) from (almost) 0Hz to 250kHz and generates 1000 data points. To view the results, plot the input voltage and the voltage over R1 versus the frequency:

Frequency analysis

Have a look at http://ashwith.wordpress.com/2010/09/30/ngspice-interactive-mode/ for more ngspice examples.

Schematic and netlist files:
rcSIN.sch rcSIN.net rcAC.sch rcAC.net

5 thoughts on “Simulating a lowpass filter with gEDA and ngspice

  1. avatarStephan

    Amazing post. I was trying for 5 hours to do a simulation like this. Your instructions are the best I have found. Even the official geda documentation has some serious misinformation. Excellent!!

  2. avataradmin Post author

    @Stephan
    Thanks for your comment. The flaky documentation situation actually motivated this post. After fiddling around with spice for quite a while I thought it could save someone else some time.

  3. avatarKeith Hayes

    If I calculate the impedance of a 1nF capacitor at 200KHz I get seven hundred ohms and change.
    Comparing that impedance to the 10K resitor is an order of magnitude. The linear plot makes sense; one of the waveforms is jast over ten times bigger as it should be. The phase change of about 90 degrees shows nicely. As per ELI the ICE man current leads voltage.

    The frequency response plot confuses me. At 200 KHZ we should see a bit less than 10% signal but we see less than 1%.

    What gives?

  4. avatarhomepage

    Just want to say your article is as astonishing.
    The clearness to your post is simply excellent and i can think you’re a professional in this subject.

    Fine together with your permission let me to grasp your RSS feed to keep
    updated with forthcoming post. Thanks one million and
    please continue the enjoyable work.

  5. Pingback: How to simulate circuits with Ngspice on Ubuntu – Guide for Beginners – CircuitPlot

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.