Merged DT9837A

This commit is contained in:
Anne de Jong 2020-10-16 21:07:58 +02:00
commit a16fa576fd
4 changed files with 31 additions and 16 deletions

2
.gitignore vendored
View File

@ -27,3 +27,5 @@ lasp/ui_*
resources_rc.py resources_rc.py
.ropeproject .ropeproject
.spyproject .spyproject
test/test_uldaq
lasp/device/lasp_daq.cxx

View File

@ -12,7 +12,7 @@
#include "lasp_mat.h" #include "lasp_mat.h"
#define MAX_SOS_FILTER_BANK_SIZE 40 #define MAX_SOS_FILTER_BANK_SIZE 40
#define MAX_SOS_FILTER_BANK_NSECTIONS 6 #define MAX_SOS_FILTER_BANK_NSECTIONS 10
typedef struct Sosfilterbank Sosfilterbank; typedef struct Sosfilterbank Sosfilterbank;

View File

@ -5,7 +5,7 @@ Description: Read data from image stream and record sound at the same time
""" """
#import cv2 as cv #import cv2 as cv
from .lasp_atomic import Atomic from .lasp_atomic import Atomic
from threading import Thread, Condition, Lock from threading import Thread, Lock
import numpy as np import numpy as np
class DAQConfiguration: class DAQConfiguration:
@ -98,7 +98,6 @@ class AvStream:
self._callbacklock = Lock() self._callbacklock = Lock()
self._running = Atomic(False) self._running = Atomic(False)
self._running_cond = Condition()
self._video = video self._video = video
self._video_started = Atomic(False) self._video_started = Atomic(False)
@ -191,8 +190,10 @@ class AvStream:
# present, and there should be output callbacks, we explicitly set # present, and there should be output callbacks, we explicitly set
# the output buffer to zero # the output buffer to zero
noutput_cb = len(self._callbacks[AvType.audio_output]) noutput_cb = len(self._callbacks[AvType.audio_output])
shouldhaveoutput = (self.avtype == AvType.audio_output or shouldhaveoutput = (self.avtype == AvType.audio_output or
self.daqconfig.duplex_mode) self.daqconfig.duplex_mode)
if noutput_cb == 0 and shouldhaveoutput and outdata is not None: if noutput_cb == 0 and shouldhaveoutput and outdata is not None:
outdata[:, :] = 0 outdata[:, :] = 0
@ -216,14 +217,15 @@ class AvStream:
def stop(self): def stop(self):
self._running <<= False self._running <<= False
with self._running_cond:
self._running_cond.notify()
if self._video: if self._video:
self._videothread.join() self._videothread.join()
self._videothread = None self._videothread = None
self._aframectr <<= 0 self._aframectr <<= 0
self._vframectr <<= 0 self._vframectr <<= 0
self._video_started <<= False self._video_started <<= False
self._audiobackend.stop() self._audiobackend.stop()
self._audiobackend = None self._audiobackend = None

View File

@ -31,7 +31,7 @@ class SLM:
def __init__(self, def __init__(self,
fs, fs,
fbdesigner, fbdesigner=None,
tw=TimeWeighting.fast, tw=TimeWeighting.fast,
fw=FreqWeighting.A, fw=FreqWeighting.A,
xmin = None, xmin = None,
@ -58,10 +58,16 @@ class SLM:
""" """
self.fbdesigner = fbdesigner self.fbdesigner = fbdesigner
if xmin is None: if xmin is None and fbdesigner is not None:
xmin = fbdesigner.xs[0] xmin = fbdesigner.xs[0]
if xmax is None: elif fbdesigner is None:
xmin = 0
if xmax is None and self.fbdesigner is not None:
xmax = fbdesigner.xs[-1] xmax = fbdesigner.xs[-1]
elif fbdesigner is None:
xmax = 0
self.xs = list(range(xmin, xmax + 1)) self.xs = list(range(xmin, xmax + 1))
nfilters = len(self.xs) nfilters = len(self.xs)
@ -81,12 +87,16 @@ class SLM:
# 'Probe' size of filter coefficients # 'Probe' size of filter coefficients
self.nom_txt = [] self.nom_txt = []
# This is a bit of a hack, as the 5 is hard-encoded here, but should in
# fact be coming from somewhere else..
sos_overall = np.array([1,0,0,1,0,0]*5, dtype=float)
if fbdesigner is not None: if fbdesigner is not None:
assert fbdesigner.fs == fs assert fbdesigner.fs == fs
sos0 = fbdesigner.createSOSFilter(self.xs[0]).flatten() sos_firstx = fbdesigner.createSOSFilter(self.xs[0]).flatten()
self.nom_txt.append(fbdesigner.nominal_txt(self.xs[0])) self.nom_txt.append(fbdesigner.nominal_txt(self.xs[0]))
sos = np.empty((nfilters, sos0.size), dtype=float, order='C') sos = np.empty((nfilters, sos_firstx.size), dtype=float, order='C')
sos[0, :] = sos0 sos[0, :] = sos_firstx
for i, x in enumerate(self.xs[1:]): for i, x in enumerate(self.xs[1:]):
sos[i+1, :] = fbdesigner.createSOSFilter(x).flatten() sos[i+1, :] = fbdesigner.createSOSFilter(x).flatten()
@ -95,15 +105,16 @@ class SLM:
if include_overall: if include_overall:
# Create a unit impulse response filter, every third index equals # Create a unit impulse response filter, every third index equals
# 1, so b0 = 1 and a0 is 1 (by definition) # 1, so b0 = 1 and a0 is 1 (by definition)
sos[-1,:] = 0 # a0 = 1, b0 = 1, rest is zero
sos[-1,::3] = 1 sos[-1,:] = sos_overall
self.nom_txt.append('overall') self.nom_txt.append('overall')
else: else:
# No filterbank, means we do only compute the overall values. This # No filterbank, means we do only compute the overall values. This
# means that in case of include_overall, it creates two overall # means that in case of include_overall, it creates two overall
# channels. That would be confusing, so we do not allow it. # channels. That would be confusing, so we do not allow it.
assert include_overall == False if include_overall:
sos = None sos = sos_overall[np.newaxis,:]
self.nom_txt.append('overall') self.nom_txt.append('overall')
self.slm = pyxSlm(prefilter, sos, self.slm = pyxSlm(prefilter, sos,