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()
    


f:id:iroha112233:20160324231806j:plain


pythonリアルタイムプロット

Realtime FFT Graph of Audio WAV File or Microphone Input with Python, Scipy, and WCKgraph » SWHarden.com

Realtime FFT Audio Visualization with Python » SWHarden.com