blob: 7d51466f65237fe760da315a610513ae6a877c12 [file] [log] [blame]
Christophe Favergeon53f828f2019-03-25 13:42:44 +01001import cmsisdsp as dsp
2import numpy as np
3from scipy import signal
Christophe Favergeonaefd2772020-01-08 09:01:17 +01004import matplotlib.pyplot as plt
5from scipy.fftpack import dct
Christophe Favergeon53f828f2019-03-25 13:42:44 +01006
Christophe Favergeonaefd2772020-01-08 09:01:17 +01007r = dsp.arm_add_f32(np.array([1.,2,3]),np.array([4.,5,7]))
8print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +01009
Christophe Favergeonaefd2772020-01-08 09:01:17 +010010r = dsp.arm_add_q31([1,2,3],[4,5,7])
11print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +010012
Christophe Favergeonaefd2772020-01-08 09:01:17 +010013r = dsp.arm_add_q15([1,2,3],[4,5,7])
14print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +010015
Christophe Favergeonaefd2772020-01-08 09:01:17 +010016r = dsp.arm_add_q7([-1,2,3],[4,127,7])
17print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +010018
Christophe Favergeonaefd2772020-01-08 09:01:17 +010019r = dsp.arm_scale_f32([1.,2,3],2)
20print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +010021
Christophe Favergeonaefd2772020-01-08 09:01:17 +010022r = dsp.arm_scale_q31([0x7FFF,0x3FFF,0x1FFF],1 << 20,2)
23print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +010024
Christophe Favergeonaefd2772020-01-08 09:01:17 +010025r = dsp.arm_scale_q15([0x7FFF,0x3FFF,0x1FFF],1 << 10,2)
26print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +010027
Christophe Favergeonaefd2772020-01-08 09:01:17 +010028r = dsp.arm_scale_q7([0x7F,0x3F,0x1F],1 << 5,2)
29print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +010030
Christophe Favergeon53f828f2019-03-25 13:42:44 +010031
Christophe Favergeonaefd2772020-01-08 09:01:17 +010032r = dsp.arm_negate_f32([1.,2,3])
33print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +010034
Christophe Favergeonaefd2772020-01-08 09:01:17 +010035r = dsp.arm_negate_q31([1,2,3])
36print(r)
37
38r = dsp.arm_negate_q15([1,2,3])
39print(r)
40
41r = dsp.arm_negate_q7(np.array([0x80,0x81,0x82]))
42print(r)
43
44r = dsp.arm_cmplx_conj_f32([1.,2,3,4])
45print(r)
46
47r = dsp.arm_cmplx_conj_q31([1,2,3,4])
48print(r)
49
50r = dsp.arm_cmplx_conj_q15([1,2,3,4])
51print(r)
52
53r = dsp.arm_cmplx_dot_prod_f32([1.,2,3,4],[1.,2,3,4])
54print(r)
55
56r = dsp.arm_cmplx_dot_prod_q31([0x1FFF,0x3FFF,0x1FFF,0x3FFF],[0x1FFF,0x3FFF,0x1FFF,0x3FFF])
57print(r)
58
59r = dsp.arm_cmplx_mult_real_f32([1.0,2,3,4],[5.,5.,5.,5.])
60print(r)
61
62pidf32 = dsp.arm_pid_instance_f32(Kp=1.0,Ki=1.2,Kd=0.4)
63print(pidf32.Kp())
64print(pidf32.Ki())
65print(pidf32.Kd())
66print(pidf32.A0())
67
68dsp.arm_pid_init_f32(pidf32,0)
69print(pidf32.A0())
70
71print(dsp.arm_cos_f32(3.14/4.))
72
73print(dsp.arm_sqrt_q31(0x7FFF))
Christophe Favergeon53f828f2019-03-25 13:42:44 +010074
75firf32 = dsp.arm_fir_instance_f32()
76dsp.arm_fir_init_f32(firf32,3,[1.,2,3],[0,0,0,0,0,0,0])
77print(firf32.numTaps())
78filtered_x = signal.lfilter([3,2,1.], 1.0, [1,2,3,4,5,1,2,3,4,5])
79print(filtered_x)
80print(dsp.arm_fir_f32(firf32,[1,2,3,4,5]))
81print(dsp.arm_fir_f32(firf32,[1,2,3,4,5]))
82
83def q31sat(x):
84 if x > 0x7FFFFFFF:
85 return(np.int32(0x7FFFFFFF))
86 elif x < -0x80000000:
87 return(np.int32(0x80000000))
88 else:
89 return(np.int32(x))
90
91q31satV=np.vectorize(q31sat)
92
93def toQ31(x):
94 return(q31satV(np.round(x * (1<<31))))
95
96def q15sat(x):
97 if x > 0x7FFF:
98 return(np.int16(0x7FFF))
99 elif x < -0x8000:
100 return(np.int16(0x8000))
101 else:
102 return(np.int16(x))
103
104q15satV=np.vectorize(q15sat)
105
106def toQ15(x):
107 return(q15satV(np.round(x * (1<<15))))
108
109def q7sat(x):
110 if x > 0x7F:
111 return(np.int8(0x7F))
112 elif x < -0x80:
113 return(np.int8(0x80))
114 else:
115 return(np.int8(x))
116
117q7satV=np.vectorize(q7sat)
118
119def toQ7(x):
120 return(q7satV(np.round(x * (1<<7))))
121
122def Q31toF32(x):
123 return(1.0*x / 2**31)
124
125def Q15toF32(x):
126 return(1.0*x / 2**15)
127
128def Q7toF32(x):
129 return(1.0*x / 2**7)
130
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100131firq31 = dsp.arm_fir_instance_q31()
132x=np.array([1,2,3,4,5])/10.0
133taps=np.array([1,2,3])/10.0
134xQ31=toQ31(x)
135tapsQ31=toQ31(taps)
136dsp.arm_fir_init_q31(firq31,3,tapsQ31,[0,0,0,0,0,0,0])
137print(firq31.numTaps())
138resultQ31=dsp.arm_fir_q31(firq31,xQ31)
139result=Q31toF32(resultQ31)
140print(result)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100141
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100142a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
143b=np.array([[1.,2,3,4],[5.1,6,7,8],[9.1,10,11,12]])
144print(a+b)
145v=dsp.arm_mat_add_f32(a,b)
146print(v)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100147
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100148a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
149b=np.array([[1.,2,3],[5.1,6,7],[9.1,10,11],[5,8,4]])
150print(np.dot(a , b))
151v=dsp.arm_mat_mult_f32(a,b)
152print(v)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100153
154def imToReal2D(a):
155 ar=np.zeros(np.array(a.shape) * [1,2])
156 ar[::,0::2]=a.real
157 ar[::,1::2]=a.imag
158 return(ar)
159
160def realToIm2D(ar):
161 return(ar[::,0::2] + 1j * ar[::,1::2])
162
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100163a=np.array([[1. + 2j,3 + 4j],[5 + 6j,7 + 8j],[9 + 10j,11 + 12j]])
164b=np.array([[1. + 2j, 3 + 5.1j ,6 + 7j],[9.1 + 10j,11 + 5j,8 +4j]])
165print(np.dot(a , b))
166
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100167# Convert complex array to real array for use in CMSIS DSP
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100168ar = imToReal2D(a)
169br = imToReal2D(b)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100170
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100171v=dsp.arm_mat_cmplx_mult_f32(ar,br)
172print(v)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100173
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100174a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]]) / 30.0
175b=np.array([[1.,2,3,4],[5.1,6,7,8],[9.1,10,11,12]]) / 30.0
176print(a+b)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100177
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100178aQ31=toQ31(a)
179bQ31=toQ31(b)
180v=dsp.arm_mat_add_q31(aQ31,bQ31)
181rQ31=v[1]
182r=Q31toF32(rQ31)
183print(r)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100184
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100185a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
186print(np.transpose(a))
187print(dsp.arm_mat_trans_f32(a))
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100188
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100189a = np.array([[1., 2.], [3., 4.]])
190print(np.linalg.inv(a))
191print(dsp.arm_mat_inverse_f32(a))
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100192
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100193a = np.array([[1., 2.], [3., 4.]])
194print(np.linalg.inv(a))
195print(dsp.arm_mat_inverse_f64(a))
196
197a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
198print(2.5*a)
199print(dsp.arm_mat_scale_f32(a,2.5))
200
201a=np.array([1.,2,3,4,5,6,7,8,9,10,11,12])
202print(np.max(a))
203print(np.argmax(a))
204print(dsp.arm_max_f32(a))
205
206print(np.mean(a))
207print(dsp.arm_mean_f32(a))
208
209print(np.dot(a,a))
210print(dsp.arm_power_f32(a))
211
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100212
213def imToReal1D(a):
214 ar=np.zeros(np.array(a.shape) * 2)
215 ar[0::2]=a.real
216 ar[1::2]=a.imag
217 return(ar)
218
219def realToIm1D(ar):
220 return(ar[0::2] + 1j * ar[1::2])
221
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100222nb = 16
223signal = np.cos(2 * np.pi * np.arange(nb) / nb)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100224
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100225result=np.fft.fft(signal)
226print(result)
227signalR = imToReal1D(signal)
228cfftf32=dsp.arm_cfft_instance_f32()
229status=dsp.arm_cfft_init_f32(cfftf32,nb)
230print(status)
231resultR = dsp.arm_cfft_f32(cfftf32,signalR,0,1)
232resultI = realToIm1D(resultR)
233print(resultI)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100234
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100235signal = signal / 10.0
236result=np.fft.fft(signal)
237print(result)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100238
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100239signalR = imToReal1D(signal)
240signalRQ31=toQ31(signalR)
241cfftq31=dsp.arm_cfft_instance_q31()
242status=dsp.arm_cfft_init_q31(cfftq31,nb)
243print(status)
244resultR = dsp.arm_cfft_q31(cfftq31,signalRQ31,0,1)
245resultI = realToIm1D(Q31toF32(resultR))*16
246print(resultI)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100247
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100248signal = signal / 10.0
249result=np.fft.fft(signal)
250print(result)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100251
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100252signalR = imToReal1D(signal)
253signalRQ15=toQ15(signalR)
254cfftq15=dsp.arm_cfft_instance_q15()
255status=dsp.arm_cfft_init_q15(cfftq15,nb)
256print(status)
257resultR = dsp.arm_cfft_q15(cfftq15,signalRQ15,0,1)
258resultR=Q15toF32(resultR)
259resultI = realToIm1D(resultR)*16
260print(resultI)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100261
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100262nb = 128
263signal = np.cos(2 * np.pi * np.arange(nb) / nb)
264
265result=np.fft.fft(signal)
266print(result)
267cfftradix4f32=dsp.arm_cfft_radix4_instance_f32()
268rfftf32=dsp.arm_rfft_instance_f32()
269status=dsp.arm_rfft_init_f32(rfftf32,cfftradix4f32,nb,0,1)
270print(status)
271resultI = dsp.arm_rfft_f32(rfftf32,signal)
272print(result)
273
274nb = 128
275signal = np.cos(2 * np.pi * np.arange(nb) / nb)
276signalRQ31=toQ31(signal)
277
278result=np.fft.fft(signal)
279print(result)
280rfftq31=dsp.arm_rfft_instance_q31()
281status=dsp.arm_rfft_init_q31(rfftq31,nb,0,1)
282print(status)
283resultI = dsp.arm_rfft_q31(rfftq31,signalRQ31)
284resultI=Q31toF32(resultI)*(1 << 7)
285print(result)
286
287nb = 128
288signal = np.cos(2 * np.pi * np.arange(nb) / nb)
289signalRQ15=toQ15(signal)
290
291result=np.fft.fft(signal)
292print(result)
293rfftq15=dsp.arm_rfft_instance_q15()
294status=dsp.arm_rfft_init_q15(rfftq15,nb,0,1)
295print(status)
296resultI = dsp.arm_rfft_q15(rfftq15,signalRQ15)
297resultI=Q15toF32(resultI)*(1 << 7)
298print(result)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100299
300
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100301nb = 128
302nb2=64
303signal = np.cos(2 * np.pi * np.arange(nb) / nb)
304result=dct(signal,4,norm='ortho')
305print(result)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100306
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100307cfftradix4f32=dsp.arm_cfft_radix4_instance_f32()
308rfftf32=dsp.arm_rfft_instance_f32()
309dct4f32=dsp.arm_dct4_instance_f32()
310status=dsp.arm_dct4_init_f32(dct4f32,rfftf32,cfftradix4f32,nb,nb2,0.125)
311print(status)
312state=np.zeros(2*nb)
313resultI = dsp.arm_dct4_f32(dct4f32,state,signal)
314print(resultI)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100315
316
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100317signal = signal / 10.0
318result=dct(signal,4,norm='ortho')
319signalQ31=toQ31(signal)
320cfftradix4q31=dsp.arm_cfft_radix4_instance_q31()
321rfftq31=dsp.arm_rfft_instance_q31()
322dct4q31=dsp.arm_dct4_instance_q31()
323status=dsp.arm_dct4_init_q31(dct4q31,rfftq31,cfftradix4q31,nb,nb2,0x10000000)
324print(status)
325state=np.zeros(2*nb)
326resultI = dsp.arm_dct4_q31(dct4q31,state,signalQ31)
327resultI=Q31toF32(resultI)*(1 << 7)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100328
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100329nb = 128
330nb2=64
331signal = np.cos(2 * np.pi * np.arange(nb) / nb)
332signal = signal / 10.0
333result=dct(signal,4,norm='ortho')
334signalQ15=toQ15(signal)
335cfftradix4q15=dsp.arm_cfft_radix4_instance_q15()
336rfftq15=dsp.arm_rfft_instance_q15()
337dct4q15=dsp.arm_dct4_instance_q15()
338status=dsp.arm_dct4_init_q15(dct4q15,rfftq15,cfftradix4q15,nb,nb2,0x1000)
339print(status)
340state=np.zeros(2*nb)
341resultI = dsp.arm_dct4_q15(dct4q15,state,signalQ15)
342resultI=Q15toF32(resultI)*(1 << 7)
Christophe Favergeon53f828f2019-03-25 13:42:44 +0100343
Christophe Favergeonaefd2772020-01-08 09:01:17 +0100344
345from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show
346figure(1)
347plot(np.absolute(signal))
348t = np.arange(nb)
349freq = np.fft.fftfreq(t.shape[-1])
350resultmag=np.absolute(result)
351figure(2)
352plot(resultmag)
353figure(3)
354cmsigmag=np.absolute(resultI)
355plot(cmsigmag)
356show()
357
358biquadf32 = dsp.arm_biquad_casd_df1_inst_f32()
359numStages=1
360state=np.zeros(numStages*4)
361coefs=[1.,2,3,4,5]
362dsp.arm_biquad_cascade_df1_init_f32(biquadf32,1,coefs,state)
363print(dsp.arm_biquad_cascade_df1_f32(biquadf32,[1,2,3,4,5]))