update number_crunching for ulab renames and rainbowio + fix for barometric and pulse

This commit is contained in:
foamyguy 2021-07-31 12:58:31 -05:00
parent d1f7491d78
commit e5b015b46f
5 changed files with 38 additions and 43 deletions

View file

@ -1,7 +1,6 @@
import time
import math
import ulab
import ulab.numerical
import ulab.numpy
def mean(values):
return sum(values) / len(values)
@ -17,15 +16,15 @@ def normalized_rms(values):
def normalized_rms_ulab(values):
# this function works with ndarrays only
minbuf = ulab.numerical.mean(values)
minbuf = ulab.numpy.mean(values)
values = values - minbuf
samples_sum = ulab.numerical.sum(values * values)
samples_sum = ulab.numpy.sum(values * values)
return math.sqrt(samples_sum / len(values))
# Instead of using sensor data, we generate some data
# The amplitude is 5000 so the rms should be around 5000/1.414 = 3536
nums_list = [int(8000 + math.sin(i) * 5000) for i in range(100)]
nums_array = ulab.array(nums_list)
nums_array = ulab.numpy.array(nums_list)
def timeit(s, f, n=100):
t0 = time.monotonic_ns()
@ -38,5 +37,5 @@ def timeit(s, f, n=100):
print("Computing the RMS value of 100 numbers")
timeit("traditional", lambda: normalized_rms(nums_list))
timeit("ulab, with ndarray, some implementation in python", lambda: normalized_rms_ulab(nums_array))
timeit("ulab only, with list", lambda: ulab.numerical.std(nums_list))
timeit("ulab only, with ndarray", lambda: ulab.numerical.std(nums_array))
timeit("ulab only, with list", lambda: ulab.numpy.std(nums_list))
timeit("ulab only, with ndarray", lambda: ulab.numpy.std(nums_array))

View file

