-
Notifications
You must be signed in to change notification settings - Fork 0
/
enob_gains_bar_chart.py
218 lines (180 loc) · 7.28 KB
/
enob_gains_bar_chart.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Gains with some moderate pains
@author: Bikash Adhikari
@date: 22.02.2024
@license: BSD 3-Clause
"""
# %%
import numpy as np
from matplotlib import pyplot as plt
# %% DAC and sampling frequency
DAC_16bit_Fs_1MHz = 1
DAC_6bit_Fs_1MHz = 2
DAC_6bit_Fs_250MHz = 3
DAC_16bit_Fs_32MHz = 4
DAC_6bit_Fs_32MHz = 5
# %%
match 5:
case 1: # 16-bit 1 MHz Trond
methods ="static-spice"
Nb = 16
Fs = 1.02
static_baseline = 11.121
static_physcal = 16.487
static_phfd = 11.283
static_shpd = 10.750
static_nsdcal = 14.416
static_dem = 8.645
#static_ilc= 15.551
# Spice simulation results
spice_baseline = 11.111
spice_physcal = 15.189
spice_phfd = 11.173
spice_shpd = 10.672
spice_nsdcal = 14.249
spice_dem = 8.640
#spice_ilc= 15.004
# Calculate gains
#static_gains = np.array([static_physcal, static_phfd, static_shpd, static_dem, static_nsdcal,static_ilc ])- static_baseline
#spice_gains = np.array([spice_physcal, spice_phfd, spice_shpd, spice_dem, spice_nsdcal,spice_ilc])- spice_baseline
static_gains = np.array([static_physcal, static_phfd, static_shpd, static_nsdcal, static_dem]) - static_baseline
spice_gains = np.array([spice_physcal, spice_phfd, spice_shpd, spice_nsdcal, spice_dem]) - spice_baseline
lin_methods = ['PHYSCAL', 'PHFD', 'SHPD', 'NSDCAL', 'DEM']#, 'ILC']
case 2: # 6-bit 1 MHz Trond
methods ="static-spice"
Nb = 6
Fs = 1.02
static_baseline = 6.051
static_physcal = 6.832
static_phfd = 6.752
static_shpd= 3.538
static_nsdcal = 8.022
static_dem = 4.924
# Spice simulation results
spice_baseline = 6.093
spice_physcal = 6.164
spice_phfd = 6.783
spice_shpd= 3.522
spice_nsdcal = 8.343
spice_dem = 4.874
# Calculate gains
static_gains = np.array([static_physcal, static_phfd, static_shpd, static_nsdcal, static_dem]) - static_baseline
spice_gains = np.array([spice_physcal, spice_phfd, spice_shpd, spice_nsdcal, spice_dem]) - spice_baseline
lin_methods = ['PHYSCAL', 'PHFD', 'SHPD', 'NSDCAL', 'DEM']
case 3: # SPECTRE 6 bit,
methods ="static-spectre"
Nb = 6
Fs = 250
static_baseline = 4.45
static_physcal = 8.61
static_nsdcal = 16.29
static_phfd = 10.21
static_dem= 9.12
static_shpd= 6.52
spectre_baseline = 4.73
spectre_physcal = 5.86
spectre_nsdcal = 5.64
spectre_phfd = 10.11
spectre_dem= 7.21
spectre_shpd= 6.20
# spice_ilc_16_1= 14.646
# spice_mpc_16_1= 14.646
# Calculate gains
static_gains = np.array([static_physcal, static_nsdcal, static_phfd, static_dem, static_shpd]) - static_baseline
spectre_gains = np.array([spectre_physcal, spectre_nsdcal, spectre_phfd, spectre_dem, spectre_shpd]) - spectre_baseline
spice_gains = False
lin_methods = ['PHYSCAL', 'NSDCAL', 'PHFD', 'DEM', 'SHPD']
case 4: # 16-bit DAC 2 Ch from Trond 33 MHz
methods ="static-spice"
Nb = 16
Fs = 32.7
static_baseline = 11.514
static_physcal = 16.940
static_phfd = 15.886
static_shpd= 11.303
static_nsdcal = 18.332
static_dem = 11.141
# Spice simulation results
spice_baseline = 11.134
spice_physcal = 16.913
spice_phfd = 15.109
spice_shpd= 11.172
spice_nsdcal = 16.986
spice_dem = 11.184
# Calculate gains
static_gains = np.array([static_physcal, static_phfd, static_shpd, static_nsdcal, static_dem]) - static_baseline
spice_gains = np.array([spice_physcal, spice_phfd, spice_shpd, spice_nsdcal, spice_dem])- spice_baseline
lin_methods = ['PHYSCAL', 'PHFD', 'SHPD', 'NSDCAL', 'DEM']
case 5: # 6-bit DAC 2 Ch from Trond 33 MHz
methods ="static-spice"
Nb = 6
Fs = 32.7
static_baseline = 6.389
static_physcal = 8.206
static_phfd = 8.828
static_shpd= 7.461
static_nsdcal = 16.476
static_dem = 7.393
# Spice simulation results
spice_baseline = 6.379
spice_physcal = 6.483
spice_phfd = 8.847
spice_shpd = 7.502
spice_nsdcal = 9.578
spice_dem = 7.401
# Calculate gains
static_gains = np.array([static_physcal, static_phfd, static_shpd, static_nsdcal, static_dem])- static_baseline
spice_gains = np.array([spice_physcal, spice_phfd, spice_shpd, spice_nsdcal, spice_dem])- spice_baseline
lin_methods = ['PHYSCAL', 'PHFD', 'SHPD', 'NSDCAL', 'DEM']
# %% Plots
barWidth = 0.25
# set position of the bar on X axis
bar1 = np.arange(static_gains.size)
bar2 = [x + barWidth for x in bar1]
bar3 = [x + barWidth for x in bar2]
# % Draw plot
fig, ax = plt.subplots(figsize = (7,5))
plt.axhline(y = 0, color = 'black', linestyle = '-')
b1 = plt.bar(bar2, static_gains, width = barWidth, color = 'tab:blue', edgecolor = 'white', label = 'Static')
match methods:
case "static-spice":
b2 = plt.bar(bar3, spice_gains, width = barWidth, color = 'tab:orange',edgecolor = 'white', label = 'SPICE')
case "static-spectre":
b2 = plt.bar(bar3, spectre_gains, width = barWidth, color = 'tab:orange',edgecolor = 'white', label = 'Spectre')
plt.xlabel('Linearisation method', fontweight ='bold', fontsize = 15)
plt.ylabel('ENOB gain', fontsize = 13)
pos_xticks = np.array([r + barWidth for r in range(len(static_gains))]) + barWidth/2
plt.xticks(pos_xticks, lin_methods , fontsize = 13)
ah = []
for rect in b1 + b2 :
height = rect.get_height()
ah.append(height)
if height > 0 :
plt.text(rect.get_x() + rect.get_width()/2.0 - 0.03, 0.3, f'{height:.2f} bits', rotation = 90, fontsize = 13)
if height < 0 :
plt.text(rect.get_x() + rect.get_width()/2.0 - 0.03, 0.3, f'{height:.2f} bits', rotation = 90, fontsize = 13)
# Adjust location of the value Fs
# ax.text(1, -1.2, f'Fs = {Fs} MHz', ha='right', va='bottom', fontsize = "20")
# for rect in b1 + b2:
# height = rect.get_height()
# if height > 0 :
# plt.text(rect.get_x() + rect.get_width() / 2.0 -0.03, -1, '1.02 MHz', rotation = 90, fontsize = 13)
# if height < 0 :
# plt.text(rect.get_x() + rect.get_width() / 2.0 -0.03, 0.3, '1.02 MHz', rotation = 90, fontsize = 13)
# for rect in b3 + b4:
# height = rect.get_height()
# if height > 0 :
# plt.text(rect.get_x() + rect.get_width() / 2.0 -0.03, -1.25, '1 MHz', rotation = 90, fontsize = 13)
# if height < 0 :
# plt.text(rect.get_x() + rect.get_width() / 2.0 -0.03, 0.5, '1 MHz', rotation = 90, fontsize = 13)
plt.title(f"{int(Nb)}-bit DAC with sampling rate Fs = {Fs} MHz", fontsize = "13")
plt.legend(fontsize="13", loc='upper right')
ax.set_axisbelow(True)
ax.grid(zorder=0, axis = "y")
fig.tight_layout()
# plt.savefig(f"Gainplot-{Nb}bits.pdf")
# %%
fname = "figures/Gainplot-" + str(int(Nb)) + str("bits") + str(int(Fs)) + str("MHz-") + methods
fname = str(fname) + ".pdf"
fig.savefig(fname, format='pdf', bbox_inches='tight')