set samples 2001
set terminal postscript enhanced landscape color lw 2 "Times-Roman" 20
set output "butterworth.ps"
# Butterworth amplitude response and decibel calculation. n is the order, which is just 1 in this image.
G(w,n) = 1 / (sqrt(1 + w**(2*n)))
dB(x) = 20 * log10(abs(x))
# Gridlines
set grid
# Set x axis to logarithmic scale
set logscale x 10
# Set range of x and y axes
set xrange [0.001:1000]
set yrange [-60:10]
# Create x-axis tic marks once per decade (every multiple of 10)
set xtics 10
# Use 10 x-axis minor divisions per major division
set mxtics 10
# Axis labels
set xlabel "Angular frequency (rad/s)"
set ylabel "Gain (dB)"
# No need for a key
set nokey #0.1,-25
# Frequency response's line plotting style
set style line 1 lt 1 lw 2
# Draw a separator between passband and stopband and label them
set style line 2 lt 2 lw 1
set style arrow 2 nohead ls 2
set arrow 3 from 1,-60 to 1,10 as 2
# Label coordinates are relative to the graph window, not to the function, centered at the 1/4 and 3/4 width points
set label 1 "Passband" at graph 0.25, graph 0.1 c
set label 2 "Stopband" at graph 0.75, graph 0.1 c
# Asymptote lines and slope lines are the same "arrow" style
set style line 3 lt 3 lw 1
set style arrow 3 nohead ls 3
# Draw asymptote lines
set arrow 1 from 1,0 to 1000,-60 as 3
set arrow 2 from .001,0 to 1,0 as 3
# -3 dB arrow style and arrow
set style line 4 lt 4 lw 1
set style arrow 4 head filled size screen 0.02,15,45 ls 4
set arrow 4 from 2,3 to 1,0 as 4
# "Cutoff frequency" label uses same coordinates as the function
set label 3 "Cutoff frequency" at 2,4 l
# "-3 dB" label
set arrow 5 from 0.5,-6 to 1,-3 as 4
set label 4 "-3.01 dB" at 0.5,-7 r
# Draw slope lines and label
set arrow 6 from 100,-20 to 12,-20 as 3
set arrow 7 from 100,-20 to 100,-39 as 3
set label 5 "Slope: -20 dB/decade" at 100,-18 c
# Plot the filter response
plot \
dB(G(x,1)) ls 1 title "1st-order response"