You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CMSIS-DSP/PythonWrapper/examples/example_1_9.py

164 lines
5.1 KiB
Python

# Bug corrections for version 1.9
import cmsisdsp as dsp
import cmsisdsp.fixedpoint as f
import numpy as np
import math
import colorama
from colorama import init,Fore, Back, Style
from numpy.testing import assert_allclose
import matplotlib.pyplot as plt
from scipy import signal
init()
def printTitle(s):
print("\n" + Fore.GREEN + Style.BRIGHT + s + Style.RESET_ALL)
def printSubTitle(s):
print("\n" + Style.BRIGHT + s + Style.RESET_ALL)
printTitle("Decimate")
test_length_seconds = 0.1
signal_frequency = 100
sampling_freq = 8000
nbSamples = int(test_length_seconds*sampling_freq)
wave = np.sin(2*np.pi*signal_frequency*np.linspace(0,test_length_seconds,nbSamples))
#plt.plot(wave)
#plt.show()
decimationFactor = 4
numTaps = 9
downsamplingFilter = signal.firwin(numTaps,1.0 / decimationFactor)
block_size = 160
assert(block_size % decimationFactor == 0)
ds_state = np.zeros(block_size + len(downsamplingFilter)-1)
decimator = dsp.arm_fir_decimate_instance_f32()
status = dsp.arm_fir_decimate_init_f32(decimator,numTaps,decimationFactor, downsamplingFilter, ds_state)
def processSignal(sig,dec,f):
result = []
for blockNb in range(len(sig) // block_size):
s = blockNb * block_size
e = s + block_size
r = f(dec,sig[s:e])
result.append(r)
output = np.hstack(result)
return(output)
ref = processSignal(wave,decimator,dsp.arm_fir_decimate_f32)
#plt.plot(ref)
#plt.show()
printSubTitle("Decimate Q31")
waveQ31 = f.toQ31(wave)
downsamplingFilterQ31 = f.toQ31(downsamplingFilter)
stateQ31 = np.zeros(block_size + len(downsamplingFilter)-1)
decimatorQ31 = dsp.arm_fir_decimate_instance_q31()
status = dsp.arm_fir_decimate_init_q31(decimatorQ31,numTaps,decimationFactor,
downsamplingFilterQ31, stateQ31)
outputQ31 = processSignal(waveQ31,decimatorQ31,dsp.arm_fir_decimate_q31)
outputF32 = f.Q31toF32(outputQ31)
printSubTitle("Decimate Fast Q31")
waveQ31 = f.toQ31(wave)
downsamplingFilterQ31 = f.toQ31(downsamplingFilter)
stateQ31 = np.zeros(block_size + len(downsamplingFilter)-1)
decimatorQ31 = dsp.arm_fir_decimate_instance_q31()
status = dsp.arm_fir_decimate_init_q31(decimatorQ31,numTaps,decimationFactor,
downsamplingFilterQ31, stateQ31)
outputQ31 = processSignal(waveQ31,decimatorQ31,dsp.arm_fir_decimate_fast_q31)
outputF32 = f.Q31toF32(outputQ31)
printSubTitle("Decimate Q15")
waveQ15 = f.toQ15(wave)
downsamplingFilterQ15 = f.toQ15(downsamplingFilter)
stateQ15 = np.zeros(block_size + len(downsamplingFilter)-1)
decimatorQ15 = dsp.arm_fir_decimate_instance_q15()
status = dsp.arm_fir_decimate_init_q15(decimatorQ15,numTaps,decimationFactor,
downsamplingFilterQ15, stateQ15)
outputQ15 = processSignal(waveQ15,decimatorQ15,dsp.arm_fir_decimate_q15)
outputF32 = f.Q15toF32(outputQ15)
#plt.plot(outputF32)
#plt.show()
assert_allclose(ref,outputF32,rtol=2e-3,atol=1e-3)
printSubTitle("Decimate Fast Q15")
waveQ15 = f.toQ15(wave)
downsamplingFilterQ15 = f.toQ15(downsamplingFilter)
stateQ15 = np.zeros(block_size + len(downsamplingFilter)-1)
decimatorQ15 = dsp.arm_fir_decimate_instance_q15()
status = dsp.arm_fir_decimate_init_q15(decimatorQ15,numTaps,decimationFactor,
downsamplingFilterQ15, stateQ15)
outputQ15 = processSignal(waveQ15,decimatorQ15,dsp.arm_fir_decimate_fast_q15)
outputF32 = f.Q15toF32(outputQ15)
#plt.plot(outputF32)
#plt.show()
assert_allclose(ref,outputF32,rtol=2e-3,atol=1e-3)
printTitle("Interpolate")
upsamplingFactor = 4
numTaps = 16
upsamplingFilter = signal.firwin(numTaps,1.0 / upsamplingFactor)
assert(numTaps % upsamplingFactor == 0)
block_size = 40
printSubTitle("Interpolate F32")
state = np.zeros(block_size + len(upsamplingFilter)//upsamplingFactor-1)
interpolator = dsp.arm_fir_interpolate_instance_f32()
status = dsp.arm_fir_interpolate_init_f32(interpolator,upsamplingFactor,numTaps,
upsamplingFilter, state)
output = processSignal(ref,interpolator,dsp.arm_fir_interpolate_f32)
output = output / np.max(output)
#t = range(nbSamples)
#plt.plot(t,wave,t[:-11],output[11:])
#plt.show()
d = 11
assert_allclose(wave[:-d],output[d:],atol=0.1)
printSubTitle("Interpolate Q31")
upsamplingFilterQ31 = f.toQ31(upsamplingFilter)
stateQ31 = np.zeros(block_size + len(upsamplingFilter)//upsamplingFactor-1)
interpolatorQ31 = dsp.arm_fir_interpolate_instance_q31()
status = dsp.arm_fir_interpolate_init_q31(interpolatorQ31,upsamplingFactor,numTaps,
upsamplingFilterQ31, stateQ31)
outputQ31 = processSignal(outputQ31,interpolatorQ31,dsp.arm_fir_interpolate_q31)
outputF32 = f.Q31toF32(outputQ31)
outputF32 = outputF32 / np.max(outputF32)
assert_allclose(wave[:-d],outputF32[d:],atol=0.1)
printSubTitle("Interpolate Q15")
upsamplingFilterQ15 = f.toQ15(upsamplingFilter)
stateQ15 = np.zeros(block_size + len(upsamplingFilter)//upsamplingFactor-1)
interpolatorQ15 = dsp.arm_fir_interpolate_instance_q15()
status = dsp.arm_fir_interpolate_init_q15(interpolatorQ15,upsamplingFactor,numTaps,
upsamplingFilterQ15, stateQ15)
outputQ15 = processSignal(outputQ15,interpolatorQ15,dsp.arm_fir_interpolate_q15)
outputF32 = f.Q15toF32(outputQ15)
outputF32 = outputF32 / np.max(outputF32)
assert_allclose(wave[:-d],outputF32[d:],atol=0.1)