| import cmsisdsp as dsp |
| import numpy as np |
| from scipy import signal |
| import matplotlib.pyplot as plt |
| from scipy.fftpack import dct |
| |
| r = dsp.arm_add_f32(np.array([1.,2,3]),np.array([4.,5,7])) |
| print(r) |
| |
| r = dsp.arm_add_q31([1,2,3],[4,5,7]) |
| print(r) |
| |
| r = dsp.arm_add_q15([1,2,3],[4,5,7]) |
| print(r) |
| |
| r = dsp.arm_add_q7([-1,2,3],[4,127,7]) |
| print(r) |
| |
| r = dsp.arm_scale_f32([1.,2,3],2) |
| print(r) |
| |
| r = dsp.arm_scale_q31([0x7FFF,0x3FFF,0x1FFF],1 << 20,2) |
| print(r) |
| |
| r = dsp.arm_scale_q15([0x7FFF,0x3FFF,0x1FFF],1 << 10,2) |
| print(r) |
| |
| r = dsp.arm_scale_q7([0x7F,0x3F,0x1F],1 << 5,2) |
| print(r) |
| |
| |
| r = dsp.arm_negate_f32([1.,2,3]) |
| print(r) |
| |
| r = dsp.arm_negate_q31([1,2,3]) |
| print(r) |
| |
| r = dsp.arm_negate_q15([1,2,3]) |
| print(r) |
| |
| r = dsp.arm_negate_q7(np.array([0x80,0x81,0x82])) |
| print(r) |
| |
| r = dsp.arm_cmplx_conj_f32([1.,2,3,4]) |
| print(r) |
| |
| r = dsp.arm_cmplx_conj_q31([1,2,3,4]) |
| print(r) |
| |
| r = dsp.arm_cmplx_conj_q15([1,2,3,4]) |
| print(r) |
| |
| r = dsp.arm_cmplx_dot_prod_f32([1.,2,3,4],[1.,2,3,4]) |
| print(r) |
| |
| r = dsp.arm_cmplx_dot_prod_q31([0x1FFF,0x3FFF,0x1FFF,0x3FFF],[0x1FFF,0x3FFF,0x1FFF,0x3FFF]) |
| print(r) |
| |
| r = dsp.arm_cmplx_mult_real_f32([1.0,2,3,4],[5.,5.,5.,5.]) |
| print(r) |
| |
| pidf32 = dsp.arm_pid_instance_f32(Kp=1.0,Ki=1.2,Kd=0.4) |
| print(pidf32.Kp()) |
| print(pidf32.Ki()) |
| print(pidf32.Kd()) |
| print(pidf32.A0()) |
| |
| dsp.arm_pid_init_f32(pidf32,0) |
| print(pidf32.A0()) |
| |
| print(dsp.arm_cos_f32(3.14/4.)) |
| |
| print(dsp.arm_sqrt_q31(0x7FFF)) |
| |
| firf32 = dsp.arm_fir_instance_f32() |
| dsp.arm_fir_init_f32(firf32,3,[1.,2,3],[0,0,0,0,0,0,0]) |
| print(firf32.numTaps()) |
| filtered_x = signal.lfilter([3,2,1.], 1.0, [1,2,3,4,5,1,2,3,4,5]) |
| print(filtered_x) |
| print(dsp.arm_fir_f32(firf32,[1,2,3,4,5])) |
| print(dsp.arm_fir_f32(firf32,[1,2,3,4,5])) |
| |
| def q31sat(x): |
| if x > 0x7FFFFFFF: |
| return(np.int32(0x7FFFFFFF)) |
| elif x < -0x80000000: |
| return(np.int32(0x80000000)) |
| else: |
| return(np.int32(x)) |
| |
| q31satV=np.vectorize(q31sat) |
| |
| def toQ31(x): |
| return(q31satV(np.round(x * (1<<31)))) |
| |
| def q15sat(x): |
| if x > 0x7FFF: |
| return(np.int16(0x7FFF)) |
| elif x < -0x8000: |
| return(np.int16(0x8000)) |
| else: |
| return(np.int16(x)) |
| |
| q15satV=np.vectorize(q15sat) |
| |
| def toQ15(x): |
| return(q15satV(np.round(x * (1<<15)))) |
| |
| def q7sat(x): |
| if x > 0x7F: |
| return(np.int8(0x7F)) |
| elif x < -0x80: |
| return(np.int8(0x80)) |
| else: |
| return(np.int8(x)) |
| |
| q7satV=np.vectorize(q7sat) |
| |
| def toQ7(x): |
| return(q7satV(np.round(x * (1<<7)))) |
| |
| def Q31toF32(x): |
| return(1.0*x / 2**31) |
| |
| def Q15toF32(x): |
| return(1.0*x / 2**15) |
| |
| def Q7toF32(x): |
| return(1.0*x / 2**7) |
| |
| firq31 = dsp.arm_fir_instance_q31() |
| x=np.array([1,2,3,4,5])/10.0 |
| taps=np.array([1,2,3])/10.0 |
| xQ31=toQ31(x) |
| tapsQ31=toQ31(taps) |
| dsp.arm_fir_init_q31(firq31,3,tapsQ31,[0,0,0,0,0,0,0]) |
| print(firq31.numTaps()) |
| resultQ31=dsp.arm_fir_q31(firq31,xQ31) |
| result=Q31toF32(resultQ31) |
| print(result) |
| |
| a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]]) |
| b=np.array([[1.,2,3,4],[5.1,6,7,8],[9.1,10,11,12]]) |
| print(a+b) |
| v=dsp.arm_mat_add_f32(a,b) |
| print(v) |
| |
| a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]]) |
| b=np.array([[1.,2,3],[5.1,6,7],[9.1,10,11],[5,8,4]]) |
| print(np.dot(a , b)) |
| v=dsp.arm_mat_mult_f32(a,b) |
| print(v) |
| |
| def imToReal2D(a): |
| ar=np.zeros(np.array(a.shape) * [1,2]) |
| ar[::,0::2]=a.real |
| ar[::,1::2]=a.imag |
| return(ar) |
| |
| def realToIm2D(ar): |
| return(ar[::,0::2] + 1j * ar[::,1::2]) |
| |
| a=np.array([[1. + 2j,3 + 4j],[5 + 6j,7 + 8j],[9 + 10j,11 + 12j]]) |
| b=np.array([[1. + 2j, 3 + 5.1j ,6 + 7j],[9.1 + 10j,11 + 5j,8 +4j]]) |
| print(np.dot(a , b)) |
| |
| # Convert complex array to real array for use in CMSIS DSP |
| ar = imToReal2D(a) |
| br = imToReal2D(b) |
| |
| v=dsp.arm_mat_cmplx_mult_f32(ar,br) |
| print(v) |
| |
| a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]]) / 30.0 |
| b=np.array([[1.,2,3,4],[5.1,6,7,8],[9.1,10,11,12]]) / 30.0 |
| print(a+b) |
| |
| aQ31=toQ31(a) |
| bQ31=toQ31(b) |
| v=dsp.arm_mat_add_q31(aQ31,bQ31) |
| rQ31=v[1] |
| r=Q31toF32(rQ31) |
| print(r) |
| |
| a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]]) |
| print(np.transpose(a)) |
| print(dsp.arm_mat_trans_f32(a)) |
| |
| a = np.array([[1., 2.], [3., 4.]]) |
| print(np.linalg.inv(a)) |
| print(dsp.arm_mat_inverse_f32(a)) |
| |
| a = np.array([[1., 2.], [3., 4.]]) |
| print(np.linalg.inv(a)) |
| print(dsp.arm_mat_inverse_f64(a)) |
| |
| a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]]) |
| print(2.5*a) |
| print(dsp.arm_mat_scale_f32(a,2.5)) |
| |
| a=np.array([1.,2,3,4,5,6,7,8,9,10,11,12]) |
| print(np.max(a)) |
| print(np.argmax(a)) |
| print(dsp.arm_max_f32(a)) |
| |
| print(np.mean(a)) |
| print(dsp.arm_mean_f32(a)) |
| |
| print(np.dot(a,a)) |
| print(dsp.arm_power_f32(a)) |
| |
| |
| 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]) |
| |
| nb = 16 |
| signal = np.cos(2 * np.pi * np.arange(nb) / nb) |
| |
| result=np.fft.fft(signal) |
| print(result) |
| signalR = imToReal1D(signal) |
| cfftf32=dsp.arm_cfft_instance_f32() |
| status=dsp.arm_cfft_init_f32(cfftf32,nb) |
| print(status) |
| resultR = dsp.arm_cfft_f32(cfftf32,signalR,0,1) |
| resultI = realToIm1D(resultR) |
| print(resultI) |
| |
| signal = signal / 10.0 |
| result=np.fft.fft(signal) |
| print(result) |
| |
| signalR = imToReal1D(signal) |
| signalRQ31=toQ31(signalR) |
| cfftq31=dsp.arm_cfft_instance_q31() |
| status=dsp.arm_cfft_init_q31(cfftq31,nb) |
| print(status) |
| resultR = dsp.arm_cfft_q31(cfftq31,signalRQ31,0,1) |
| resultI = realToIm1D(Q31toF32(resultR))*16 |
| print(resultI) |
| |
| signal = signal / 10.0 |
| result=np.fft.fft(signal) |
| print(result) |
| |
| signalR = imToReal1D(signal) |
| signalRQ15=toQ15(signalR) |
| cfftq15=dsp.arm_cfft_instance_q15() |
| status=dsp.arm_cfft_init_q15(cfftq15,nb) |
| print(status) |
| resultR = dsp.arm_cfft_q15(cfftq15,signalRQ15,0,1) |
| resultR=Q15toF32(resultR) |
| resultI = realToIm1D(resultR)*16 |
| print(resultI) |
| |
| nb = 128 |
| signal = np.cos(2 * np.pi * np.arange(nb) / nb) |
| |
| result=np.fft.fft(signal) |
| print(result) |
| cfftradix4f32=dsp.arm_cfft_radix4_instance_f32() |
| rfftf32=dsp.arm_rfft_instance_f32() |
| status=dsp.arm_rfft_init_f32(rfftf32,cfftradix4f32,nb,0,1) |
| print(status) |
| resultI = dsp.arm_rfft_f32(rfftf32,signal) |
| print(result) |
| |
| nb = 128 |
| signal = np.cos(2 * np.pi * np.arange(nb) / nb) |
| signalRQ31=toQ31(signal) |
| |
| result=np.fft.fft(signal) |
| print(result) |
| rfftq31=dsp.arm_rfft_instance_q31() |
| status=dsp.arm_rfft_init_q31(rfftq31,nb,0,1) |
| print(status) |
| resultI = dsp.arm_rfft_q31(rfftq31,signalRQ31) |
| resultI=Q31toF32(resultI)*(1 << 7) |
| print(result) |
| |
| nb = 128 |
| signal = np.cos(2 * np.pi * np.arange(nb) / nb) |
| signalRQ15=toQ15(signal) |
| |
| result=np.fft.fft(signal) |
| print(result) |
| rfftq15=dsp.arm_rfft_instance_q15() |
| status=dsp.arm_rfft_init_q15(rfftq15,nb,0,1) |
| print(status) |
| resultI = dsp.arm_rfft_q15(rfftq15,signalRQ15) |
| resultI=Q15toF32(resultI)*(1 << 7) |
| print(result) |
| |
| |
| nb = 128 |
| nb2=64 |
| signal = np.cos(2 * np.pi * np.arange(nb) / nb) |
| result=dct(signal,4,norm='ortho') |
| print(result) |
| |
| cfftradix4f32=dsp.arm_cfft_radix4_instance_f32() |
| rfftf32=dsp.arm_rfft_instance_f32() |
| dct4f32=dsp.arm_dct4_instance_f32() |
| status=dsp.arm_dct4_init_f32(dct4f32,rfftf32,cfftradix4f32,nb,nb2,0.125) |
| print(status) |
| state=np.zeros(2*nb) |
| resultI = dsp.arm_dct4_f32(dct4f32,state,signal) |
| print(resultI) |
| |
| |
| signal = signal / 10.0 |
| result=dct(signal,4,norm='ortho') |
| signalQ31=toQ31(signal) |
| cfftradix4q31=dsp.arm_cfft_radix4_instance_q31() |
| rfftq31=dsp.arm_rfft_instance_q31() |
| dct4q31=dsp.arm_dct4_instance_q31() |
| status=dsp.arm_dct4_init_q31(dct4q31,rfftq31,cfftradix4q31,nb,nb2,0x10000000) |
| print(status) |
| state=np.zeros(2*nb) |
| resultI = dsp.arm_dct4_q31(dct4q31,state,signalQ31) |
| resultI=Q31toF32(resultI)*(1 << 7) |
| |
| nb = 128 |
| nb2=64 |
| signal = np.cos(2 * np.pi * np.arange(nb) / nb) |
| signal = signal / 10.0 |
| result=dct(signal,4,norm='ortho') |
| signalQ15=toQ15(signal) |
| cfftradix4q15=dsp.arm_cfft_radix4_instance_q15() |
| rfftq15=dsp.arm_rfft_instance_q15() |
| dct4q15=dsp.arm_dct4_instance_q15() |
| status=dsp.arm_dct4_init_q15(dct4q15,rfftq15,cfftradix4q15,nb,nb2,0x1000) |
| print(status) |
| state=np.zeros(2*nb) |
| resultI = dsp.arm_dct4_q15(dct4q15,state,signalQ15) |
| resultI=Q15toF32(resultI)*(1 << 7) |
| |
| |
| from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show |
| figure(1) |
| plot(np.absolute(signal)) |
| t = np.arange(nb) |
| freq = np.fft.fftfreq(t.shape[-1]) |
| resultmag=np.absolute(result) |
| figure(2) |
| plot(resultmag) |
| figure(3) |
| cmsigmag=np.absolute(resultI) |
| plot(cmsigmag) |
| show() |
| |
| biquadf32 = dsp.arm_biquad_casd_df1_inst_f32() |
| numStages=1 |
| state=np.zeros(numStages*4) |
| coefs=[1.,2,3,4,5] |
| dsp.arm_biquad_cascade_df1_init_f32(biquadf32,1,coefs,state) |
| print(dsp.arm_biquad_cascade_df1_f32(biquadf32,[1,2,3,4,5])) |