Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
H
HDL
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
RTSD
HDL
Commits
10b44351
Commit
10b44351
authored
2 years ago
by
Eric Kooistra
Browse files
Options
Downloads
Patches
Plain Diff
Minor updates.
parent
7ab94702
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Pipeline
#34868
passed
2 years ago
Stage: simulation
Stage: synthesis
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
applications/lofar2/model/lofar2_station_sdp_firmware_model.ipynb
+132
-34
132 additions, 34 deletions
...ions/lofar2/model/lofar2_station_sdp_firmware_model.ipynb
applications/lofar2/model/signal_statistics.ipynb
+77
-87
77 additions, 87 deletions
applications/lofar2/model/signal_statistics.ipynb
with
209 additions
and
121 deletions
applications/lofar2/model/lofar2_station_sdp_firmware_model.ipynb
+
132
−
34
View file @
10b44351
...
...
@@ -19,7 +19,7 @@
},
{
"cell_type": "code",
"execution_count":
1
,
"execution_count":
2
,
"id": "2b477516",
"metadata": {},
"outputs": [],
...
...
@@ -38,7 +38,7 @@
},
{
"cell_type": "code",
"execution_count":
2
,
"execution_count":
3
,
"id": "e1b6fa12",
"metadata": {},
"outputs": [
...
...
@@ -68,7 +68,7 @@
},
{
"cell_type": "code",
"execution_count":
3
,
"execution_count":
4
,
"id": "eb325c9c",
"metadata": {},
"outputs": [
...
...
@@ -98,7 +98,7 @@
},
{
"cell_type": "code",
"execution_count":
4
,
"execution_count":
5
,
"id": "3e71626f",
"metadata": {},
"outputs": [
...
...
@@ -135,7 +135,7 @@
},
{
"cell_type": "code",
"execution_count":
7
,
"execution_count":
6
,
"id": "def6eba7",
"metadata": {},
"outputs": [
...
...
@@ -166,10 +166,10 @@
"\n",
"# . DFT size\n",
"N_points = 1024\n",
"N_bins = N_points // 2 + 1 # positive frequency bins including DC and
F
_s/2\n",
"N_bins = N_points // 2 + 1 # positive frequency bins including DC and
f
_s/2\n",
"\n",
"# . select a bin\n",
"i_bin = 200 # bin index in range(N_
points // 2
)\n",
"i_bin = 200 # bin index in range(N_
bins
)\n",
"\n",
"# . time and frequency axis\n",
"f_s = f_adc # sample frequency\n",
...
...
@@ -207,7 +207,7 @@
},
{
"cell_type": "code",
"execution_count":
12
,
"execution_count":
7
,
"id": "0ec00484",
"metadata": {},
"outputs": [
...
...
@@ -221,10 +221,11 @@
"subband_weight_im = 0\n",
"\n",
"G_subband = 0.994817 * 0.5 * 2**4 * 1.0 = 7.958536\n",
" . G_fir_dc = 0.994817\n",
" . G_fft_real_input_sine = 0.5\n",
" . W_sub_gain = 4\n",
" . subband_weight_gain = 1.0\n"
" . G_fir_dc = 0.994817\n",
" . G_fft_real_input_sine = 0.5\n",
" . W_sub_proc = 4.5\n",
" . W_sub_gain = 4\n",
" . subband_weight_gain = 1.0\n"
]
}
],
...
...
@@ -235,7 +236,7 @@
"\n",
"# . Signal level bit growth to accomodate processing gain of FFT\n",
"W_sub_proc = np.log2(np.sqrt(N_sub))\n",
"W_sub_gain = 4\n",
"W_sub_gain = 4
# use W_sub_gain instead of W_sub_proc
\n",
"\n",
"# Subband equalizer (E_sub)\n",
"subband_weight_gain = 1.0\n",
...
...
@@ -255,13 +256,14 @@
"print(f\"G_subband = {G_fir_dc} * {G_fft_real_input_sine} * 2**{W_sub_gain} * {subband_weight_gain} = {G_subband}\")\n",
"print(\" . G_fir_dc =\", G_fir_dc)\n",
"print(\" . G_fft_real_input_sine =\", G_fft_real_input_sine)\n",
"print(\" . W_sub_proc =\", W_sub_proc)\n",
"print(\" . W_sub_gain =\", W_sub_gain)\n",
"print(\" . subband_weight_gain =\", subband_weight_gain)"
]
},
{
"cell_type": "code",
"execution_count":
1
8,
"execution_count": 8,
"id": "4d197368",
"metadata": {},
"outputs": [
...
...
@@ -275,10 +277,10 @@
"beamlet_weight_im = 0\n",
"\n",
"BF for coherent input:\n",
" .
W_
bf_proc = 10.00 for N_ant = 10\n",
" . bf_proc = 10.00 for N_ant = 10\n",
"\n",
"BF for incoherent input:\n",
" .
W_
bf_proc = 3.16 for N_ant = 10\n",
" . bf_proc = 3.16 for N_ant = 10\n",
"\n"
]
}
...
...
@@ -329,12 +331,21 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
9
,
"id": "f66c5028",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"P_bit_dB = 6.02 dB\n"
]
}
],
"source": [
"# Bit\n",
"# . Each bit yields a factor 2 in voltage, so a factor 2**2 = 4 in power \n",
"P_bit = 2**2\n",
"P_bit_dB = 10 * np.log10(P_bit)\n",
"print(f\"P_bit_dB = {P_bit_dB:.2f} dB\")"
...
...
@@ -342,12 +353,27 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
10
,
"id": "a9fca052",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"P_quant = 0.083333\n",
"P_quant_dB = -10.79 dB = -1.8 bit\n",
"sigma_quant = 0.29 q\n"
]
}
],
"source": [
"# Quantization noise\n",
"# . The quantization noise power is q**2 * 1 / 12, so the standard deviation\n",
"# of the quantization noise is q * sqrt(1 / 12) < q = one LSbit\n",
"# . The quantization noise power is at a level of -10.79 dB or -1.8 bit.\n",
"# . The 0 dB power level corresponds to the power of one LSbit, so q**2 \n",
"P_quant = 1 / 12 # for W >> 1 [2]\n",
"P_quant_dB = 10 * np.log10(P_quant)\n",
"sigma_quant = np.sqrt(P_quant)\n",
...
...
@@ -359,14 +385,27 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
11
,
"id": "d9972b6b",
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# System noise\n",
"n = np.arange(1,9)\n",
"sigma_sys = n\n",
"sigma_sys = n
# = n * q, so n LSbits
\n",
"P_sys = sigma_sys**2\n",
"P_tot = P_sys + P_quant\n",
"sigma_tot = np.sqrt(P_tot)\n",
...
...
@@ -381,10 +420,21 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
12
,
"id": "be2d952f",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"W_adc = {W_adc} bits\n",
"FS = 8192\n",
"sigma_fs_sine = 5792.6 q\n",
"P_fs_sine_dB = 75.26 dB = 12.5 bit\n"
]
}
],
"source": [
"# FS sine\n",
"P_fs_sine = FS**2 / 2\n",
...
...
@@ -397,10 +447,19 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
13
,
"id": "a9e7fabc",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"SNR_dB = P_fs_sine_dB - P_quant_dB = 75.26 - -10.79 = 86.05 dB\n"
]
}
],
"source": [
"# SNR\n",
"SNR = P_fs_sine / P_quant\n",
...
...
@@ -412,10 +471,23 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
14
,
"id": "92852a53",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Power at -50dBFS = 25.26 dB, so sigma = 18.3 q, ampl = 25.9 q\n",
"\n",
"sigma = 16 q corresponds to:\n",
" . Power = 24.08 dB, so at -51.2 dBFS\n",
" . Range 3 sigma = +-48 q\n",
" . Sine with amplitude A = sigma * sqrt(2) = 22.6 q\n"
]
}
],
"source": [
"# -50 dbFS level\n",
"Power_50dBFS = P_fs_sine_dB - 50 \n",
...
...
@@ -445,10 +517,20 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
15
,
"id": "a04af043",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ADC sigma = 5792.6 q = 12.5 bits: P_ast = 6.710886e+15, uses 52.6 bits, is 0 dBFS = FS sine\n",
"ADC sigma = 18.3 q = 4.2 bits: P_ast = 6.710886e+10, uses 36.0 bits, is -50dBFS\n",
"ADC sigma = 16.0 q = 4.0 bits: P_ast = 5.120000e+10, uses 35.6 bits\n"
]
}
],
"source": [
"# ADC power statistic (AST)\n",
"sigma = sigma_fs_sine\n",
...
...
@@ -469,10 +551,26 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
16
,
"id": "0b2ac36c",
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Signal input level --> Expected subband level and SST level:\n",
"\n",
" ampl_si ampl_sub #bits SST #bits\n",
" 8192.0 65196.3 15.9925 8.301877e+14 49.6\n",
" 25.9 206.2 7.6877 8.301877e+09 33.0\n",
" 16.0 127.3 6.9925 3.166915e+09 31.6\n",
"\n",
"sigma_si sigma_sub #bits SST #bits\n",
" 22.6 180.1 7.4925 6.333830e+09 32.6\n"
]
}
],
"source": [
"# Subband filterbank (F_sub)\n",
"ampl_sub_fs = FS * G_subband # subband amplitude for FS signal input sine\n",
...
...
@@ -502,7 +600,7 @@
},
{
"cell_type": "code",
"execution_count":
null
,
"execution_count":
17
,
"id": "f0b09a83",
"metadata": {},
"outputs": [],
...
...
%% Cell type:markdown id:82c10597 tags:
# LOFAR2.0 Station SDP Firmware quantization model
Author: Eric Kooistra, 18 May 2022
Purpose: Model the expected signal levels in the SDP firmware and clarify calculations in [1].
References:
1.
https://support.astron.nl/confluence/display/L2M/L4+SDPFW+Decision%3A+LOFAR2.0+SDP+Firmware+Quantization+Model
2.
Understanding digital signal processing, R.G. Lyons
%% Cell type:code id:2b477516 tags:
```
python
import
numpy
as
np
import
matplotlib.pyplot
as
plt
```
%% Cell type:markdown id:c2cc6c7a tags:
## 1 SDP Parameters
%% Cell type:code id:e1b6fa12 tags:
```
python
# SDP
N_complex
=
2
N_fft
=
1024
N_sub
=
N_fft
/
N_complex
f_adc
=
200e6
# Hz
f_sub
=
f_adc
/
N_fft
T_int
=
1
# s
N_int
=
f_adc
*
T_int
N_int_sub
=
f_sub
*
T_int
print
(
f
"
N_int =
{
N_int
:
.
0
f
}
"
)
print
(
f
"
N_int_sub =
{
N_int_sub
:
.
1
f
}
"
)
```
%% Output
N_int = 200000000
N_int_sub = 195312.5
%% Cell type:code id:eb325c9c tags:
```
python
# Signal data widths and full scale
W_adc
=
14
W_subband
=
18
W_crosslet
=
16
W_beamlet_sum
=
18
W_beamlet
=
8
W_statistic
=
64
FS
=
2
**
(
W_adc
-
1
)
# full scale
sigma_fs_sine
=
FS
/
np
.
sqrt
(
2
)
print
(
"
FS =
"
,
FS
)
print
(
f
"
sigma_fs_sine =
{
sigma_fs_sine
:
.
1
f
}
"
)
```
%% Output
FS = 8192
sigma_fs_sine = 5792.6
%% Cell type:code id:3e71626f tags:
```
python
# Widths of coefficients and weights
W_fir_coef
=
16
W_sub_weight
=
16
W_sub_weight_fraction
=
13
W_sub_weight_magnitude
=
W_sub_weight
-
W_sub_weight_fraction
-
1
W_bf_weight
=
16
W_bf_weight_fraction
=
14
W_bf_weight_magnitude
=
W_bf_weight
-
W_bf_weight_fraction
-
1
W_beamlet_scale
=
16
W_beamlet_scale_fraction
=
15
W_beamlet_scale_magnitude
=
W_beamlet_scale
-
W_beamlet_scale_fraction
Unit_sub_weight
=
2
**
W_sub_weight_fraction
Unit_bf_weight
=
2
**
W_bf_weight_fraction
Unit_beamlet_scale
=
2
**
W_beamlet_scale_fraction
print
(
"
Unit_sub_weight =
"
,
Unit_sub_weight
)
print
(
"
Unit_bf_weight =
"
,
Unit_bf_weight
)
print
(
"
Unit_beamlet_scale =
"
,
Unit_beamlet_scale
)
```
%% Output
Unit_sub_weight = 8192
Unit_bf_weight = 16384
Unit_beamlet_scale = 32768
%% Cell type:code id:def6eba7 tags:
```
python
# DFT of real sine input --> show that:
G_fft_real_input_sine
=
0.5
G_fft_real_input_dc
=
1.0
# . DFT size
N_points
=
1024
N_bins
=
N_points
//
2
+
1
# positive frequency bins including DC and
F
_s/2
N_bins
=
N_points
//
2
+
1
# positive frequency bins including DC and
f
_s/2
# . select a bin
i_bin
=
200
# bin index in range(N_
points // 2
)
i_bin
=
200
# bin index in range(N_
bins
)
# . time and frequency axis
f_s
=
f_adc
# sample frequency
f_s
=
1
# normalized sample frequency
T_s
=
1
/
f_s
# sample period
T_fft
=
N_points
*
T_s
# DFT period
t_axis
=
np
.
linspace
(
0
,
T_fft
,
N_points
,
endpoint
=
False
)
f_axis
=
np
.
linspace
(
0
,
f_s
,
N_points
,
endpoint
=
False
)
f_axis_fft
=
f_axis
-
f_s
/
2
# fftshift axis
f_axis_rfft
=
f_axis
[
0
:
N_bins
]
# positive frequency bins
f_bin
=
i_bin
/
N_points
*
f_s
# bin frequency
# . create sine at bin, use cos to see DC at i_bin = 0
x
=
np
.
cos
(
2
*
np
.
pi
*
f_bin
*
t_axis
)
# . DFT using complex input fft()
X_fft
=
np
.
fft
.
fftshift
(
np
.
fft
.
fft
(
x
)
/
N_points
)
# . DFT using real input rfft()
X_rfft
=
np
.
fft
.
rfft
(
x
)
/
N_points
plt
.
figure
(
figsize
=
(
10
,
4
))
plt
.
subplot
(
1
,
2
,
1
)
plt
.
title
(
'
DFT of real sine using fft
'
)
plt
.
plot
(
f_axis_fft
,
abs
(
X_fft
))
plt
.
grid
()
plt
.
subplot
(
1
,
2
,
2
)
plt
.
title
(
'
DFT of real sine using rfft
'
)
plt
.
plot
(
f_axis_rfft
,
abs
(
X_rfft
))
plt
.
grid
()
print
(
"
Conclusion: G_fft_real_input_sine =
"
,
G_fft_real_input_sine
)
```
%% Output
Conclusion: G_fft_real_input_sine = 0.5
%% Cell type:code id:0ec00484 tags:
```
python
# Subband filterbank (F_sub)
# . FIR filter DC gain
G_fir_dc
=
0.994817
# . Signal level bit growth to accomodate processing gain of FFT
W_sub_proc
=
np
.
log2
(
np
.
sqrt
(
N_sub
))
W_sub_gain
=
4
W_sub_gain
=
4
# use W_sub_gain instead of W_sub_proc
# Subband equalizer (E_sub)
subband_weight_gain
=
1.0
subband_weight_phase
=
0
subband_weight_re
=
int
(
subband_weight_gain
*
Unit_sub_weight
*
np
.
cos
(
subband_weight_phase
))
subband_weight_im
=
int
(
subband_weight_gain
*
Unit_sub_weight
*
np
.
sin
(
subband_weight_phase
))
print
(
"
subband_weight_gain =
"
,
subband_weight_gain
)
print
(
"
subband_weight_phase =
"
,
subband_weight_phase
)
print
(
f
"
subband_weight_re =
{
subband_weight_re
:
d
}
"
)
print
(
f
"
subband_weight_im =
{
subband_weight_im
:
d
}
"
)
print
()
# . Expected factor between subband amplitude and real signal input amplitude
G_subband
=
G_fir_dc
*
G_fft_real_input_sine
*
2
**
W_sub_gain
*
subband_weight_gain
print
(
f
"
G_subband =
{
G_fir_dc
}
*
{
G_fft_real_input_sine
}
* 2**
{
W_sub_gain
}
*
{
subband_weight_gain
}
=
{
G_subband
}
"
)
print
(
"
. G_fir_dc =
"
,
G_fir_dc
)
print
(
"
. G_fft_real_input_sine =
"
,
G_fft_real_input_sine
)
print
(
"
. W_sub_proc =
"
,
W_sub_proc
)
print
(
"
. W_sub_gain =
"
,
W_sub_gain
)
print
(
"
. subband_weight_gain =
"
,
subband_weight_gain
)
```
%% Output
subband_weight_gain = 1.0
subband_weight_phase = 0
subband_weight_re = 8192
subband_weight_im = 0
G_subband = 0.994817 * 0.5 * 2**4 * 1.0 = 7.958536
. G_fir_dc = 0.994817
. G_fft_real_input_sine = 0.5
. W_sub_gain = 4
. subband_weight_gain = 1.0
. G_fir_dc = 0.994817
. G_fft_real_input_sine = 0.5
. W_sub_proc = 4.5
. W_sub_gain = 4
. subband_weight_gain = 1.0
%% Cell type:code id:4d197368 tags:
```
python
# Digital beamformer (BF)
N_ant
=
10
# Assume all N_ant use same BF weight
beamlet_weight_gain
=
1.0
beamlet_weight_phase
=
0
beamlet_weight_re
=
int
(
beamlet_weight_gain
*
Unit_bf_weight
*
np
.
cos
(
beamlet_weight_phase
))
beamlet_weight_im
=
int
(
beamlet_weight_gain
*
Unit_bf_weight
*
np
.
sin
(
beamlet_weight_phase
))
print
(
"
beamlet_weight_gain =
"
,
beamlet_weight_gain
)
print
(
"
beamlet_weight_phase =
"
,
beamlet_weight_phase
)
print
(
f
"
beamlet_weight_re =
{
beamlet_weight_re
:
d
}
"
)
print
(
f
"
beamlet_weight_im =
{
beamlet_weight_im
:
d
}
"
)
print
()
si_types
=
[
"
coherent
"
,
"
incoherent
"
]
for
si_type
in
si_types
:
# . BF processing gain
if
si_type
==
"
coherent
"
:
bf_proc
=
N_ant
else
:
bf_proc
=
np
.
sqrt
(
N_ant
)
# . Normalize BF weights to get BF DC gain is 1.0
beamlet_weight_gain
=
1
/
bf_proc
# . Expected factor between beamlet amplitude and real signal input amplitude
G_beamlet_sum
=
N_ant
*
beamlet_weight_gain
*
G_subband
print
(
f
"
BF for
{
si_type
}
input:
"
)
print
(
f
"
. bf_proc =
{
bf_proc
:
.
2
f
}
for N_ant =
{
N_ant
}
"
)
print
()
```
%% Output
beamlet_weight_gain = 1.0
beamlet_weight_phase = 0
beamlet_weight_re = 16384
beamlet_weight_im = 0
BF for coherent input:
.
W_
bf_proc = 10.00 for N_ant = 10
. bf_proc = 10.00 for N_ant = 10
BF for incoherent input:
.
W_
bf_proc = 3.16 for N_ant = 10
. bf_proc = 3.16 for N_ant = 10
%% Cell type:markdown id:d942fcc6 tags:
## 2 Quantization model
%% Cell type:code id:f66c5028 tags:
```
python
# Bit
# . Each bit yields a factor 2 in voltage, so a factor 2**2 = 4 in power
P_bit
=
2
**
2
P_bit_dB
=
10
*
np
.
log10
(
P_bit
)
print
(
f
"
P_bit_dB =
{
P_bit_dB
:
.
2
f
}
dB
"
)
```
%% Output
P_bit_dB = 6.02 dB
%% Cell type:code id:a9fca052 tags:
```
python
# Quantization noise
# . The quantization noise power is q**2 * 1 / 12, so the standard deviation
# of the quantization noise is q * sqrt(1 / 12) < q = one LSbit
# . The quantization noise power is at a level of -10.79 dB or -1.8 bit.
# . The 0 dB power level corresponds to the power of one LSbit, so q**2
P_quant
=
1
/
12
# for W >> 1 [2]
P_quant_dB
=
10
*
np
.
log10
(
P_quant
)
sigma_quant
=
np
.
sqrt
(
P_quant
)
print
()
print
(
f
"
P_quant =
{
P_quant
:
.
6
f
}
"
)
print
(
f
"
P_quant_dB =
{
P_quant_dB
:
.
2
f
}
dB =
{
P_quant_dB
/
P_bit_dB
:
.
1
f
}
bit
"
)
print
(
f
"
sigma_quant =
{
sigma_quant
:
.
2
f
}
q
"
)
```
%% Output
P_quant = 0.083333
P_quant_dB = -10.79 dB = -1.8 bit
sigma_quant = 0.29 q
%% Cell type:code id:d9972b6b tags:
```
python
# System noise
n
=
np
.
arange
(
1
,
9
)
sigma_sys
=
n
sigma_sys
=
n
# = n * q, so n LSbits
P_sys
=
sigma_sys
**
2
P_tot
=
P_sys
+
P_quant
sigma_tot
=
np
.
sqrt
(
P_tot
)
plt
.
figure
()
plt
.
plot
(
n
,
(
P_tot
/
P_sys
-
1
)
*
100
)
plt
.
title
(
"
Increase in total noise power due to sampling
"
)
plt
.
xlabel
(
"
sigma_sys [q]
"
)
plt
.
ylabel
(
"
[%]
"
)
plt
.
grid
()
```
%% Output
%% Cell type:code id:be2d952f tags:
```
python
# FS sine
P_fs_sine
=
FS
**
2
/
2
P_fs_sine_dB
=
10
*
np
.
log10
(
P_fs_sine
)
print
(
"
W_adc = {W_adc} bits
"
)
print
(
"
FS =
"
,
FS
)
print
(
f
"
sigma_fs_sine =
{
sigma_fs_sine
:
.
1
f
}
q
"
)
print
(
f
"
P_fs_sine_dB =
{
P_fs_sine_dB
:
.
2
f
}
dB =
{
P_fs_sine_dB
/
P_bit_dB
:
.
1
f
}
bit
"
)
```
%% Output
W_adc = {W_adc} bits
FS = 8192
sigma_fs_sine = 5792.6 q
P_fs_sine_dB = 75.26 dB = 12.5 bit
%% Cell type:code id:a9e7fabc tags:
```
python
# SNR
SNR
=
P_fs_sine
/
P_quant
SNR_dB
=
10
*
np
.
log10
(
SNR
)
print
()
print
(
f
"
SNR_dB = P_fs_sine_dB - P_quant_dB =
{
P_fs_sine_dB
:
.
2
f
}
-
{
P_quant_dB
:
.
2
f
}
=
{
SNR_dB
:
.
2
f
}
dB
"
)
```
%% Output
SNR_dB = P_fs_sine_dB - P_quant_dB = 75.26 - -10.79 = 86.05 dB
%% Cell type:code id:92852a53 tags:
```
python
# -50 dbFS level
Power_50dBFS
=
P_fs_sine_dB
-
50
sigma_50dBFS
=
10
**
(
Power_50dBFS
/
20
)
ampl_50dBFS
=
sigma_50dBFS
*
np
.
sqrt
(
2
)
print
(
f
"
Power at -50dBFS =
{
Power_50dBFS
:
.
2
f
}
dB, so sigma =
{
sigma_50dBFS
:
.
1
f
}
q, ampl =
{
ampl_50dBFS
:
.
1
f
}
q
"
)
# Assume sigma = 16 q
sigma
=
16
Power
=
sigma
**
2
Power_dB
=
10
*
np
.
log10
(
Power
)
print
()
print
(
f
"
sigma =
{
sigma
:
.
0
f
}
q corresponds to:
"
)
print
(
f
"
. Power =
{
Power_dB
:
.
2
f
}
dB, so at
{
Power_dB
-
P_fs_sine_dB
:
.
1
f
}
dBFS
"
)
print
(
f
"
. Range 3 sigma = +-
{
3
*
sigma
:
.
0
f
}
q
"
)
print
(
f
"
. Sine with amplitude A = sigma * sqrt(2) =
{
np
.
sqrt
(
2
)
*
sigma
:
.
1
f
}
q
"
)
```
%% Output
Power at -50dBFS = 25.26 dB, so sigma = 18.3 q, ampl = 25.9 q
sigma = 16 q corresponds to:
. Power = 24.08 dB, so at -51.2 dBFS
. Range 3 sigma = +-48 q
. Sine with amplitude A = sigma * sqrt(2) = 22.6 q
%% Cell type:markdown id:77bb14cc tags:
## 3 Expected signal levels in the SDP FW
%% Cell type:code id:a04af043 tags:
```
python
# ADC power statistic (AST)
sigma
=
sigma_fs_sine
sigma_bits
=
np
.
log2
(
sigma
)
P_ast
=
(
sigma
)
**
2
*
N_int
print
(
f
"
ADC sigma =
{
sigma
:
6.1
f
}
q =
{
sigma_bits
:
4.1
f
}
bits: P_ast =
{
P_ast
:
e
}
, uses
{
np
.
log2
(
P_ast
)
:
.
1
f
}
bits, is 0 dBFS = FS sine
"
)
sigma
=
sigma_50dBFS
sigma_bits
=
np
.
log2
(
sigma
)
P_ast
=
(
sigma
)
**
2
*
N_int
print
(
f
"
ADC sigma =
{
sigma
:
6.1
f
}
q =
{
sigma_bits
:
4.1
f
}
bits: P_ast =
{
P_ast
:
e
}
, uses
{
np
.
log2
(
P_ast
)
:
.
1
f
}
bits, is -50dBFS
"
)
sigma
=
16
sigma_bits
=
np
.
log2
(
sigma
)
P_ast
=
(
sigma
)
**
2
*
N_int
print
(
f
"
ADC sigma =
{
sigma
:
6.1
f
}
q =
{
sigma_bits
:
4.1
f
}
bits: P_ast =
{
P_ast
:
e
}
, uses
{
np
.
log2
(
P_ast
)
:
.
1
f
}
bits
"
)
```
%% Output
ADC sigma = 5792.6 q = 12.5 bits: P_ast = 6.710886e+15, uses 52.6 bits, is 0 dBFS = FS sine
ADC sigma = 18.3 q = 4.2 bits: P_ast = 6.710886e+10, uses 36.0 bits, is -50dBFS
ADC sigma = 16.0 q = 4.0 bits: P_ast = 5.120000e+10, uses 35.6 bits
%% Cell type:code id:0b2ac36c tags:
```
python
# Subband filterbank (F_sub)
ampl_sub_fs
=
FS
*
G_subband
# subband amplitude for FS signal input sine
SST_fs
=
ampl_sub_fs
**
2
*
N_int_sub
ampl_sub_50dBFS
=
ampl_50dBFS
*
G_subband
# subband amplitude -50dBFS signal input sine
SST_50dBFS
=
ampl_sub_50dBFS
**
2
*
N_int_sub
ampl_si_16q
=
16
# [q], so 16 q is 4 bits amplitude
ampl_sub_16q
=
ampl_si_16q
*
G_subband
# subband amplitude for signal input sine with A = 16 q
SST_ampl_16q
=
ampl_sub_16q
**
2
*
N_int_sub
sigma_si_16q
=
16
*
np
.
sqrt
(
2
)
# [q], so A = 16 * sqrt(2) q for sigma = 16 q
sigma_sub_16q
=
sigma_si_16q
*
G_subband
# subband sigma for arbitrary signal input with sigma = 16 q
SST_sigma_16q
=
sigma_sub_16q
**
2
*
N_int_sub
print
(
"
Signal input level --> Expected subband level and SST level:
"
)
print
()
print
(
"
ampl_si ampl_sub #bits SST #bits
"
)
print
(
f
"
{
FS
:
8.1
f
}
{
ampl_sub_fs
:
10.1
f
}
{
np
.
log2
(
ampl_sub_fs
)
:
8.4
f
}
{
SST_fs
:
e
}
{
np
.
log2
(
SST_fs
)
:
.
1
f
}
"
)
print
(
f
"
{
ampl_50dBFS
:
8.1
f
}
{
ampl_sub_50dBFS
:
10.1
f
}
{
np
.
log2
(
ampl_sub_50dBFS
)
:
8.4
f
}
{
SST_50dBFS
:
e
}
{
np
.
log2
(
SST_50dBFS
)
:
.
1
f
}
"
)
print
(
f
"
{
ampl_si_16q
:
8.1
f
}
{
ampl_sub_16q
:
10.1
f
}
{
np
.
log2
(
ampl_sub_16q
)
:
8.4
f
}
{
SST_ampl_16q
:
e
}
{
np
.
log2
(
SST_ampl_16q
)
:
.
1
f
}
"
)
print
()
print
(
"
sigma_si sigma_sub #bits SST #bits
"
)
print
(
f
"
{
sigma_si_16q
:
8.1
f
}
{
sigma_sub_16q
:
10.1
f
}
{
np
.
log2
(
sigma_sub_16q
)
:
8.4
f
}
{
SST_sigma_16q
:
e
}
{
np
.
log2
(
SST_sigma_16q
)
:
.
1
f
}
"
)
```
%% Output
Signal input level --> Expected subband level and SST level:
ampl_si ampl_sub #bits SST #bits
8192.0 65196.3 15.9925 8.301877e+14 49.6
25.9 206.2 7.6877 8.301877e+09 33.0
16.0 127.3 6.9925 3.166915e+09 31.6
sigma_si sigma_sub #bits SST #bits
22.6 180.1 7.4925 6.333830e+09 32.6
%% Cell type:code id:f0b09a83 tags:
```
python
# Digital beamformer (BF)
# . is a coherent beamformer = voltage beamformer
# . uses BF weights to form beamlets from sum of weighted subbands
```
%% Cell type:code id:8713e865 tags:
```
python
```
...
...
This diff is collapsed.
Click to expand it.
applications/lofar2/model/signal_statistics.ipynb
+
77
−
87
View file @
10b44351
Source diff could not be displayed: it is too large. Options to address this:
view the blob
.
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment