In [1]:
import numpy as np
import sympy as sy
from sympy import I, exp
from sympy.utilities.codegen import codegen
In [2]:
z = sy.symbols("z", real=False)
wn, zeta, a,h,r1,r2,r3, s0,s1, s2,s3 = sy.symbols("wn, zeta,a,h,r1,r2,r3, s0,s1,s2,s3", real=True)
In [5]:
pc1 = -wn*zeta + I*wn*sy.sqrt(1-zeta**2)
pc2 = -wn*zeta - I*wn*sy.sqrt(1-zeta**2)
hn = 0.14
rd = exp(-wn*zeta*h)
argd = wn*sy.sqrt(1-zeta**2)*h
reald = rd*sy.cos(argd)
imd = rd*sy.sin(argd)
Ac = sy.poly( ((z**2 - 2*reald*z + rd**2)*z**2).subs(h,hn).subs(wn, 2*np.sqrt(2)).subs(zeta, 0.707), z )
ad = sy.exp(-a*h).subs(h,hn)
Ao = sy.poly( ((z-ad)**3).subs(h, hn), z )
Acl = Ac*Ao
# Assume anti-aliasing filter corresponding to a delay of two sample periods
A = sy.poly( ((z-1)*(z-exp(-2*h))*z**2).subs(h,hn), z )
B = sy.poly( ((-1+h+exp(-2*h))*z + 1-(1+h)*exp(-2*h)).subs(h,hn), z)
print Ao
print Ac
In [4]:
print B
print A
In [6]:
R = sy.poly(z**3 + r1*z**2+r2*z+r3, z)
S = sy.poly(s0*z**3 + s1*z**2 + s2*z + s3, z)
print A*R+B*S
print Acl
dioph=(A*R+B*S-Acl).all_coeffs()
In [7]:
sol=sy.solve(dioph, (r1,r2, r3, s0,s1,s2, s3))
print sol
In [8]:
# Reorganize solution expression for matlab code generation
sol_expr = ('RST_example_aliasing', [sol[r1], sol[r2], sol[r3], sol[s0], sol[s1], sol[s2], sol[s3], Ac.subs(z, 1)/B.subs(z,1), ad])
In [9]:
# Export to matlab code
[(m_name, m_code)] = codegen(sol_expr, 'octave')
In [10]:
print m_code
with open("/home/kjartan/Dropbox/undervisning/tec/MR2007/matlab/RST_example_aliasing.m", "w") as text_file:
text_file.write(m_code)