WaveScope
Ryan Newton MIT/CSAIL Work with: Lewis Girod, Kyle Jamieson, Yuan Mei, Stan Rost, Arvind Thiagarajan, Hari Balakrishnan, Sam Madden http://wavescope.csail.mit.edu/
WaveScope Ryan Newton MIT/CSAIL Work with: Lewis Girod, Kyle - - PowerPoint PPT Presentation
WaveScope Ryan Newton MIT/CSAIL Work with: Lewis Girod, Kyle Jamieson, Yuan Mei, Stan Rost, Arvind Thiagarajan, Hari Balakrishnan, Sam Madden http://wavescope.csail.mit.edu/ Motivation: Stream + Signal Processing
Ryan Newton MIT/CSAIL Work with: Lewis Girod, Kyle Jamieson, Yuan Mei, Stan Rost, Arvind Thiagarajan, Hari Balakrishnan, Sam Madden http://wavescope.csail.mit.edu/
http://wavescope.csail.mit.edu/
http://wavescope.csail.mit.edu/
Are there anomalies in the frequency response to an introduced pulse?
http://wavescope.csail.mit.edu/
Are there anomalies in the frequency response to an introduced pulse? Is a seizure imminent given signals from various brain regions?
http://wavescope.csail.mit.edu/
Are there anomalies in the frequency response to an introduced pulse? What time ranges contained marmot calls? Is a seizure imminent given signals from various brain regions?
Are there anomalies in the frequency response to an introduced pulse? What time ranges contained marmot calls? Is a seizure imminent given signals from various brain regions?
http://wavescope.csail.mit.edu/
Are there anomalies in the frequency response to an introduced pulse? What time ranges contained marmot calls? Is a seizure imminent given signals from various brain regions?
http://wavescope.csail.mit.edu/
Limitations of Streaming DBMS
High data-rate
4 channels x 48 khz = 400,000 bytes/sec (per node) x 20 nodes
High data-rate Embedded, low- power devices
4 channels x 48 khz = 400,000 bytes/sec (per node) x 20 nodes
Signal-oriented data-model
High data-rate Embedded, low- power devices
4 channels x 48 khz = 400,000 bytes/sec (per node) x 20 nodes
Signal-oriented data-model
High data-rate
Embedded, low- power devices
4 channels x 48 khz = 400,000 bytes/sec (per node) x 20 nodes
Signal-oriented data-model
High data-rate
Ch0 = AudioSource(0, 48000, 1024); S = stream_map(fft, Ch0);
WaveScript Language
Ch0 = AudioSource(0, 48000, 1024); S = stream_map( FFT, Ch0 );
Embedded, low- power devices
4 channels x 48 khz = 400,000 bytes/sec (per node) x 20 nodes
Signal-oriented data-model
High data-rate
Ch0 = AudioSource(0, 48000, 1024); S = stream_map(fft, Ch0);
WaveScript Language
Ch0 = AudioSource(0, 48000, 1024); S = stream_map( FFT, Ch0 );
Embedded, low- power devices
4 channels x 48 khz = 400,000 bytes/sec (per node) x 20 nodes
to native code, executed by engine
Node
Some Marmots
http://wavescope.csail.mit.edu/
Node
Some Marmots
http://wavescope.csail.mit.edu/
Node
Some Marmots
http://wavescope.csail.mit.edu/
Node
Some Marmots
http://wavescope.csail.mit.edu/
Node
Some Marmots
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
(Phase1)
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
(Phase1)
Fast-path DSP to determine temporal ranges for marmot calls
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
(Phase1)
Stream’s Tuple Schema
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
(Phase1)
Stream’s Tuple Schema
Data Model:
tagged-union datatypes, but not Streams.
forward, rewindow
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
(Phase1)
Stream’s Tuple Schema
Data Model:
tagged-union datatypes, but not Streams.
forward, rewindow
Ch0 = AudioSource(...);
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
(Phase1)
Stream’s Tuple Schema
Data Model:
tagged-union datatypes, but not Streams.
forward, rewindow
S
A B
[4,8) [0,4) Ch0 = AudioSource(...);
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
(Phase1)
Stream’s Tuple Schema
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
http://wavescope.csail.mit.edu/
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4);
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
http://wavescope.csail.mit.edu/
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4);
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
http://wavescope.csail.mit.edu/
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
http://wavescope.csail.mit.edu/
profileDetect( Ch0, ...)
ProfileDetector
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
http://wavescope.csail.mit.edu/
ProfileDetector
zip2(...)
<iterate> rewindow(...) threshFilter(...)
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
http://wavescope.csail.mit.edu/
ProfileDetector
<iterate> <iterate>
<iterate>
<iterate> <iterate> <iterate>
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
wavescope@nms.csail.mit.edu
ProfileDetector
<iterate> <iterate>
<iterate>
<iterate> <iterate> <iterate>
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
wavescope@nms.csail.mit.edu
ProfileDetector
<iterate> <iterate>
<iterate>
<iterate> <iterate> <iterate>
Integrated Language
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
wavescope@nms.csail.mit.edu
ProfileDetector
<iterate> <iterate>
<iterate>
<iterate> <iterate> <iterate>
Integrated Language
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
wavescope@nms.csail.mit.edu
ProfileDetector
<iterate> <iterate>
<iterate>
<iterate> <iterate> <iterate>
Integrated Language
custom-operators
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
wavescope@nms.csail.mit.edu
ProfileDetector
<iterate> <iterate>
<iterate>
<iterate> <iterate> <iterate>
http://wavescope.csail.mit.edu/
<w1,w2,w3,w4> sync ProfileDetector Audio0
<audio window>
<t1,t2,bool> Audio1 Audio2 Audio3
<audio window> <audio window> <audio window>
// Main query, phase 1 Ch0 = AudioSource(0, 48000, 1024); Ch1 = AudioSource(1, 48000, 1024); Ch2 = AudioSource(2, 48000, 1024); Ch3 = AudioSource(3, 48000, 1024); control = profileDetect(Ch0, marmotScore, <64,192>); datawindows = sync4(control, Ch0, Ch1, Ch2, Ch4); fun profileDetect(S : Stream<SigSeg<int16>>, scorefun, <winsize,step>) {
wins = rewindow(S, winsize, step); scores : Stream< float > scores = iterate(w in wins) { emit scorefun( FFT(w) ); }; withscores : Stream<float, SigSeg<int16>> withscores = zip2(scores, wins); return threshFilter(withscores);
}
wavescope@nms.csail.mit.edu
ProfileDetector
<iterate> <iterate>
<iterate>
<iterate> <iterate> <iterate>
Abstraction, Abstraction, Abstraction
http://wavescope.csail.mit.edu/
number of emerging apps
Language, compiler, distributed + embedded runtime
abstraction through query generation
measurements show 1-7 million samples/s on real apps
http://wavescope.csail.mit.edu/