-
Notifications
You must be signed in to change notification settings - Fork 1
/
AudioStreamFFT.py
76 lines (59 loc) · 2.63 KB
/
AudioStreamFFT.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import pyaudio
import numpy
class AudioStream:
def __init__(self, sr, bufferSize, bitRes, verbose):
self.daemon = True
"""
Sampling rate of this sound device, size and resolution of buffers and initial values
"""
self.audioStarted = 0
self.verbose = verbose
self.rate = sr
self.bufferSize = bufferSize
self.bitRes = bitRes
self.binSize =int(self.rate/self.bufferSize)
if (self.bitRes == 16):
width = 2
if (self.bitRes == 8):
width = 1
if (self.bitRes == 32):
width = 4
"""
Creting the audio stream from our mic, Callback Mode.
"""
p = pyaudio.PyAudio()
"""
Setting up the array that will handle the timeseries of audio data from our input
TODO: Change string to use parameter to set this
"""
if (self.bitRes == 16):
self.audio = numpy.empty((self.bufferSize),dtype="int16")
print "Using 16 bits"
if (self.bitRes == 8):
self.audio = numpy.empty((self.bufferSize),dtype="int8")
print "Using 8 bits"
if (self.bitRes == 32):
self.audio = numpy.empty((self.bufferSize),dtype="int32")
print "Using 32 bits"
def callback(in_data,frame_count, time_info, status):
self.audio = numpy.fromstring(in_data,dtype=numpy.int16)
self.audioFFT = self.fft(self.audio)
self.audioFFT = 20*numpy.log10(self.audioFFT)
self.audioStarted = 1
return (self.audioFFT, pyaudio.paContinue)
"""
Open the Audio Stream. Start separate thread
"""
self.inStream = p.open(format = p.get_format_from_width(width, unsigned=False),
channels =1,
rate =self.rate,
input =True,
frames_per_buffer=self.bufferSize,
stream_callback = callback)
def fft(self, audio):
"""
Fast Fourier Transform 'output' contains the strength of each frequency in the audio signal
"""
left = numpy.abs(numpy.fft.fft(audio))
output = left
return output