USBマイクの音量をリアルタイムプロットする on raspberry pi 2 B
1秒間の入力データをダウンサンプリングしてRMS値を算出しコンソールに出力。
これを100秒繰り返し、その配列データをMatplotにて出力した。
Matplotの上のグラフが100秒間の音量に相当し、下のグラフが最後の1秒入力のダウンサンプリングした配列のグラフ。
RMSでの音量算出は、相対的に高い音は音量が低く、低い音は音量が高く出るような気がした。
周波数に依存するのかな?この辺りを突き詰めてみると面白いかもしれない。
実は、イビキ検知判定システムを作ろうとしているのです。
なんかイビキの周波数とかでなんかありそうやないっすか。
import numpy as np import threading import pyaudio import threading import matplotlib.pyplot as plt class plotSound: def __init__(self): self.chunk = 1024 self.FORMAT = pyaudio.paInt16 self.CHANNELS = 1 #サンプリングレート、マイク性能に依存 self.RATE = 16000 self.RECORD_SECONDS = 1 #pyaudio self.audio = pyaudio.PyAudio() #plot time self.plottime = 100 self.loopcounter = 0 self.data_rms = [] while True: #マイクからデータ取得 self.stream = self.audio.open( format = self.FORMAT, channels = self.CHANNELS, rate = self.RATE, input = True, frames_per_buffer = self.chunk) self.all = [] for i in range(0, self.RATE / self.chunk * self.RECORD_SECONDS): self.data = self.stream.read(self.chunk) self.all.append(self.data) self.data = ''.join(self.all) self.data=np.frombuffer(self.data, dtype="int16") #converting numpy-type-array self.np_data=np.array(self.data, dtype = np.float64) #downsampling self.overhang = len(self.np_data) % 100 self.down_data=self.np_data[:-self.overhang] self.down_data=np.reshape(self.down_data, (len(self.down_data)/100,100)) self.down_data=np.average(self.down_data, 1) #RMS calculation self.rms=np.sqrt(np.mean(np.square(self.down_data))) print self.rms self.data_rms.append(self.rms) self.stream.close() self.loopcounter = self.loopcounter + 1 if self.loopcounter == self.plottime : break plt.subplot(2,1,1) plt.plot(self.data_rms) plt.subplot(2,1,2) plt.plot(self.down_data) plt.show() if __name__ == '__main__': plot=plotSound()
・pythonリアルタイムプロット