Compare commits

...

5 Commits

Author SHA1 Message Date
0cf2db6c5e Fix divide by zero in sinefit 2014-02-14 15:56:52 -05:00
f530edd8a0 sfit4: if interpolated DFT fails, use peak 2013-08-16 15:36:39 -04:00
4d946bee79 Set shell and path in sample cron script 2013-08-16 15:36:20 -04:00
13ceb91999 Add test_sinefit makefile target 2013-08-16 15:36:11 -04:00
dab9625296 Run fsck at startup 2013-08-09 16:03:14 -04:00
4 changed files with 35 additions and 14 deletions

View File

@@ -5,7 +5,7 @@ all: test
test: test:
ifeq ($(INSIDE_EMACS), t) ifeq ($(INSIDE_EMACS), t)
@make test_trainola3 @make test_sinefit
else else
@echo 'No test suite for nilmtools. Try "make install"' @echo 'No test suite for nilmtools. Try "make install"'
endif endif
@@ -58,6 +58,14 @@ test_prep: /tmp/raw.dat
nilmtools/prep.py -c 2 /test/raw /test/sinefit /test/prep nilmtools/prep.py -c 2 /test/raw /test/sinefit /test/prep
nilmtool extract -s min -e max /test/prep | head -20 nilmtool extract -s min -e max /test/prep | head -20
test_sinefit:
make install >/dev/null 2>&1
-nilmtool destroy -R /test/sinefit
nilmtool create /test/sinefit float32_3
nilmtools/sinefit.py -c 5 -s '2013/03/25 09:11:00' \
-e '2013/03/25 10:11:00' /sharon/raw /test/sinefit
nilmtool extract -s min -e max /test/sinefit | head -20
test_decimate: test_decimate:
-@nilmtool destroy /lees-compressor/no-leak/raw/4 || true -@nilmtool destroy /lees-compressor/no-leak/raw/4 || true
-@nilmtool destroy /lees-compressor/no-leak/raw/16 || true -@nilmtool destroy /lees-compressor/no-leak/raw/16 || true

View File

@@ -1,5 +1,8 @@
# Install this by running "crontab crontab" (will replace existing crontab) # Install this by running "crontab crontab" (will replace existing crontab)
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
# m h dom mon dow cmd # m h dom mon dow cmd
# Run NilmDB processing every 5 minutes # Run NilmDB processing every 5 minutes
@@ -7,3 +10,6 @@
# Try frequently restarting the capture process in case it died # Try frequently restarting the capture process in case it died
*/5 * * * * chronic /home/nilm/data/capture.sh */5 * * * * chronic /home/nilm/data/capture.sh
# Run fsck at startup
@reboot chronic nilmdb-fsck --fix --no-data /home/nilm/data/db/

View File

@@ -37,17 +37,21 @@ def sfit4(data, fs):
i = argmax(F[0:int(N/2)] + F[1:int(N/2+1)]) i = argmax(F[0:int(N/2)] + F[1:int(N/2+1)])
# Interpolate FFT to get a better result (from Markus [B37]) # Interpolate FFT to get a better result (from Markus [B37])
U1 = real(Fc[i]) try:
U2 = real(Fc[i+1]) U1 = real(Fc[i])
V1 = imag(Fc[i]) U2 = real(Fc[i+1])
V2 = imag(Fc[i+1]) V1 = imag(Fc[i])
n = 2 * pi / N V2 = imag(Fc[i+1])
ni1 = n * i n = 2 * pi / N
ni2 = n * (i+1) ni1 = n * i
K = ((V2-V1)*sin(ni1) + (U2-U1)*cos(ni1)) / (U2-U1) ni2 = n * (i+1)
Z1 = V1 * (K - cos(ni1)) / sin(ni1) + U1 K = ((V2-V1)*sin(ni1) + (U2-U1)*cos(ni1)) / (U2-U1)
Z2 = V2 * (K - cos(ni2)) / sin(ni2) + U2 Z1 = V1 * (K - cos(ni1)) / sin(ni1) + U1
i = arccos((Z2*cos(ni2) - Z1*cos(ni1)) / (Z2-Z1)) / n Z2 = V2 * (K - cos(ni2)) / sin(ni2) + U2
i = arccos((Z2*cos(ni2) - Z1*cos(ni1)) / (Z2-Z1)) / n
except Exception:
# Just go with the biggest FFT peak
i = argmax(F[0:int(N/2)])
# Convert to Hz # Convert to Hz
f0 = i * float(fs) / N f0 = i * float(fs) / N

View File

@@ -96,8 +96,11 @@ def process(data, interval, args, insert_function, final):
rows = data.shape[0] rows = data.shape[0]
# Estimate sampling frequency from timestamps # Estimate sampling frequency from timestamps
fs = (rows-1) / (timestamp_to_seconds(data[-1][0]) - ts_min = timestamp_to_seconds(data[0][0])
timestamp_to_seconds(data[0][0])) ts_max = timestamp_to_seconds(data[-1][0])
if ts_min >= ts_max:
return 0
fs = (rows-1) / (ts_max - ts_min)
# Pull out about 3.5 periods of data at once; # Pull out about 3.5 periods of data at once;
# we'll expect to match 3 zero crossings in each window # we'll expect to match 3 zero crossings in each window