forked from M-Labs/artiq
fir: cleanup halfgen4
This commit is contained in:
parent
5f3033b518
commit
f310274e39
|
@ -1,11 +1,10 @@
|
||||||
from operator import add
|
from operator import add
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
from collections import namedtuple
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from migen import *
|
from migen import *
|
||||||
|
|
||||||
|
|
||||||
def halfgen4(width, n):
|
def halfgen4(width, n, df=1e-3):
|
||||||
"""
|
"""
|
||||||
http://recycle.lbl.gov/~ldoolitt/halfband
|
http://recycle.lbl.gov/~ldoolitt/halfband
|
||||||
|
|
||||||
|
@ -24,13 +23,18 @@ def halfgen4(width, n):
|
||||||
|
|
||||||
target = .5*np.ones_like(wfit)
|
target = .5*np.ones_like(wfit)
|
||||||
basis = np.cos(wfit*np.arange(1, 2*n, 2))
|
basis = np.cos(wfit*np.arange(1, 2*n, 2))
|
||||||
l = np.linalg.pinv(basis)@target
|
|
||||||
|
|
||||||
weight = np.ones_like(wfit)
|
weight = np.ones_like(wfit)
|
||||||
|
|
||||||
|
f0 = None
|
||||||
|
|
||||||
for i in range(40):
|
for i in range(40):
|
||||||
err = np.fabs(basis@l - .5)
|
|
||||||
weight[err > .99*np.max(err)] *= 1 + 1.5/(i + 11)
|
|
||||||
l = np.linalg.pinv(basis*weight)@(target*weight)
|
l = np.linalg.pinv(basis*weight)@(target*weight)
|
||||||
|
err = np.fabs(basis@l - .5)
|
||||||
|
f = np.max(err)/np.mean(err)
|
||||||
|
if f0 and (f0 - f)/(f0 + f) < df/2:
|
||||||
|
break
|
||||||
|
f0 = f
|
||||||
|
weight[err > (1 - df)*np.max(err)] *= 1 + 1.5/(i + 11)
|
||||||
a = np.c_[l, np.zeros_like(l)].ravel()[:-1]
|
a = np.c_[l, np.zeros_like(l)].ravel()[:-1]
|
||||||
a = np.r_[a[::-1], 1, a]/2
|
a = np.r_[a[::-1], 1, a]/2
|
||||||
return a
|
return a
|
||||||
|
|
Loading…
Reference in New Issue