-
Notifications
You must be signed in to change notification settings - Fork 0
/
static_dac_model.py
82 lines (63 loc) · 1.99 KB
/
static_dac_model.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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Generate DAC output assuming a simple static non-linear model
@author: Arnfinn Eielsen
@date: 22.02.2024
@license: BSD 3-Clause
"""
import numpy as np
class quantiser_type:
midtread = 1
midriser = 2
def quantise_signal(w, Qstep, Qtype):
"""
Quantise a signal with given quantiser specifications
"""
match Qtype:
case quantiser_type.midtread:
q = np.floor(w/Qstep + 0.5) # truncated/quantised value, mid-tread
case quantiser_type.midriser:
q = np.floor(w/Qstep) + 0.5 # truncated/quantised value, mid-riser
return q
def generate_codes(q, Nb, Qtype):
"""
Generate codes for quantised signal with given quantiser specifications
"""
match Qtype:
case quantiser_type.midtread:
#c = q - np.floor(Vmin/Qstep) # code, mid-tread
c = q + 2**(Nb-1) # code, mid-tread
case quantiser_type.midriser:
#c = q - np.floor(Vmin/Qstep) - 0.5 # code, mid-riser
c = q + 2**(Nb-1) - 0.5 # code, mid-riser
return c.astype(int)
def generate_dac_output(C, ML):
"""
Table look-up to implement a simple static non-linear DAC model
Parameters
----------
C
input codes, one channel per row, must be integers, 2d array
ML
static DAC model output levels, one channel per row, 2d array
Returns
-------
Y
emulated DAC output
"""
if C.shape[0] > ML.shape[0]:
print(C.shape[0])
print(ML.shape[0])
raise ValueError('Not enough channels in model.')
Y = np.zeros(C.shape)
match 2:
case 1: # use loops
for k in range(0,C.shape[0]):
for j in range(0,C.shape[1]):
c = C[k,j]
ml = ML[k,c]
Y[k,j] = ml
case 2: # use numpy indexing
for k in range(0,C.shape[0]):
Y[k,:] = ML[k,C[k,:]]
return Y