折角サウンドブラスターがUbuntuで使えるようになったので、録音した波形を表示するオシロスコープもどきを作ってみまた。
自分の声を録音しました。周期が200サンプルくらいなので、周波数は110Hzです。いろいろな装置(ソフト)で計測した結果と一致しています。何も凝ったことはしないでひたすら測定データを表示しているだけです。
ソースです。
# -*- coding:utf-8 -*-
#pyqtgraph関係のライブラリ
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import sys
#音声関係のライブラリ
import pyaudio
class DrawPCM:
def __init__(self):
#プロット初期設定
self.win=pg.GraphicsWindow()
self.win.setWindowTitle(u"オシロスコープ")
self.plt=self.win.addPlot() #プロットのビジュアル関係
self.plt.setYRange(-1,1) #y軸の上限、下限の設定
self.plot_data=self.plt.plot() #プロットデータを入れる場所
self.received = False
#マイクインプット設定
self.CHUNK=1024 #1回の受信で読み取るデータ量
self.RATE=22050 #サンプリング周波数
self.audio=pyaudio.PyAudio()
self.stream=self.audio.open(format=pyaudio.paInt16,
channels=1,
rate=self.RATE,
input=True,
frames_per_buffer=self.CHUNK,
stream_callback=self.callback)
self.stream.start_stream()
#アップデート時間設定
self.timer=QtCore.QTimer()
self.timer.timeout.connect(self.update)
self.timer.start(10)
#音声データの格納場所(プロットデータ)
self.data=np.zeros(self.CHUNK)
# デストラクタ
def __del__(self):
print('terminated.')
self.stream.stop_stream()
self.stream.close()
self.audio.terminate()
def callback(self, in_data, frame_count, time_info, status):
self.data=np.frombuffer(in_data, dtype="int16")/32768.0
self.received = True
return (in_data,pyaudio.paContinue)
def update(self):
if self.received == True:
self.plot_data.setData(self.data) #プロットデータを格納
self.received = False
if __name__=="__main__":
plotwin=DrawPCM()
if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
グラフの描画処理を速くするため、PyQtGraphを使っています。MatPlotLibは遅くてダメです。
結果は、期待に応える描画速度です。
このソースを動かすのに問題があります。
①PyAudioがインストールできない(Windows)
こちらのページを参考にして解決しました
②pyqtgraphに必要なPyQt-5がインストールできない (Raspberry Pi)
もしダメならば深入りはせずLinuxパソコンの導入、Vertual Box + Linuxでトライするのが近道かもしれません。
pyqtgraphはちょっと癖があります。タイマーと連動させる必要があります。
タイマー処理update()でデータを受信完了したらプロットデータに格納します。
コールバック関数では、取得したデータを-1から1のデータに補正して受信完了をセットします。
Tkinterを使ってストップボタンなどを付ければもっと使い物になると思います。 |