nahue-passano commited on
Commit
28e7489
·
verified ·
1 Parent(s): 947e545

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +228 -111
app.py CHANGED
@@ -1,15 +1,16 @@
1
  import streamlit as st
2
- import matplotlib.pyplot as plt
3
  import numpy as np
 
4
 
5
  from core import simulate_loudspeaker
6
- from visualization import plot_loudspeaker_response
7
  from config import (
8
  load_config,
9
  load_loudspeaker_config,
10
- AcousticalConstantsConfig,
11
  )
12
 
 
 
13
  config_path = "configs/config.yaml"
14
  default_loudspeaker_path = "configs/default_loudspeaker.yaml"
15
 
@@ -22,113 +23,229 @@ freq_array = np.logspace(
22
 
23
  angular_freq_array = 2 * np.pi * freq_array
24
 
25
- st.sidebar.title("Thiele Small parameters")
26
-
27
- ### Sliders
28
- slider_Re = st.sidebar.slider(
29
- "Electrical Coil Resistance (Re) [Ohm]",
30
- 0.0,
31
- 10.0,
32
- loudspeaker_cfg.electrical.coil_resistance,
33
- )
34
- slider_Le = st.sidebar.slider(
35
- "Electrical Coil Inductance (Le) [mH]",
36
- 0.0,
37
- 10.0,
38
- loudspeaker_cfg.electrical.coil_inductance * 1e3,
39
- )
40
- slider_Le /= 1e3
41
- slider_Bl = st.sidebar.slider(
42
- "Electromechanical factor (Bl) [N/A]",
43
- 0.0,
44
- 10.0,
45
- loudspeaker_cfg.electromechanical_factor,
46
- )
47
- slider_Mm = st.sidebar.slider(
48
- "Mechanical Mass (Mm) [mg]",
49
- 0.0,
50
- 50.0,
51
- loudspeaker_cfg.mechanical.mass * 1e3,
52
- )
53
- slider_Mm /= 1e3
54
- slider_Cm = st.sidebar.slider(
55
- "Mechanical Compliance (Cm) [mm/N]",
56
- 0.0,
57
- 5.0,
58
- loudspeaker_cfg.mechanical.compliance * 1e3,
59
- )
60
- slider_Cm /= 1e3
61
- slider_Rm = st.sidebar.slider(
62
- "Mechanical Resistance (Rm) [kg/s]",
63
- 0.0,
64
- 10.0,
65
- loudspeaker_cfg.mechanical.resistance,
66
- )
67
- slider_diam = st.sidebar.slider(
68
- "Effective diameter of radiation [cm]",
69
- 0.0,
70
- 50.0,
71
- loudspeaker_cfg.acoustical.effective_diameter * 1e2,
72
- )
73
- slider_diam /= 1e2
74
-
75
- default_params = st.sidebar.button("Set default parameters")
76
-
77
- if default_params:
78
- st.rerun(scope="app")
79
-
80
-
81
- freq_array = np.logspace(
82
- np.log10(cfg.frequency.min), np.log10(cfg.frequency.max), num=cfg.frequency.n_bins
83
- )
84
-
85
- angular_freq_array = 2 * np.pi * freq_array
86
-
87
- thiele_small_params = {
88
- "Re": slider_Re,
89
- "Le": slider_Le,
90
- "Bl": slider_Bl,
91
- "Mm": slider_Mm,
92
- "Cm": slider_Cm,
93
- "Rm": slider_Rm,
94
- "effective_diameter": slider_diam,
95
- }
96
-
97
- loudspeaker_responses = simulate_loudspeaker(
98
- thiele_small_params, angular_freq_array, cfg.acoustical_constants
99
- )
100
-
101
-
102
- # Electrical impedance
103
- electrical_impedance_plot = plot_loudspeaker_response(
104
- response_array=loudspeaker_responses["electrical_impedance"],
105
- freq_array=freq_array,
106
- title="Electrical Impedance",
107
- magnitude_in_db=False,
108
- magnitude_units="Ohm",
109
- shift_phase=False,
110
- )
111
-
112
-
113
- mechanical_velocity_plot = plot_loudspeaker_response(
114
- response_array=loudspeaker_responses["mechanical_velocity"],
115
- freq_array=freq_array,
116
- title="Mechanical Velocity",
117
- magnitude_in_db=False,
118
- magnitude_units="m/s",
119
- shift_phase=True,
120
- )
121
-
122
-
123
- acoustical_pressure = plot_loudspeaker_response(
124
- response_array=loudspeaker_responses["acoustical_pressure"],
125
- freq_array=freq_array,
126
- title="Acoustical Pressure",
127
- magnitude_in_db=True,
128
- magnitude_units="dB",
129
- shift_phase=False,
130
  )
131
 
132
- st.pyplot(electrical_impedance_plot)
133
- st.pyplot(mechanical_velocity_plot)
134
- st.pyplot(acoustical_pressure)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
 
2
  import numpy as np
3
+ import pandas as pd
4
 
5
  from core import simulate_loudspeaker
6
+ from visualization import plotly_full_figure
7
  from config import (
8
  load_config,
9
  load_loudspeaker_config,
 
10
  )
11
 
12
+ st.set_page_config(layout="wide")
13
+
14
  config_path = "configs/config.yaml"
15
  default_loudspeaker_path = "configs/default_loudspeaker.yaml"
16
 
 
23
 
24
  angular_freq_array = 2 * np.pi * freq_array
25
 
26
+ left, right = st.columns([0.7, 0.3])
27
+ left.title("Loudspeaker simulation")
28
+ right.image(
29
+ "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRNvst-DPEbpMwDGUlCmaW2WlSEDUHsQxJjkDBUa6T9scpbHohQZK6UjS77cnq8VYcb_Q&usqp=CAU"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  )
31
 
32
+ single_speaker, two_speakers = st.tabs(["Single speaker", "Two speakers comparison"])
33
+
34
+ with single_speaker:
35
+ col1, col2 = st.columns([0.2, 0.8])
36
+ with col1:
37
+ st.title("Thielle small parameters")
38
+ ### Sliders
39
+ slider_spk1_Re = st.slider(
40
+ "Electrical Coil Resistance (Re) [Ohm] .",
41
+ 1.0,
42
+ 20.0,
43
+ loudspeaker_cfg.electrical.coil_resistance,
44
+ )
45
+ slider_spk1_Le = st.slider(
46
+ "Electrical Coil Inductance (Le) [mH] .",
47
+ 0.0,
48
+ 5.0,
49
+ loudspeaker_cfg.electrical.coil_inductance * 1e3,
50
+ )
51
+ slider_spk1_Le /= 1e3
52
+ slider_spk1_Bl = st.slider(
53
+ "Electromechanical factor (Bl) [N/A] .",
54
+ 1.0,
55
+ 20.0,
56
+ loudspeaker_cfg.electromechanical_factor,
57
+ )
58
+ slider_spk1_Mm = st.slider(
59
+ "Mechanical Mass (Mm) [g] .",
60
+ 1.0,
61
+ 100.0,
62
+ loudspeaker_cfg.mechanical.mass * 1e3,
63
+ )
64
+ slider_spk1_Mm /= 1e3
65
+ slider_spk1_Cm = st.slider(
66
+ "Mechanical Compliance (Cm) [mm/N] .",
67
+ 0.0,
68
+ 5.0,
69
+ loudspeaker_cfg.mechanical.compliance * 1e3,
70
+ )
71
+ slider_spk1_Cm /= 1e3
72
+ slider_spk1_Rm = st.slider(
73
+ "Mechanical Resistance (Rm) [kg/s] .",
74
+ 0.0,
75
+ 10.0,
76
+ loudspeaker_cfg.mechanical.resistance,
77
+ )
78
+ slider_spk1_diam = st.slider(
79
+ "Effective diameter of radiation [cm] .",
80
+ 1.0,
81
+ 50.0,
82
+ loudspeaker_cfg.acoustical.effective_diameter * 1e2,
83
+ )
84
+ slider_spk1_diam /= 1e2
85
+
86
+ thiele_small_params_1 = {
87
+ "Re": slider_spk1_Re,
88
+ "Le": slider_spk1_Le,
89
+ "Bl": slider_spk1_Bl,
90
+ "Mm": slider_spk1_Mm,
91
+ "Cm": slider_spk1_Cm,
92
+ "Rm": slider_spk1_Rm,
93
+ "effective_diameter": slider_spk1_diam,
94
+ }
95
+
96
+ loudspeaker_responses_1 = simulate_loudspeaker(
97
+ thiele_small_params_1, angular_freq_array, cfg.acoustical_constants
98
+ )
99
+
100
+ plotly_fig = plotly_full_figure(
101
+ freq_array, loudspeaker_responses_1, single_speaker=True
102
+ )
103
+ with col2:
104
+ selectivity_factors = loudspeaker_responses_1["selectivity_params"]
105
+
106
+ st.dataframe(
107
+ pd.DataFrame([selectivity_factors]),
108
+ hide_index=True,
109
+ use_container_width=True,
110
+ )
111
+ st.plotly_chart(plotly_fig, use_container_width=True, theme=None)
112
+
113
+
114
+ with two_speakers:
115
+ spk1, plots, spk2 = st.columns([0.17, 0.66, 0.17])
116
+
117
+ with spk1:
118
+ st.title("Speaker 1")
119
+ ### Sliders
120
+ slider_spk1_Re = st.slider(
121
+ "Electrical Coil Resistance (Re) [Ohm]",
122
+ 1.0,
123
+ 20.0,
124
+ loudspeaker_cfg.electrical.coil_resistance,
125
+ )
126
+ slider_spk1_Le = st.slider(
127
+ "Electrical Coil Inductance (Le) [mH]",
128
+ 0.0,
129
+ 5.0,
130
+ loudspeaker_cfg.electrical.coil_inductance * 1e3,
131
+ )
132
+ slider_spk1_Le /= 1e3
133
+ slider_spk1_Bl = st.slider(
134
+ "Electromechanical factor (Bl) [N/A]",
135
+ 1.0,
136
+ 20.0,
137
+ loudspeaker_cfg.electromechanical_factor,
138
+ )
139
+ slider_spk1_Mm = st.slider(
140
+ "Mechanical Mass (Mm) [g]",
141
+ 1.0,
142
+ 100.0,
143
+ loudspeaker_cfg.mechanical.mass * 1e3,
144
+ )
145
+ slider_spk1_Mm /= 1e3
146
+ slider_spk1_Cm = st.slider(
147
+ "Mechanical Compliance (Cm) [mm/N]",
148
+ 0.0,
149
+ 5.0,
150
+ loudspeaker_cfg.mechanical.compliance * 1e3,
151
+ )
152
+ slider_spk1_Cm /= 1e3
153
+ slider_spk1_Rm = st.slider(
154
+ "Mechanical Resistance (Rm) [kg/s]",
155
+ 0.0,
156
+ 10.0,
157
+ loudspeaker_cfg.mechanical.resistance,
158
+ )
159
+ slider_spk1_diam = st.slider(
160
+ "Effective diameter of radiation [cm]",
161
+ 1.0,
162
+ 50.0,
163
+ loudspeaker_cfg.acoustical.effective_diameter * 1e2,
164
+ )
165
+ slider_spk1_diam /= 1e2
166
+
167
+ with spk2:
168
+ st.title("Speaker 2")
169
+ ### Sliders
170
+ slider_spk2_Re = st.slider(
171
+ "Electrical Coil Resistance (Re) [Ohm].",
172
+ 1.0,
173
+ 20.0,
174
+ loudspeaker_cfg.electrical.coil_resistance,
175
+ )
176
+ slider_spk2_Le = st.slider(
177
+ "Electrical Coil Inductance (Le) [mH].",
178
+ 0.0,
179
+ 5.0,
180
+ loudspeaker_cfg.electrical.coil_inductance * 1e3,
181
+ )
182
+ slider_spk2_Le /= 1e3
183
+ slider_spk2_Bl = st.slider(
184
+ "Electromechanical factor (Bl) [N/A].",
185
+ 1.0,
186
+ 20.0,
187
+ loudspeaker_cfg.electromechanical_factor,
188
+ )
189
+ slider_spk2_Mm = st.slider(
190
+ "Mechanical Mass (Mm) [g].",
191
+ 1.0,
192
+ 100.0,
193
+ loudspeaker_cfg.mechanical.mass * 1e3,
194
+ )
195
+ slider_spk2_Mm /= 1e3
196
+ slider_spk2_Cm = st.slider(
197
+ "Mechanical Compliance (Cm) [mm/N].",
198
+ 0.0,
199
+ 5.0,
200
+ loudspeaker_cfg.mechanical.compliance * 1e3,
201
+ )
202
+ slider_spk2_Cm /= 1e3
203
+ slider_spk2_Rm = st.slider(
204
+ "Mechanical Resistance (Rm) [kg/s].",
205
+ 0.0,
206
+ 10.0,
207
+ loudspeaker_cfg.mechanical.resistance,
208
+ )
209
+ slider_spk2_diam = st.slider(
210
+ "Effective diameter of radiation [cm].",
211
+ 1.0,
212
+ 50.0,
213
+ loudspeaker_cfg.acoustical.effective_diameter * 1e2,
214
+ )
215
+ slider_spk2_diam /= 1e2
216
+
217
+ # Speaker 1 simulation
218
+ thiele_small_params_1 = {
219
+ "Re": slider_spk1_Re,
220
+ "Le": slider_spk1_Le,
221
+ "Bl": slider_spk1_Bl,
222
+ "Mm": slider_spk1_Mm,
223
+ "Cm": slider_spk1_Cm,
224
+ "Rm": slider_spk1_Rm,
225
+ "effective_diameter": slider_spk1_diam,
226
+ }
227
+
228
+ loudspeaker_responses_1 = simulate_loudspeaker(
229
+ thiele_small_params_1, angular_freq_array, cfg.acoustical_constants
230
+ )
231
+
232
+ # Speaker 2 simulation
233
+ thiele_small_params_2 = {
234
+ "Re": slider_spk2_Re,
235
+ "Le": slider_spk2_Le,
236
+ "Bl": slider_spk2_Bl,
237
+ "Mm": slider_spk2_Mm,
238
+ "Cm": slider_spk2_Cm,
239
+ "Rm": slider_spk2_Rm,
240
+ "effective_diameter": slider_spk2_diam,
241
+ }
242
+
243
+ loudspeaker_responses_2 = simulate_loudspeaker(
244
+ thiele_small_params_2, angular_freq_array, cfg.acoustical_constants
245
+ )
246
+
247
+ with plots:
248
+ plotly_fig = plotly_full_figure(
249
+ freq_array, loudspeaker_responses_1, loudspeaker_responses_2
250
+ )
251
+ st.plotly_chart(plotly_fig)