Commit eb8647511df49e30b8b042a1d643271abac512ba

Authored by bmarechal
1 parent 07295cdf44
Exists in master

add LPF behav of the cavity

Showing 2 changed files with 157 additions and 1 deletions Inline Diff

tf_cavity/tf_cavity_num.py
#!/usr/bin/python 1 1 #!/usr/bin/python
# -*- coding: utf-8 -*- 2 2 # -*- coding: utf-8 -*-
3 3
'''TF of FP cavity in reflection 4 4 '''TF of FP cavity in reflection
5 5
---------- 6 6 ----------
X(s) ----- | -tau⋅s | 7 7 X(s) ----- | -tau⋅s |
-------------->|1-R|----->(X)----->|e |------ 8 8 -------------->|1-R|----->(X)----->|e |------
| ----- ^ ---------- | 9 9 | ----- ^ ---------- |
| | | 10 10 | | |
| | V 11 11 | | V
---- ---- ---- 12 12 ---- ---- ----
|-R| |-R| |-R| 13 13 |-R| |-R| |-R|
---- ---- ---- 14 14 ---- ---- ----
| ^ | 15 15 | ^ |
| | ---------- | 16 16 | | ---------- |
Y(s) V ----- | | -tau⋅s | | 17 17 Y(s) V ----- | | -tau⋅s | |
<-----(X)<-----|1-R|<--------------|e |<----- 18 18 <-----(X)<-----|1-R|<--------------|e |<-----
----- ---------- 19 19 ----- ----------
20 20
''' 21 21 '''
22 22
'''import matplotlib as mpl 23 23 '''import matplotlib as mpl
mpl.use('pgf') 24 24 mpl.use('pgf')
25 25
def figsize(scale): 26 26 def figsize(scale):
fig_width_pt = 469.755 # Get this from LaTeX using \the\textwidth 27 27 fig_width_pt = 469.755 # Get this from LaTeX using \the\textwidth
inches_per_pt = 1.0/72.27 # Convert pt to inch 28 28 inches_per_pt = 1.0/72.27 # Convert pt to inch
golden_mean = (5.0**0.5-1.0)/2.0 # Aesthetic ratio (you could change this) 29 29 golden_mean = (5.0**0.5-1.0)/2.0 # Aesthetic ratio (you could change this)
fig_width = fig_width_pt*inches_per_pt*scale # width in inches 30 30 fig_width = fig_width_pt*inches_per_pt*scale # width in inches
fig_height = fig_width*golden_mean # height in inches 31 31 fig_height = fig_width*golden_mean # height in inches
fig_size = [fig_width,fig_height] 32 32 fig_size = [fig_width,fig_height]
return fig_size 33 33 return fig_size
34 34
pgf_with_latex = { # setup matplotlib to use latex for output 35 35 pgf_with_latex = { # setup matplotlib to use latex for output
"pgf.texsystem": "pdflatex", # change this if using xetex or lautex 36 36 "pgf.texsystem": "pdflatex", # change this if using xetex or lautex
"text.usetex": True, # use LaTeX to write all text 37 37 "text.usetex": True, # use LaTeX to write all text
"font.family": "serif", 38 38 "font.family": "serif",
"font.serif": [], # blank entries should cause plots to inherit fonts from the document 39 39 "font.serif": [], # blank entries should cause plots to inherit fonts from the document
"font.sans-serif": [], 40 40 "font.sans-serif": [],
"font.monospace": [], 41 41 "font.monospace": [],
"axes.labelsize": 10, # LaTeX default is 10pt font. 42 42 "axes.labelsize": 10, # LaTeX default is 10pt font.
"text.fontsize": 10, 43 43 "text.fontsize": 10,
"legend.fontsize": 8, # Make the legend/label fonts a little smaller 44 44 "legend.fontsize": 8, # Make the legend/label fonts a little smaller
"xtick.labelsize": 8, 45 45 "xtick.labelsize": 8,
"ytick.labelsize": 8, 46 46 "ytick.labelsize": 8,
"figure.figsize": figsize(0.9), # default fig size of 0.9 textwidth 47 47 "figure.figsize": figsize(0.9), # default fig size of 0.9 textwidth
"pgf.preamble": [ 48 48 "pgf.preamble": [
r"\usepackage[utf8x]{inputenc}", # use utf8 fonts becasue your computer can handle it :) 49 49 r"\usepackage[utf8x]{inputenc}", # use utf8 fonts becasue your computer can handle it :)
r"\usepackage[T1]{fontenc}", # plots will be generated using this preamble 50 50 r"\usepackage[T1]{fontenc}", # plots will be generated using this preamble
] 51 51 ]
} 52 52 }
mpl.rcParams.update(pgf_with_latex) 53 53 mpl.rcParams.update(pgf_with_latex)
''' 54 54 '''
from numpy import * 55 55 from numpy import *
import matplotlib.pyplot as plt 56 56 import matplotlib.pyplot as plt
57 57
r = 0.99998 58 58 r = 0.99998
L = 140e-3 59 59 L = 140e-3
c = 299792458 60 60 c = 299792458
61 61
tau = L/c 62 62 tau = L/c
fsr = 1/(2*tau) 63 63 fsr = 1/(2*tau)
finesse = pi*r/(1-r**2) 64 64 finesse = pi*r/(1-r**2)
print('Finesse = %f\n FSR = %f\n FSR/Finesse = %f'%(finesse, fsr, fsr/finesse)) 65 65 print(' Finesse = %f\n FSR = %f\n FSR/Finesse = %f'%(finesse, fsr, fsr/finesse))
66 66
f0 = (193e12//fsr)*fsr 67 67 f0 = (193e12//fsr)*fsr
f = linspace(f0-0.1*fsr, f0+0.1*fsr, 1e5) 68 68 f = linspace(f0-0.1*fsr, f0+0.1*fsr, 1e5)
69 69
fm = 30e6 70 70 fm = 30e6
71 71
#TF of cavity in reflection 72 72 #TF of cavity in reflection
def Fr(w): 73 73 def Fr(w):
s = 1j*w 74 74 s = 1j*w
return r*(exp(-2*tau*s)-1)/(1-r**2*exp(-2*tau*s)) 75 75 return r*(exp(-2*tau*s)-1)/(1-r**2*exp(-2*tau*s))
76 76
G = Fr(2*pi*f) 77 77 G = Fr(2*pi*f)
Glsb = Fr(2*pi*(f-fm)) 78 78 Glsb = Fr(2*pi*(f-fm))
Gusb = Fr(2*pi*(f+fm)) 79 79 Gusb = Fr(2*pi*(f+fm))
80 80
#plot setup 81 81 #plot setup
fig, axarr = plt.subplots(3, 2, sharex='col') 82 82 fig, axarr = plt.subplots(3, 2, sharex='col')
83 83
#plot bode of F(w) 84 84 #plot bode of F(w)
axarr[0, 1].set_ylabel('Magnitude') 85 85 axarr[0, 1].set_ylabel('Magnitude')
#axarr[0, 1].set_xlabel('Frequency (Hz)') 86 86 #axarr[0, 1].set_xlabel('Frequency (Hz)')
axarr[0, 1].plot(f, abs(G)) 87 87 axarr[0, 1].plot(f, abs(G))
axarr[0, 1].grid() 88 88 axarr[0, 1].grid()
axarr[1, 1].set_ylabel('Phase (deg)') 89 89 axarr[1, 1].set_ylabel('Phase (deg)')
#axarr[1, 1].set_xlabel('Frequency (Hz)') 90 90 #axarr[1, 1].set_xlabel('Frequency (Hz)')
axarr[1, 1].plot(f, angle(G, deg = True)) 91 91 axarr[1, 1].plot(f, angle(G, deg = True))
axarr[1, 1].grid() 92 92 axarr[1, 1].grid()
93 93
#PDH signal 94 94 #PDH signal
iG = (G*Gusb.conjugate()-G.conjugate()*Glsb).imag 95 95 iG = (G*Gusb.conjugate()-G.conjugate()*Glsb).imag
axarr[2, 1].set_ylabel('epsillon normalized') 96 96 axarr[2, 1].set_ylabel('epsillon normalized')
axarr[2, 1].set_xlabel('Frequency (Hz)') 97 97 axarr[2, 1].set_xlabel('Frequency (Hz)')
axarr[2, 1].xaxis.set_label_coords(0.5, -0.3) 98 98 axarr[2, 1].xaxis.set_label_coords(0.5, -0.3)
axarr[2, 1].plot(f, iG) 99 99 axarr[2, 1].plot(f, iG)
axarr[2, 1].grid() 100 100 axarr[2, 1].grid()
101 101
102 102
#nyquist 103 103 #nyquist
axarr[2, 0].set_ylabel('$j\omega$') 104 104 axarr[2, 0].set_ylabel('$j\omega$')
axarr[2, 0].set_xlabel('$\sigma$') 105 105 axarr[2, 0].set_xlabel('$\sigma$')
axarr[2, 0].plot(real(G), imag(G)) 106 106 axarr[2, 0].plot(real(G), imag(G))
axarr[2, 0].grid() 107 107 axarr[2, 0].grid()
axarr[2, 0].axis('equal') 108 108 axarr[2, 0].axis('equal')
axarr[2, 0].set_xlim([-1.1, 1.1]) 109 109 axarr[2, 0].set_xlim([-1.1, 1.1])
110 110
#layout 111 111 #layout
tf_cavity/tf_cavity_num_lp.py
File was created 1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 '''TF of FP cavity in reflection
5
6 ----------
7 X(s) ----- | -tau⋅s |
8 -------------->|1-R|----->(X)----->|e |------
9 | ----- ^ ---------- |
10 | | |
11 | | V
12 ---- ---- ----
13 |-R| |-R| |-R|
14 ---- ---- ----
15 | ^ |
16 | | ---------- |
17 Y(s) V ----- | | -tau⋅s | |
18 <-----(X)<-----|1-R|<--------------|e |<-----
19 ----- ----------
20
21 '''
22
23 '''import matplotlib as mpl
24 mpl.use('pgf')
25
26 def figsize(scale):
27 fig_width_pt = 469.755 # Get this from LaTeX using \the\textwidth
28 inches_per_pt = 1.0/72.27 # Convert pt to inch
29 golden_mean = (5.0**0.5-1.0)/2.0 # Aesthetic ratio (you could change this)
30 fig_width = fig_width_pt*inches_per_pt*scale # width in inches
31 fig_height = fig_width*golden_mean # height in inches
32 fig_size = [fig_width,fig_height]
33 return fig_size
34
35 pgf_with_latex = { # setup matplotlib to use latex for output
36 "pgf.texsystem": "pdflatex", # change this if using xetex or lautex
37 "text.usetex": True, # use LaTeX to write all text
38 "font.family": "serif",
39 "font.serif": [], # blank entries should cause plots to inherit fonts from the document
40 "font.sans-serif": [],
41 "font.monospace": [],
42 "axes.labelsize": 10, # LaTeX default is 10pt font.
43 "text.fontsize": 10,
44 "legend.fontsize": 8, # Make the legend/label fonts a little smaller
45 "xtick.labelsize": 8,
46 "ytick.labelsize": 8,
47 "figure.figsize": figsize(0.9), # default fig size of 0.9 textwidth
48 "pgf.preamble": [
49 r"\usepackage[utf8x]{inputenc}", # use utf8 fonts becasue your computer can handle it :)
50 r"\usepackage[T1]{fontenc}", # plots will be generated using this preamble
51 ]
52 }
53 mpl.rcParams.update(pgf_with_latex)
54 '''
55 from numpy import *
56 import matplotlib.pyplot as plt
57
58 r = 0.99998
59 L = 140e-3
60 c = 299792458
61
62 tau = L/c
63 fsr = 1/(2*tau)
64 finesse = pi*r/(1-r**2)
65 print(' Finesse = %f\n FSR = %f\n FSR/Finesse = %f'%(finesse, fsr, fsr/finesse))
66
67 f0 = (193e12//fsr)*fsr
68 f = linspace(f0-0.1*fsr, f0+0.1*fsr, int(1e5))
69
70 fm = 30e6
71
72 ff = linspace(1, 1e6, int(1e5))
73
74 #TF of cavity in reflection
75 def Fr(w):
76 s = 1j*w
77 return r*(exp(-2*tau*s)-1)/(1-r**2*exp(-2*tau*s))
78
79 #TF of cavity frequency-to-signal
80 def Ff2s(w):
81 s = 1j*w
82 return (1-exp(-2*tau*s))/(2*tau*s)*(1-r**2)/(1-r**2*exp(-2*tau*s))
83
84
85 G = Fr(2*pi*f)
86 Glsb = Fr(2*pi*(f-fm))
87 Gusb = Fr(2*pi*(f+fm))
88
89 Gf2s = Ff2s(2*pi*ff)
90
91 #plot setup
92 fig, axarr = plt.subplots(3, 3, sharex='col')
93
94 #plot bode of F(w)
95 axarr[0, 1].set_ylabel('Magnitude')
96 #axarr[0, 1].set_xlabel('Frequency (Hz)')
97 axarr[0, 1].plot(f, abs(G))
98 axarr[0, 1].grid()
99 axarr[1, 1].set_ylabel('Phase (deg)')
100 #axarr[1, 1].set_xlabel('Frequency (Hz)')
101 axarr[1, 1].plot(f, angle(G, deg = True))
102 axarr[1, 1].grid()
103
104 #plot bode of Ff2s(w)
105 axarr[1, 2].set_ylabel('Magnitude')
106 #axarr[1, 2].set_xlabel('Frequency (Hz)')
107 axarr[1, 2].set_xscale('log')
108 axarr[1, 2].plot(ff, 20*log10(abs(Gf2s)))
109 axarr[1, 2].grid()
110 axarr[2, 2].set_ylabel('Phase (deg)')
111 axarr[2, 2].set_xlabel('Frequency (Hz)')
112 axarr[2, 2].set_xscale('log')
113 axarr[2, 2].xaxis.set_label_coords(0.5, -0.3)
114 axarr[2, 2].plot(ff, angle(Gf2s, deg = True))
115 axarr[2, 2].grid()
116
117
118 #PDH signal
119 iG = (G*Gusb.conjugate()-G.conjugate()*Glsb).imag
120 axarr[2, 1].set_ylabel('epsillon normalized')
121 axarr[2, 1].set_xlabel('Frequency (Hz)')
122 axarr[2, 1].xaxis.set_label_coords(0.5, -0.3)
123 axarr[2, 1].plot(f, iG)
124 axarr[2, 1].grid()
125
126
127 #nyquist
128 axarr[2, 0].set_ylabel('$j\omega$')
129 axarr[2, 0].set_xlabel('$\sigma$')