-
Notifications
You must be signed in to change notification settings - Fork 0
/
testfft.py
77 lines (68 loc) · 1.91 KB
/
testfft.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
76
77
#!/usr/bin/env python
#This script runs an fft on an existing .wav file. Code inspired by http://www.raspberrypi.org/forums/viewtopic.php?p=314087
import alsaaudio as aa
#import smbus
import subprocess
from time import sleep
from struct import unpack
import numpy as np
import matplotlib.pyplot as plt
import scipy
from scikits import audiolab
import lcm
from common import constants
# Set up audio
sample_rate = 44100
no_channels = 1
chunk = 1024 # Use a multiple of 8
def calculate_levels(data, chunk,sample_rate):
# Apply FFT - real data so rfft used
fourier=np.fft.rfft(data)
# Remove last element in array to make it the same size as chunk
fourier=np.delete(fourier,len(fourier)-1)
#print fourier
# Find amplitude
#print fourier
dB = np.log(np.abs(fourier))
#print power
return dB
def run():
subprocess.call("arecord -D plughw:0 --duration=5 --channels=1 --rate=44100 output.wav", shell=True)
print "Processing....."
data, sample_rate, toss1 = audiolab.wavread('output.wav') #data_in.read()
#l = len(data)
#print data
#data = np.array_str(data)
#print type(data)
#l = len(data)
#print data
#print l
matrix=calculate_levels(data, chunk,sample_rate)
y = matrix>0
matrix *= y
x = scipy.linspace(0,sample_rate/2, len(matrix))
# print x.shape
# print matrix.shape
matrix[:100000] = 0
a = .9*np.max(matrix)
# print np.max(matrix)
# print a
# start = 100000
# end = 400000
# total = sum(matrix[start:end])
#print total
# average = total/(len(matrix[start:end]))
#print 'average amplitude is', average
#print sum(matrix>(a))
peaks = np.where(matrix>=a)[0]
total = sum(matrix[peaks[0]-50:peaks[0]+50])
average = total/(len(matrix[peaks[0]-50:peaks[0]+50]))
print 'peaks at',np.where(matrix>=a)[0] *.2,'hZ'
print 'amplitude at', peaks[0]*.2, 'hZ is', matrix[peaks[0]]
#print matrix
plt.plot(x,matrix)
#plt.xlim(0,20000)
#plt.ylim(0,10)
plt.show()
if __name__ == '__main__':
run()