@ -3,8 +3,7 @@ import time
import adafruit_bmp280
import board
import displayio
import ulab
import ulab.filter
import ulab.numpy as np
# Blank the screen. Scrolling text causes unwanted delays.
d = displayio.Group()
@ -15,7 +14,7 @@ board.DISPLAY.show(d)
# Transition bandwidth: 0.16Hz
# Window type: Hamming
# Filter has 311 coefficients
taps = ulab.array([
taps = np.array([
-0.000050679794726066, -0.000041099278318167, -0.000031279920668665,
-0.000021183486597150, -0.000010770285292045, +0.000000000000000000,
+0.000011167446754809, +0.000022770999889941, +0.000034847558259864,
@ -31,8 +30,8 @@ taps = ulab.array([
+0.000489380560741255, +0.000495598812776238, +0.000499367108150093,
+0.000500461794444300, +0.000498660907473236, +0.000493745927786584,
+0.000485503600706003, +0.000473727809671115, +0.000458221492033063,
+0.000438798585855176, +0.000415285995764155, +0.000387525565446236,
+0.000355376044004699, +0.000318715033091691, +0.000277440901501588,
+0.000438798585855176, +0.000415285995764155, +0.000387525565446236] +
[+0.000355376044004699, +0.000318715033091691, +0.000277440901501588,
+0.000231474653767861, +0.000180761739242710, +0.000125273788160487,
+0.000065010261293197, +0.000000000000000000, -0.000069697336247377,
-0.000143989957415198, -0.000222752767634882, -0.000305826338672358,
@ -63,8 +62,8 @@ taps = ulab.array([
+0.013033779302562583, +0.013549501700820601, +0.014054359855790191,
+0.014546911139352909, +0.015025735735186426, +0.015489442135386880,
+0.015936672560369614, +0.016366108277098043, +0.016776474791055797,
+0.017166546887869318, +0.017535153501103896, +0.017881182383493146,
+0.018203584559716979, +0.018501378539810983, +0.018773654273367416,
+0.017166546887869318, +0.017535153501103896, +0.017881182383493146] +
[+0.018203584559716979, +0.018501378539810983, +0.018773654273367416,
+0.019019576825867947, +0.019238389759765797, +0.019429418204303113,
+0.019592071599501125, +0.019725846101288819, +0.019830326636332028,
+0.019905188596781104, +0.019950199166862841, +0.019965218274992248,
@ -85,8 +84,8 @@ taps = ulab.array([
+0.002630616483032971, +0.002203584045179127, +0.001792701398335993,
+0.001398597909331569, +0.001021830060775982, +0.000662880773589522,
+0.000322159059450752, +0.000000000000000001, -0.000303334951952833,
-0.000587657355512251, -0.000852850856865070, -0.001098869965763655,
-0.001325738543930948, -0.001533548017297868, -0.001722455325210333,
-0.000587657355512251, -0.000852850856865070, -0.001098869965763655] +
[-0.001325738543930948, -0.001533548017297868, -0.001722455325210333,
-0.001892680620886389, -0.002044504738458278, -0.002178266442894981,
-0.002294359479963247, -0.002393229444145818, -0.002475370483091317,
-0.002541321857718479, -0.002591664377536210, -0.002627016731069256,
@ -143,7 +142,7 @@ sensor.overscan_pressure = adafruit_bmp280.OVERSCAN_X1
# And our data structures
# The most recent data samples, equal in number to the filter taps
data = ulab.zeros(len(taps))
data = np.zeros(len(taps))
t0 = deadline = time.monotonic_ns()
n = 0
# Take an initial reading to subtract off later, so that the graph in mu
@ -163,9 +162,9 @@ while True:
data = data + value
else:
# Otherwise, add it as the next sample
ulab.numerical.roll(data, 1)
data = np.roll(data, 1)
data[-1] = value
filtered = ulab.numerical.sum(data * taps)
filtered = np.sum(data * taps)
# Actually print every 10th value. This prints about 1.6 values per
# second. You can print values more quickly by removing the 'if' and
# making the print unconditional, or change the frequency of prints up

View file

@ -3,8 +3,7 @@ import time
import adafruit_apds9960.apds9960
import board
import digitalio
import ulab
import ulab.filter
import ulab.numpy as np
# Blank the screen. Scrolling text causes unwanted delays.
import displayio
@ -18,7 +17,7 @@ board.DISPLAY.show(d)
# Window type: Regular
# Number of coefficients: 31
# Manually trimmed to 16 coefficients
taps = ulab.array([
taps = np.array([
+0.861745279666917052/2,
-0.134728583242092248,
-0.124472980501612152,
@ -89,7 +88,7 @@ def main():
# And our data structures
# The most recent data samples, equal in number to the filter taps
data = ulab.zeros(len(taps))
data = np.zeros(len(taps))
# The filtered value on the previous iteration
old_value = 1
# The times of the most recent pulses registered. Increasing this number
@ -111,11 +110,11 @@ def main():
deadline += dt
sleep_deadline(deadline)
value = sum(sensor.color_data) # Combination of all channels
ulab.numerical.roll(data, 1)
data = np.roll(data, 1)
data[-1] = value
# Compute the new filtered variable by applying the filter to the
# recent data samples
filtered = ulab.numerical.sum(data * taps)
filtered = np.sum(data * taps)
# We gathered enough data to fill the filters, and
# the light value crossed the zero line in the positive direction

View file

@ -2,9 +2,8 @@ import random
import board
import neopixel
from _pixelbuf import wheel
import ulab
import ulab.filter
from rainbowio import colorwheel as wheel
import ulab.numpy as np
# Customize your neopixel configuration here...
pixel_pin = board.D5
@ -12,11 +11,11 @@ num_pixels = 96
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.1,
auto_write=False, pixel_order=neopixel.RGB)
ddt = ulab.array([1.,-2.,1.])
ddt = np.array([1.,-2.,1.])
def step(u, um, f, n, dx, dt, c):
dt2 = dt*dt
C2 = (c*dt/dx)**2
deriv = ulab.filter.convolve(u, ddt)[1:-1] * C2
deriv = np.convolve(u, ddt)[1:-1] * C2
up = -um + u * 2 + deriv + f * dt2
up[0] = 0
up[n-1] = 0
@ -29,11 +28,11 @@ def main():
w = [wheel(i) for i in range(256)]
# This sets up the initial wave as a smooth gradient
u = ulab.zeros(num_pixels)
um = ulab.zeros(num_pixels)
f = ulab.zeros(num_pixels)
u = np.zeros(num_pixels)
um = np.zeros(num_pixels)
f = np.zeros(num_pixels)
slope = ulab.linspace(0, 256, num=num_pixels)
slope = np.linspace(0, 256, num=num_pixels)
th = 1
# the first time is always random (is that a contradiction?)

View file

@ -7,9 +7,8 @@ import array
import board
import audiobusio
import displayio
import ulab
import ulab.fft
import ulab.vector
import ulab.numpy as np
from ulab.scipy.signal import spectrogram
display = board.DISPLAY
@ -75,14 +74,14 @@ def main():
while True:
mic.record(samples_bit, len(samples_bit))
samples = ulab.array(samples_bit[3:])
spectrogram1 = ulab.fft.spectrogram(samples)
samples = np.array(samples_bit[3:])
spectrogram1 = spectrogram(samples)
# spectrum() is always nonnegative, but add a tiny value
# to change any zeros to nonzero numbers
spectrogram1 = ulab.vector.log(spectrogram1 + 1e-7)
spectrogram1 = np.log(spectrogram1 + 1e-7)
spectrogram1 = spectrogram1[1:(fft_size//2)-1]
min_curr = ulab.numerical.min(spectrogram1)
max_curr = ulab.numerical.max(spectrogram1)
min_curr = np.min(spectrogram1)
max_curr = np.max(spectrogram1)
if max_curr > max_all:
max_all = max_curr
@ -94,7 +93,7 @@ def main():
# Plot FFT
data = (spectrogram1 - min_curr) * (51. / (max_all - min_curr))
# This clamps any negative numbers to zero
data = data * ulab.array((data > 0))
data = data * np.array((data > 0))
graph.show(data)
main()