Marco Mayer / Mbed OS Queue
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 """
demayer 0:6bf0743ece18 2 mbed SDK
demayer 0:6bf0743ece18 3 Copyright (c) 2011-2013 ARM Limited
demayer 0:6bf0743ece18 4
demayer 0:6bf0743ece18 5 Licensed under the Apache License, Version 2.0 (the "License");
demayer 0:6bf0743ece18 6 you may not use this file except in compliance with the License.
demayer 0:6bf0743ece18 7 You may obtain a copy of the License at
demayer 0:6bf0743ece18 8
demayer 0:6bf0743ece18 9 http://www.apache.org/licenses/LICENSE-2.0
demayer 0:6bf0743ece18 10
demayer 0:6bf0743ece18 11 Unless required by applicable law or agreed to in writing, software
demayer 0:6bf0743ece18 12 distributed under the License is distributed on an "AS IS" BASIS,
demayer 0:6bf0743ece18 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
demayer 0:6bf0743ece18 14 See the License for the specific language governing permissions and
demayer 0:6bf0743ece18 15 limitations under the License.
demayer 0:6bf0743ece18 16 """
demayer 0:6bf0743ece18 17 from numpy import sin, arange, pi
demayer 0:6bf0743ece18 18 from scipy.signal import lfilter, firwin
demayer 0:6bf0743ece18 19 from pylab import figure, plot, grid, show
demayer 0:6bf0743ece18 20
demayer 0:6bf0743ece18 21 #------------------------------------------------
demayer 0:6bf0743ece18 22 # Create a signal for demonstration.
demayer 0:6bf0743ece18 23 #------------------------------------------------
demayer 0:6bf0743ece18 24 # 320 samples of (1000Hz + 15000 Hz) at 48 kHz
demayer 0:6bf0743ece18 25 sample_rate = 48000.
demayer 0:6bf0743ece18 26 nsamples = 320
demayer 0:6bf0743ece18 27
demayer 0:6bf0743ece18 28 F_1KHz = 1000.
demayer 0:6bf0743ece18 29 A_1KHz = 1.0
demayer 0:6bf0743ece18 30
demayer 0:6bf0743ece18 31 F_15KHz = 15000.
demayer 0:6bf0743ece18 32 A_15KHz = 0.5
demayer 0:6bf0743ece18 33
demayer 0:6bf0743ece18 34 t = arange(nsamples) / sample_rate
demayer 0:6bf0743ece18 35 signal = A_1KHz * sin(2*pi*F_1KHz*t) + A_15KHz*sin(2*pi*F_15KHz*t)
demayer 0:6bf0743ece18 36
demayer 0:6bf0743ece18 37 #------------------------------------------------
demayer 0:6bf0743ece18 38 # Create a FIR filter and apply it to signal.
demayer 0:6bf0743ece18 39 #------------------------------------------------
demayer 0:6bf0743ece18 40 # The Nyquist rate of the signal.
demayer 0:6bf0743ece18 41 nyq_rate = sample_rate / 2.
demayer 0:6bf0743ece18 42
demayer 0:6bf0743ece18 43 # The cutoff frequency of the filter: 6KHz
demayer 0:6bf0743ece18 44 cutoff_hz = 6000.0
demayer 0:6bf0743ece18 45
demayer 0:6bf0743ece18 46 # Length of the filter (number of coefficients, i.e. the filter order + 1)
demayer 0:6bf0743ece18 47 numtaps = 29
demayer 0:6bf0743ece18 48
demayer 0:6bf0743ece18 49 # Use firwin to create a lowpass FIR filter
demayer 0:6bf0743ece18 50 fir_coeff = firwin(numtaps, cutoff_hz/nyq_rate)
demayer 0:6bf0743ece18 51
demayer 0:6bf0743ece18 52 # Use lfilter to filter the signal with the FIR filter
demayer 0:6bf0743ece18 53 filtered_signal = lfilter(fir_coeff, 1.0, signal)
demayer 0:6bf0743ece18 54
demayer 0:6bf0743ece18 55 #------------------------------------------------
demayer 0:6bf0743ece18 56 # Plot the original and filtered signals.
demayer 0:6bf0743ece18 57 #------------------------------------------------
demayer 0:6bf0743ece18 58
demayer 0:6bf0743ece18 59 # The first N-1 samples are "corrupted" by the initial conditions
demayer 0:6bf0743ece18 60 warmup = numtaps - 1
demayer 0:6bf0743ece18 61
demayer 0:6bf0743ece18 62 # The phase delay of the filtered signal
demayer 0:6bf0743ece18 63 delay = (warmup / 2) / sample_rate
demayer 0:6bf0743ece18 64
demayer 0:6bf0743ece18 65 figure(1)
demayer 0:6bf0743ece18 66 # Plot the original signal
demayer 0:6bf0743ece18 67 plot(t, signal)
demayer 0:6bf0743ece18 68
demayer 0:6bf0743ece18 69 # Plot the filtered signal, shifted to compensate for the phase delay
demayer 0:6bf0743ece18 70 plot(t-delay, filtered_signal, 'r-')
demayer 0:6bf0743ece18 71
demayer 0:6bf0743ece18 72 # Plot just the "good" part of the filtered signal. The first N-1
demayer 0:6bf0743ece18 73 # samples are "corrupted" by the initial conditions.
demayer 0:6bf0743ece18 74 plot(t[warmup:]-delay, filtered_signal[warmup:], 'g', linewidth=4)
demayer 0:6bf0743ece18 75
demayer 0:6bf0743ece18 76 grid(True)
demayer 0:6bf0743ece18 77
demayer 0:6bf0743ece18 78 show()
demayer 0:6bf0743ece18 79
demayer 0:6bf0743ece18 80 #------------------------------------------------
demayer 0:6bf0743ece18 81 # Print values
demayer 0:6bf0743ece18 82 #------------------------------------------------
demayer 0:6bf0743ece18 83 def print_values(label, values):
demayer 0:6bf0743ece18 84 var = "float32_t %s[%d]" % (label, len(values))
demayer 0:6bf0743ece18 85 print "%-30s = {%s}" % (var, ', '.join(["%+.10f" % x for x in values]))
demayer 0:6bf0743ece18 86
demayer 0:6bf0743ece18 87 print_values('signal', signal)
demayer 0:6bf0743ece18 88 print_values('fir_coeff', fir_coeff)
demayer 0:6bf0743ece18 89 print_values('filtered_signal', filtered_signal)