Axel Plinge Pattern Recognition, Computer Science XII, TU ...
Transcript of Axel Plinge Pattern Recognition, Computer Science XII, TU ...
Using Python for research and acoustic signal processing
Axel Plinge
Pattern Recognition, Computer Science XII,TU Dortmund University
October 2015
Bar-Ilan University
Axel Plinge Using Python for research and acoustic signalprocessing 1/15
Motivation (1)
Why use Python?
I it’s free
I cross platform (Windows, Linux, MacOS)I clear syntax
I code is easy to readI encapsulation of code in modules & packagesI alows for object oriented programing (OOP)
I powerful languageI functional programing: list comprehension, lambda, . . .I object oriented programingI iteration, slicing, . . .
I powerful libraries – maintained by PhDs :-)I vector and matrix operations (numpy)I MATLAB-like plotting (matplotlib)I probabilistic functions & models (scipy.stats)I machine learing (sklearn, . . . )I signal processing (scipy.signal)I . . .
Axel Plinge Using Python for research and acoustic signalprocessing 2/15
Contents
I MotivationI Installations
I WinPythonI Eclipse IDEI Audio
I LearningI Introductions & TutorialsI Documentation
I ExamplesI InteractiveI MatrixI FunctionsI ModuleI Audio PlaybackI Audio Loopback
Axel Plinge Using Python for research and acoustic signalprocessing 3/15
Motivation (2) Live Demo
live acoustic event detection with visualization coded in Python
Axel Plinge Using Python for research and acoustic signalprocessing 4/15
Installation: Python
I Python installation
+ pre-bulid scientific libraries
+ Qt GUI framework
Hints
1. Python 2.7 recommended, as still more libraries support 2.7 than 3.x
2. Download and unzip to Program Files/WinPython
3. Register using the control panel
Axel Plinge Using Python for research and acoustic signalprocessing 5/15
Installation: IDE
I Comfortable IDE
I Projects
I Debugging
I Version Control integration
Setup
1. Install Java Runtime (JRE) if necessary
2. Download and install Eclipse (current version is ‘Mars’)
3. Go to Help > Install new software and add http://pydev.org/updates
Axel Plinge Using Python for research and acoustic signalprocessing 6/15
Installation: Audio
/ Audio support from scipy is still rudimentary
, Several good projects exists..
Setup
1. open the WinPython console
2. pip install sounddevice --user
3. pip install pysoundfile --user
Axel Plinge Using Python for research and acoustic signalprocessing 7/15
Learning Python
Introductions
I Scipy Lectures introduction toI Python LanguageI Math with numpyI Plotting with matplotlibI Science with scipy
I Python for scientists
I MATLAB commands in Python
Tutorials
I The Python tutorial
I Quickstart numpy
I scipy tutorial
Axel Plinge Using Python for research and acoustic signalprocessing 8/15
Documentation
I Python 2.7
I numpy
I scipy
I matplotlib
Axel Plinge Using Python for research and acoustic signalprocessing 9/15
Interactive example>>> 1+12>>> import math>>> math.pi3.141592653589793>>> math.sin(math.pi/2.0)1.0>>> help(math)Help on built-in module math:
NAMEmath
FILE(built-in)
DESCRIPTIONThis module is always available. It provides access to themathematical functions defined by the C standard.
FUNCTIONSacos(...)
acos(x)Return the arc cosine (measured in radians) of x.
acosh(...)acosh(x)Return the inverse hyperbolic cosine of x.
Axel Plinge Using Python for research and acoustic signalprocessing 10/15
Matrix example
>>> import numpy as np>>> a=np.eye(3)>>> aarray([[ 1., 0., 0.],
[ 0., 1., 0.],[ 0., 0., 1.]])
>>> a[:,2]array([ 0., 0., 1.])>>> a[:,:2]array([[ 1., 0.],
[ 0., 1.],[ 0., 0.]])
>>> a[:2,:2]*5array([[ 5., 0.],
[ 0., 5.]])>>> b=np.array([[1,2,3]])>>> b.shape(1, 3)>>> a.shape(3, 3)>>> a*barray([[ 1., 0., 0.],
[ 0., 2., 0.],[ 0., 0., 3.]])
Axel Plinge Using Python for research and acoustic signalprocessing 11/15
Function example
>>> def doubleit(x):... return x*2...
>>> doubleit(5)10
>>> for i in range(3):... doubleit(i)...024
>>> [doubleit(i) for i in range(3)][0, 2, 4]
>>> a=[doubleit(i) for i in range(3)]>>> for ai in a:... doubleit(ai)...048
Axel Plinge Using Python for research and acoustic signalprocessing 12/15
Module example
A module is a file, it can contain variables, functions and classes
accumen.py’’’ variable is global within this module ’’’accumulator = 0
’’’ define function, global within this module ’’’def accum(x):
’’’ use the global variable ’’’global accumulator
accumulator += xprint accumulatorreturn accumulator
use it from another file or interpreterimport accumen as a
a.accum(1)print a.accumulator
Axel Plinge Using Python for research and acoustic signalprocessing 13/15
Playback example
import soundfileimport sounddevice as sd
data, fs = soundfile.read(’sentence.wav’)sd.play(data,fs)
Axel Plinge Using Python for research and acoustic signalprocessing 14/15
Loopback example
import numpy as npimport sounddevice as sdDURATION = 10 # secondsSAMPLERATE = 48000BLOCKSIZE = 4096
def callback(indata, outdata, frames, time, status):global theFilterif status:
print(status)filtered = theFilter.process(indata)outdata[:,1] = filteredoutdata[:,0] = filtered
ios = sd.Stream(samplerate=SAMPLERATE, channels=2, callback=callback,dtype=np.int16, blocksize=BLOCKSIZE)
ios.start()for i in xrange(10*DURATION):
sd.sleep(100)ios.stop()
Axel Plinge Using Python for research and acoustic signalprocessing 15/15
Overlapp-Add Filterimport numpy as npimport scipy
class OverlapAdd(object):def __init__(self,blocksize,gain):
self.blocksize= blocksizeself.gain = gainself.window = scipy.hanning(blocksize*2)self.lastin = np.zeros((blocksize),dtype=np.int16)self.overlap = np.zeros((blocksize),dtype=np.int16)self.lastout = np.zeros((blocksize),dtype=np.int16)self.inbuf = np.zeros((2*blocksize),dtype=np.int16)
def process(self,indata):self.inbuf[:self.blocksize] = self.lastinself.lastin = indata[:,0] * self.gainself.inbuf[self.blocksize:] = self.lastinself.inbuf = self.inbuf * self.windowself.filtered = scipy.fft(self.inbuf)self.filtered = self.stft_filter(self.filtered)self.filtered = scipy.real(scipy.ifft(self.filtered))self.filtered[:self.blocksize] += self.overlapself.overlap = self.filtered[self.blocksize:]self.lastout = self.filtered[:self.blocksize]return self.lastout