blob: 428d3513089fcfd51c72679a863113b0f3805793 [file] [log] [blame]
Christophe Favergeon18383772021-04-30 15:00:14 +02001import cmsisdsp as dsp
2import numpy as np
3from scipy import signal
4from scipy.fftpack import dct
5import fixedpoint as f
6from pyquaternion import Quaternion
7
8import colorama
9from colorama import init,Fore, Back, Style
10import statsmodels.tsa.stattools
11
12import scipy.spatial
13
14
15init()
16
17def printTitle(s):
18 print("\n" + Fore.GREEN + Style.BRIGHT + s + Style.RESET_ALL)
19
20def printSubTitle(s):
21 print("\n" + Style.BRIGHT + s + Style.RESET_ALL)
22
23
24def imToReal2D(a):
25 ar=np.zeros(np.array(a.shape) * [1,2])
26 ar[::,0::2]=a.real
27 ar[::,1::2]=a.imag
28 return(ar)
29
30def realToIm2D(ar):
31 return(ar[::,0::2] + 1j * ar[::,1::2])
32
33def normalize(a):
34 return(a/np.max(np.abs(a)))
35
36def autocorr(x):
37 result = np.correlate(x, x, mode='full')
38 return result[result.size//2:]
39
40#################### MAX AND ABSMAX ##################################
41printTitle("Max and AbsMax")
42a=np.array([1.,-3.,4.,0.,-10.,8.])
43
44printSubTitle("Float tests")
45i=dsp.arm_max_f32(a)
46print(i)
47
48i=dsp.arm_absmax_f32(a)
49print(i)
50
51printSubTitle("Fixed point tests")
52
53# Normalize for fixed point tests
54a = a / i[0]
55
56a31 = f.toQ31(a)
57i=dsp.arm_absmax_q31(a31)
58print(f.Q31toF32(i[0]),i[1])
59
60a8 = f.toQ15(a)
61i=dsp.arm_absmax_q15(a8)
62print(f.Q15toF32(i[0]),i[1])
63
64a7 = f.toQ7(a)
65i=dsp.arm_absmax_q7(a7)
66print(f.Q7toF32(i[0]),i[1])
67
68################### MIN AND ABSMIN ################################
69
70printTitle("Min and AbsMin")
71a=np.array([1.,-3.,4.,0.5,-10.,8.])
72
73printSubTitle("Float tests")
74i=dsp.arm_min_f32(a)
75print(i)
76
77i=dsp.arm_absmin_f32(a)
78print(i)
79
80printSubTitle("Fixed point tests")
81
82# Normalize for fixed point tests
83idx=i[1]
84i=dsp.arm_absmax_f32(a)
85a = a / i[0]
86print(a)
87print(a[idx])
88
89a31 = f.toQ31(a)
90i=dsp.arm_absmin_q31(a31)
91print(f.Q31toF32(i[0]),i[1])
92
93a8 = f.toQ15(a)
94i=dsp.arm_absmin_q15(a8)
95print(f.Q15toF32(i[0]),i[1])
96
97a7 = f.toQ7(a)
98i=dsp.arm_absmin_q7(a7)
99print(f.Q7toF32(i[0]),i[1])
100
101##################### CLIPPING ###################
102printTitle("Clipping tests tests")
103a=np.array([1.,-3.,4.,0.5,-10.,8.])
104i=dsp.arm_absmax_f32(a)
105
106minBound =-5.0
107maxBound =6.0
108b=dsp.arm_clip_f32(a,minBound,maxBound)
109print(a)
110print(b)
111
112a = a / i[0]
113print(a)
114minBound = minBound / i[0]
115maxBound = maxBound / i[0]
116print(minBound,maxBound)
117
118b=dsp.arm_clip_q31(f.toQ31(a),f.toQ31(minBound),f.toQ31(maxBound))
119print(f.Q31toF32(b))
120
121b=dsp.arm_clip_q15(f.toQ15(a),f.toQ15(minBound),f.toQ15(maxBound))
122print(f.Q15toF32(b))
123
124b=dsp.arm_clip_q7(f.toQ7(a),f.toQ7(minBound),f.toQ7(maxBound))
125print(f.Q7toF32(b))
126
127############### MAT VECTOR MULT
128
129printTitle("Matrix x Vector")
130a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
131b=np.array([-2,-1,3,4])
132
133c = np.dot(a,b)
134print(c)
135c = dsp.arm_mat_vec_mult_f32(a,b)
136print(c)
137
138printSubTitle("Fixed point")
139normalizationFactor=2.0*np.sqrt(np.max(np.abs(c)))
140a=a/normalizationFactor
141b=b/normalizationFactor
142print(np.dot(a,b))
143
144c=dsp.arm_mat_vec_mult_q31(f.toQ31(a),f.toQ31(b))
145print(f.Q31toF32(c))
146
147c=dsp.arm_mat_vec_mult_q15(f.toQ15(a),f.toQ15(b))
148print(f.Q15toF32(c))
149
150c=dsp.arm_mat_vec_mult_q7(f.toQ7(a),f.toQ7(b))
151print(f.Q7toF32(c))
152
153############### MATRIX MULTIPLY
154
155printTitle("Matrix x Matrix")
156
157a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
158b=np.array([[1.,2,3],[5.1,6,7],[9.1,10,11],[5,8,4]])
159print(np.dot(a , b))
160c=dsp.arm_mat_mult_f32(a,b)
161print(c[1])
162
163printSubTitle("Fixed point")
164
165normalizationFactor=2.0*np.sqrt(np.max(np.abs(c[1])))
166a = a / normalizationFactor
167b = b / normalizationFactor
168c=dsp.arm_mat_mult_f32(a,b)
169print(c[1])
170
171print("")
172af = f.toQ31(a)
173bf = f.toQ31(b)
174c = dsp.arm_mat_mult_q31(af,bf)
175print(f.Q31toF32(c[1]))
176
177print("")
178af = f.toQ15(a)
179bf = f.toQ15(b)
180s=bf.shape
181nb=s[0]*s[1]
182tmp=np.zeros(nb)
183c = dsp.arm_mat_mult_q15(af,bf,tmp)
184print(f.Q15toF32(c[1]))
185
186print("")
187af = f.toQ7(a)
188bf = f.toQ7(b)
189s=bf.shape
190nb=s[0]*s[1]
191tmp=np.zeros(nb)
192c = dsp.arm_mat_mult_q7(af,bf,tmp)
193print(f.Q7toF32(c[1]))
194
195################# MAT TRANSPOSE #################
196
197printTitle("Transposition")
198a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
199normalizationFactor=np.max(np.abs(c[1]))
200a = a / normalizationFactor
201
202print(np.transpose(a))
203print("")
204r=dsp.arm_mat_trans_f32(a)
205print(r[1])
206print("")
207
208r=dsp.arm_mat_trans_q31(f.toQ31(a))
209print(f.Q31toF32(r[1]))
210print("")
211
212r=dsp.arm_mat_trans_q15(f.toQ15(a))
213print(f.Q15toF32(r[1]))
214print("")
215
216r=dsp.arm_mat_trans_q7(f.toQ7(a))
217print(f.Q7toF32(r[1]))
218print("")
219
220################## FILL FUNCTIONS #################
221
222v=0.22
223nb=10
224a=np.full((nb,),v)
225print(a)
226
227a=dsp.arm_fill_f32(v,nb)
228print(a)
229
230a=f.Q31toF32(dsp.arm_fill_q31(f.toQ31(v),nb))
231print(a)
232
233a=f.Q15toF32(dsp.arm_fill_q15(f.toQ15(v),nb))
234print(a)
235
236a=f.Q7toF32(dsp.arm_fill_q7(f.toQ7(v),nb))
237print(a)
238
239################# COMPLEX MAT TRANSPOSE #################
240
241printTitle("Complex Transposition")
242a=np.array([[1. + 0.0j ,2 + 1.0j,3 + 0.0j,4 + 2.0j],
243 [5 + 1.0j,6 + 2.0j,7 + 3.0j,8 + 1.0j],
244 [9 - 2.0j,10 + 1.0j,11 - 4.0j,12 + 1.0j]])
245normalizationFactor=np.max(np.abs(c[1]))
246a = a / normalizationFactor
247
248print(np.transpose(a))
249print("")
250r=dsp.arm_mat_cmplx_trans_f32(imToReal2D(a))
251print(realToIm2D(r[1]))
252print("")
253
254r=dsp.arm_mat_cmplx_trans_q31(f.toQ31(imToReal2D(a)))
255print(realToIm2D(f.Q31toF32(r[1])))
256print("")
257
258r=dsp.arm_mat_cmplx_trans_q15(f.toQ15(imToReal2D(a)))
259print(realToIm2D(f.Q15toF32(r[1])))
260print("")
261
262################ Levinson ##################
263
264printTitle("Levinson Durbin")
265na=5
266s = np.random.randn(na+1)
267s = normalize(s)
268phi = autocorr(s)
269phi = normalize(phi)
270
271sigmav,arcoef,pacf,sigma,phi1=statsmodels.tsa.stattools.levinson_durbin(phi,nlags=na,isacov=True)
272
273print(arcoef)
274print(sigmav)
275
276(a,err)=dsp.arm_levinson_durbin_f32(phi,na)
277print(a)
278print(err)
279
280phiQ31 = f.toQ31(phi)
281(aQ31,errQ31)=dsp.arm_levinson_durbin_q31(phiQ31,na)
282print(f.Q31toF32(aQ31))
283print(f.Q31toF32(errQ31))
284
285################## Bitwise operations #################
286
287printTitle("Bitwise operations")
288def genBitvectors(nb,format):
289 if format == 31:
290 maxVal = 0x7fffffff
291 if format == 15:
292 maxVal = 0x7fff
293 if format == 7:
294 maxVal = 0x7f
295
296 minVal = -maxVal-1
297
298 return(np.random.randint(minVal, maxVal, size=nb))
299
300NBSAMPLES=10
301
302
303
304printSubTitle("u32")
305su32A=genBitvectors(NBSAMPLES,31)
306su32B=genBitvectors(NBSAMPLES,31)
307ffff = (np.ones(NBSAMPLES)*(-1)).astype(np.int)
308
309
310ref=np.bitwise_and(su32A, su32B)
311#print(ref)
312result=dsp.arm_and_u32(su32A, su32B).astype(int)
313print(result-ref)
314
315ref=np.bitwise_or(su32A, su32B)
316#print(ref)
317result=dsp.arm_or_u32(su32A, su32B).astype(int)
318print(result-ref)
319
320ref=np.bitwise_xor(su32A, su32B)
321#print(ref)
322result=dsp.arm_xor_u32(su32A, su32B).astype(int)
323print(result-ref)
324
325ref=np.bitwise_xor(ffff, su32A)
326#print(ref)
327result=dsp.arm_not_u32(su32A).astype(int)
328print(result-ref)
329
330printSubTitle("u16")
331su16A=genBitvectors(NBSAMPLES,15)
332su16B=genBitvectors(NBSAMPLES,15)
333
334ffff = (np.ones(NBSAMPLES)*(-1)).astype(np.int)
335
336
337ref=np.bitwise_and(su16A, su16B)
338#print(ref)
339result=dsp.arm_and_u16(su16A, su16B).astype(np.short)
340print(result-ref)
341
342ref=np.bitwise_or(su16A, su16B)
343#print(ref)
344result=dsp.arm_or_u16(su16A, su16B).astype(np.short)
345print(result-ref)
346
347ref=np.bitwise_xor(su16A, su16B)
348#print(ref)
349result=dsp.arm_xor_u16(su16A, su16B).astype(np.short)
350print(result-ref)
351
352ref=np.bitwise_xor(ffff, su16A)
353#print(ref)
354result=dsp.arm_not_u16(su16A).astype(np.short)
355print(result-ref)
356
357printSubTitle("u8")
358
359su8A=genBitvectors(NBSAMPLES,7)
360su8B=genBitvectors(NBSAMPLES,7)
361
362ref=np.bitwise_and(su8A, su8B)
363#print(ref)
364result=dsp.arm_and_u8(su8A, su8B).astype(np.byte)
365print(result-ref)
366
367ref=np.bitwise_or(su8A, su8B)
368#print(ref)
369result=dsp.arm_or_u8(su8A, su8B).astype(np.byte)
370print(result-ref)
371
372ref=np.bitwise_xor(su8A, su8B)
373#print(ref)
374result=dsp.arm_xor_u8(su8A, su8B).astype(np.byte)
375print(result-ref)
376
377ref=np.bitwise_xor(ffff, su8A)
378#print(ref)
379result=dsp.arm_not_u8(su8A).astype(np.byte)
380print(result-ref)
381
382#################### Quaternion tests ##################
383NBSAMPLES=3
384
385def flattenQuat(l):
386 return(np.array([list(x) for x in l]).reshape(4*len(l)))
387
388def flattenRot(l):
389 return(np.array([list(x) for x in l]).reshape(9*len(l)))
390
391# q and -q are representing the same rotation.
392# So there is an ambiguity for the tests.
393# We force the real part of be positive.
394def mkQuaternion(mat):
395 q=Quaternion(matrix=mat)
396 if q.scalar < 0:
397 return(-q)
398 else:
399 return(q)
400
401a=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
402src=flattenQuat(a)
403
404
405res=flattenQuat([x.normalised for x in a])
406print(res)
407output=dsp.arm_quaternion_normalize_f32(src)
408print(output)
409print("")
410
411res=flattenQuat([x.conjugate for x in a])
412print(res)
413output=dsp.arm_quaternion_conjugate_f32(src)
414print(output)
415print("")
416
417res=flattenQuat([x.inverse for x in a])
418print(res)
419output=dsp.arm_quaternion_inverse_f32(src)
420print(output)
421print("")
422
423res=[x.norm for x in a]
424print(res)
425output=dsp.arm_quaternion_norm_f32(src)
426print(output)
427print("")
428
429a=[x.normalised for x in a]
430ra=[x.rotation_matrix for x in a]
431rb=[mkQuaternion(x) for x in ra]
432
433srca=flattenQuat(a)
434resa=dsp.arm_quaternion2rotation_f32(srca)
435resb=dsp.arm_rotation2quaternion_f32(resa)
436
437
438print(ra)
439print(resa)
440print("")
441print(rb)
442print(resb)#
443
444a=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
445b=[2.0*Quaternion.random() for x in range(NBSAMPLES)]
446
447c = np.array(a) * np.array(b)
448print(c)
449
450srca=flattenQuat(a)
451srcb=flattenQuat(b)
452resc=dsp.arm_quaternion_product_f32(srca,srcb)
453
454print(resc)
455
456print(a[0]*b[0])
457res=dsp.arm_quaternion_product_single_f32(srca[0:4],srcb[0:4])
458print(res)
459