| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- import cmsisdsp as dsp
- import numpy as np
- from numpy.testing import assert_allclose
- from scipy.stats import entropy,tstd, tvar
- from scipy.special import logsumexp
- from scipy.linalg import cholesky,ldl,solve_triangular
- from scipy import signal
- def imToReal1D(a):
- ar=np.zeros(np.array(a.shape) * 2)
- ar[0::2]=a.real
- ar[1::2]=a.imag
- return(ar)
- def realToIm1D(ar):
- return(ar[0::2] + 1j * ar[1::2])
- print("Max and AbsMax")
- a=np.array([1.,-3.,4.,0.,-10.,8.])
- i=dsp.arm_absmax_no_idx_f32(a)
- print(i)
- assert i==10.0
- i=dsp.arm_absmax_no_idx_f64(a)
- print(i)
- assert i==10.0
- r,i=dsp.arm_absmax_f64(a)
- assert i==4
- assert r==10.0
- r,i=dsp.arm_max_f64(a)
- assert i==5
- assert r==8.0
- i=dsp.arm_max_no_idx_f32(a)
- print(i)
- assert i==8
- i=dsp.arm_max_no_idx_f64(a)
- print(i)
- assert i==8
- print("Min and AbsMin")
- a=np.array([1.,-3.,4.,0.5,-10.,8.])
- i=dsp.arm_absmin_no_idx_f32(a)
- print(i)
- assert i==0.5
- i=dsp.arm_absmin_no_idx_f64(a)
- print(i)
- assert i==0.5
- r,i=dsp.arm_absmin_f64(a)
- assert i==3
- assert r==0.5
- r,i=dsp.arm_min_f64(a)
- assert i==4
- assert r==-10
- i=dsp.arm_min_no_idx_f32(a)
- print(i)
- assert i==-10
- i=dsp.arm_min_no_idx_f64(a)
- print(i)
- assert i==-10
- print("Barycenter")
- a=[0] * 12
- w=np.array([[2] * 12])
- w[0,11]=3
- a[0] =[0., 0., -0.951057]
- a[1] =[0., 0., 0.951057]
- a[2] =[-0.850651, 0., -0.425325]
- a[3] =[0.850651, 0., 0.425325]
- a[4] =[0.688191, -0.5, -0.425325]
- a[5] =[0.688191, 0.5, -0.425325]
- a[6] =[-0.688191, -0.5, 0.425325]
- a[7] =[-0.688191, 0.5, 0.425325]
- a[8] =[-0.262866, -0.809017, -0.425325]
- a[9] =[-0.262866, 0.809017, -0.425325]
- a[10]=[0.262866, -0.809017, 0.425325]
- a[11]=[0.262866, 0.809017, 0.425325]
- scaled=a * w.T
- ref=np.sum(scaled,axis=0)/np.sum(w)
- print(ref)
- result=dsp.arm_barycenter_f32(np.array(a).reshape(12*3),w.reshape(12),12,3)
- print(result)
- assert_allclose(ref,result,1e-6)
- print("Weighted sum")
- nb=10
- s = np.random.randn(nb)
- w = np.random.randn(nb)
- ref=np.dot(s,w)/np.sum(w)
- print(ref)
- res=dsp.arm_weighted_sum_f32(s,w)
- print(res)
- assert_allclose(ref,res,2e-5)
- print("Entropy")
- s = np.abs(np.random.randn(nb))
- s = s / np.sum(s)
- ref=entropy(s)
- print(ref)
- res=dsp.arm_entropy_f32(s)
- print(res)
- assert_allclose(ref,res,1e-6)
- res=dsp.arm_entropy_f64(s)
- print(res)
- assert_allclose(ref,res,1e-10)
- print("Kullback-Leibler")
- sa = np.abs(np.random.randn(nb))
- sa = sa / np.sum(sa)
- sb = np.abs(np.random.randn(nb))
- sb = sb / np.sum(sb)
- ref=entropy(sa,sb)
- print(ref)
- res=dsp.arm_kullback_leibler_f32(sa,sb)
- print(res)
- assert_allclose(ref,res,1e-6)
- res=dsp.arm_kullback_leibler_f64(sa,sb)
- print(res)
- assert_allclose(ref,res,1e-10)
- print("Logsumexp")
- s = np.abs(np.random.randn(nb))
- s = s / np.sum(s)
- ref=logsumexp(s)
- print(ref)
- res=dsp.arm_logsumexp_f32(s)
- print(res)
- assert_allclose(ref,res,1e-6)
- print("Logsumexp dot prod")
- sa = np.abs(np.random.randn(nb))
- sa = sa / np.sum(sa)
- sb = np.abs(np.random.randn(nb))
- sb = sb / np.sum(sb)
- d = 0.001
- # It is a proba so must be in [0,1]
- # But restricted to ]d,1] so that the log exists
- sa = (1-d)*sa + d
- sb = (1-d)*sb + d
- ref=np.log(np.dot(sa,sb))
- print(ref)
- sa = np.log(sa)
- sb = np.log(sb)
- res=dsp.arm_logsumexp_dot_prod_f32(sa,sb)
- print(res)
- assert_allclose(ref,res,3e-6)
- print("vexp")
- sa = np.random.randn(nb)
- ref = np.exp(sa)
- print(ref)
- res=dsp.arm_vexp_f32(sa)
- print(res)
- assert_allclose(ref,res,1e-6)
- res=dsp.arm_vexp_f64(sa)
- print(res)
- assert_allclose(ref,res,1e-10)
- print("vlog")
- sa = np.abs(np.random.randn(nb)) + 0.001
- ref = np.log(sa)
- print(ref)
- res=dsp.arm_vlog_f32(sa)
- print(res)
- assert_allclose(ref,res,2e-5,1e-5)
- res=dsp.arm_vlog_f64(sa)
- print(res)
- assert_allclose(ref,res,2e-9,1e-9)
- print("Cholesky")
- a=np.array([[4,12,-16],[12,37,-43],[-16,-43,98]])
- ref=cholesky(a,lower=True)
- print(ref)
- status,res=dsp.arm_mat_cholesky_f32(a)
- print(res)
- assert_allclose(ref,res,1e-6,1e-6)
- status,res=dsp.arm_mat_cholesky_f64(a)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("LDLT")
- def swaprow(m,k,j):
- tmp = np.copy(m[j,:])
- m[j,:] = np.copy(m[k,:])
- m[k,:] = tmp
- return(m)
- # F32 test
- status,resl,resd,resperm=dsp.arm_mat_ldlt_f32(a)
- n=3
- p=np.identity(n)
- for k in range(0,n):
- p = swaprow(p,k,resperm[k])
- res=resl.dot(resd).dot(resl.T)
- permutedSrc=p.dot(a).dot(p.T)
- print(res)
- print(permutedSrc)
- assert_allclose(permutedSrc,res,1e-5,1e-5)
- # F64 test
- print("LDLT F64")
- status,resl,resd,resperm=dsp.arm_mat_ldlt_f64(a)
- n=3
- p=np.identity(n)
- for k in range(0,n):
- p = swaprow(p,k,resperm[k])
- res=resl.dot(resd).dot(resl.T)
- permutedSrc=p.dot(a).dot(p.T)
- print(res)
- print(permutedSrc)
- assert_allclose(permutedSrc,res,1e-9,1e-9)
- print("Solve lower triangular")
- a = np.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
- b = np.array([[4,2,4,2],[8,4,8,4]]).T
- x = solve_triangular(a, b,lower=True)
- print(a)
- print(b)
- print(x)
- b = np.array([[4,2,4,2],[8,4,8,4]]).T
- status,res=dsp.arm_mat_solve_lower_triangular_f32(a,b)
- print(res)
- assert_allclose(x,res,1e-5,1e-5)
- b = np.array([[4,2,4,2],[8,4,8,4]]).T
- status,res=dsp.arm_mat_solve_lower_triangular_f64(a,b)
- print(res)
- assert_allclose(x,res,1e-9,1e-9)
- print("Solve upper triangular")
- a = np.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
- b = np.array([[4,2,4,2],[8,4,8,4]]).T
- x = solve_triangular(a.T, b,lower=False)
- print(a.T)
- print(b)
- print(x)
- b = np.array([[4,2,4,2],[8,4,8,4]]).T
- status,res=dsp.arm_mat_solve_upper_triangular_f32(a.T,b)
- print(res)
- assert_allclose(x,res,1e-5,1e-5)
- b = np.array([[4,2,4,2],[8,4,8,4]]).T
- status,res=dsp.arm_mat_solve_upper_triangular_f64(a.T,b)
- print(res)
- assert_allclose(x,res,1e-9,1e-9)
- print("Mat mult f64")
- a = np.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
- b = np.array([[4,2,4,2],[8,4,8,4]]).T
- ref =a.dot(b)
- print(ref)
- status,res = dsp.arm_mat_mult_f64(a,b)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("mat sub f64")
- a = np.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
- b = a.T
- ref = a - b
- print(ref)
- status,res = dsp.arm_mat_sub_f64(a,b)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("abs f64")
- s = np.random.randn(nb)
- ref = np.abs(s)
- res=dsp.arm_abs_f64(s)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("add f64")
- sa = np.random.randn(nb)
- sb = np.random.randn(nb)
- ref = sa + sb
- res=dsp.arm_add_f64(sa,sb)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("sub f64")
- sa = np.random.randn(nb)
- sb = np.random.randn(nb)
- ref = sa - sb
- res=dsp.arm_sub_f64(sa,sb)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("dot prod f64")
- sa = np.random.randn(nb)
- sb = np.random.randn(nb)
- ref = sa.dot(sb)
- res=dsp.arm_dot_prod_f64(sa,sb)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("mult f64")
- sa = np.random.randn(nb)
- sb = np.random.randn(nb)
- ref = sa * sb
- res=dsp.arm_mult_f64(sa,sb)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("negate f64")
- sa = np.random.randn(nb)
- ref = -sa
- res=dsp.arm_negate_f64(sa)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("offset f64")
- sa = np.random.randn(nb)
- ref = sa + 0.1
- res=dsp.arm_offset_f64(sa,0.1)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("scale f64")
- sa = np.random.randn(nb)
- ref = sa * 0.1
- res=dsp.arm_scale_f64(sa,0.1)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("mean f64")
- sa = np.random.randn(nb)
- ref = np.mean(sa)
- res=dsp.arm_mean_f64(sa)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("power f64")
- sa = np.random.randn(nb)
- ref = np.sum(sa * sa)
- res=dsp.arm_power_f64(sa)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("std f64")
- sa = np.random.randn(nb)
- ref = tstd(sa)
- res=dsp.arm_std_f64(sa)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("variance f64")
- sa = np.random.randn(nb)
- ref = tvar(sa)
- res=dsp.arm_var_f64(sa)
- print(ref)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("fill f64")
- nb=20
- ref = np.ones(nb)*4.0
- res = dsp.arm_fill_f64(4.0,nb)
- assert_allclose(ref,res,1e-10,1e-10)
- print("copy f64")
- nb=20
- sa = np.random.randn(nb)
- ref = sa
- res = dsp.arm_copy_f64(sa)
- assert_allclose(ref,res,1e-10,1e-10)
- print("arm_div_q63_to_q31")
- den=0x7FFF00000000
- num=0x10000
- ref=den//num
- res=dsp.arm_div_q63_to_q31(den,num)
- print(ref)
- print(res)
- print("fir f64")
- firf64 = dsp.arm_fir_instance_f64()
- dsp.arm_fir_init_f64(firf64,3,[1.,2,3],[0,0,0,0,0,0,0])
- filtered_x = signal.lfilter([3,2,1.], 1.0, [1,2,3,4,5,1,2,3,4,5])
- print(filtered_x)
- ra=dsp.arm_fir_f64(firf64,[1,2,3,4,5])
- rb=dsp.arm_fir_f64(firf64,[1,2,3,4,5])
- assert ((filtered_x == np.hstack([ra,rb])).all)
- print("arm_cmplx_mag")
- sa = np.random.randn(nb)
- ca = realToIm1D(sa)
- ref = np.abs(ca)
- print(ref)
- res=dsp.arm_cmplx_mag_f32(sa)
- print(res)
- assert_allclose(ref,res,1e-6,1e-6)
- res=dsp.arm_cmplx_mag_f64(sa)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("arm_cmplx_mag_squared")
- sa = np.random.randn(nb)
- ca = realToIm1D(sa)
- ref = np.abs(ca) * np.abs(ca)
- print(ref)
- res=dsp.arm_cmplx_mag_squared_f32(sa)
- print(res)
- assert_allclose(ref,res,1e-6,1e-6)
- res=dsp.arm_cmplx_mag_squared_f64(sa)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
- print("cmplx mult")
- sa = np.random.randn(nb)
- ca = realToIm1D(sa)
- sb = np.random.randn(nb)
- cb = realToIm1D(sb)
- ref = imToReal1D(ca * cb)
- print(ref)
- res = dsp.arm_cmplx_mult_cmplx_f32(sa,sb)
- print(res)
- assert_allclose(ref,res,1e-6,1e-6)
- res = dsp.arm_cmplx_mult_cmplx_f64(sa,sb)
- print(res)
- assert_allclose(ref,res,1e-10,1e-10)
|