Learning. â» Introductions & Tutorials. â» Documentation. â» Examples .... [0, 2, 4]. >>> a=[doubleit(i) for i in range(3)]. >>> for ai in a: ... doubleit(ai) ... 0. 4. 8 ...
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 signal processing 1/15
Motivation (1) Why use Python? I
it’s free
I
cross platform (Windows, Linux, MacOS) clear syntax
I
I I I
I
powerful language I I I
I
code is easy to read encapsulation of code in modules & packages alows for object oriented programing (OOP) functional programing: list comprehension, lambda, . . . object oriented programing iteration, slicing, . . .
powerful libraries – maintained by PhDs :-) I I I I I I
vector and matrix operations (numpy) MATLAB-like plotting (matplotlib) probabilistic functions & models (scipy.stats) machine learing (sklearn, . . . ) signal processing (scipy.signal) ...
Axel Plinge
Using Python for research and acoustic signal processing 2/15
Contents
Motivation Installations I WinPython I Eclipse IDE I Audio I Learning I Introductions & Tutorials I Documentation I Examples I Interactive I Matrix I Functions I Module I Audio Playback I Audio Loopback I
I
Axel Plinge
Using Python for research and acoustic signal processing 3/15
Motivation (2) Live Demo
live acoustic event detection with visualization coded in Python
Axel Plinge
Using Python for research and acoustic signal processing 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 signal processing 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 signal processing 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 signal processing 7/15
Learning Python
Introductions I
Scipy Lectures I I I I
introduction to
Python Language Math with numpy Plotting with matplotlib 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 signal processing 8/15
Documentation
I
Python 2.7
I
numpy
I
scipy
I
matplotlib
Axel Plinge
Using Python for research and acoustic signal processing 9/15
Interactive example >>> 1+1 2 >>> import math >>> math.pi 3.141592653589793 >>> math.sin(math.pi/2.0) 1.0 >>> help(math) Help on built-in module math: NAME math FILE (built-in) DESCRIPTION This module is always available. It provides access to the mathematical functions defined by the C standard. FUNCTIONS acos(...) acos(x) Return the arc cosine (measured in radians) of x. acosh(...)
Axel Plinge
Using Python for research and acoustic signal processing 10/15
Matrix example >>> import numpy as np >>> a=np.eye(3) >>> a array([[ 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]*5 array([[ 5., 0.], [ 0., 5.]]) >>> b=np.array([[1,2,3]]) >>> b.shape (1, 3) >>> a.shape (3, 3) >>> a*b array([[ 1., 0., 0.], [ 0., 2., 0.], [ 0., 0., 3.]])
Axel Plinge
Using Python for research and acoustic signal processing 11/15
Function example >>> def doubleit(x): ... return x*2 ... >>> doubleit(5) 10 >>> for i in range(3): ... doubleit(i) ... 0 2 4 >>> [doubleit(i) for i in range(3)] [0, 2, 4] >>> a=[doubleit(i) for i in range(3)] >>> for ai in a: ... doubleit(ai) ... 0 4 8
Axel Plinge
Using Python for research and acoustic signal processing 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 += x print accumulator return accumulator
use it from another file or interpreter import accumen as a a.accum(1) print a.accumulator
Axel Plinge
Using Python for research and acoustic signal processing 13/15
Playback example
import soundfile import sounddevice as sd data, fs = soundfile.read(’sentence.wav’) sd.play(data,fs)
Axel Plinge
Using Python for research and acoustic signal processing 14/15
Loopback example
import numpy as np import sounddevice as sd DURATION = 10 # seconds SAMPLERATE = 48000 BLOCKSIZE = 4096 def callback(indata, outdata, frames, time, status): global theFilter if status: print(status) filtered = theFilter.process(indata) outdata[:,1] = filtered outdata[:,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 signal processing 15/15
Overlapp-Add Filter import numpy as np import scipy class OverlapAdd(object): def __init__(self,blocksize,gain): self.blocksize= blocksize self.gain = gain self.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.lastin self.lastin = indata[:,0] * self.gain self.inbuf[self.blocksize:] = self.lastin self.inbuf = self.inbuf * self.window self.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.overlap self.overlap = self.filtered[self.blocksize:] self.lastout = self.filtered[:self.blocksize] return self.lastout