pyqtgraphとpyaudioを用いてリアルタイムスペクトルアナライザを実装していたのですが問題が発生し、手詰まりになってしまったので質問させてください。
以下のソースのpyaudioのcallback()内の処理にあるspecItem.plot()内にあるclearをTrueにしてcallbackが来るたびに更新できるようにするとSegmentation fault: 11が現れました。Falseにするとまだ動作してくれますが、時間が経つと動作が重くなるのかノイズが入るので困っています。
ドキュメントや他人のコードを見て回ったのですが、自分が未熟なため中々解決に至るものが見当たりません。
すみませんが、どこが問題を引き起こし、どのようにしたら解決できるかを教えてください。
よろしくお願いします。
開発環境: Yosemite, pyqtgraph 0.9.8, PyAudio0.2.8
lang
1 2# encoding: utf-8 3import sys 4import time 5 6from scipy import fft, fromstring 7import pyaudio 8import pyqtgraph as pg 9from pyqtgraph.Qt import QtGui, QtCore 10 11FORMAT = pyaudio.paFloat32 12CHANNELS = 1 13RATE = 16000 14fftLen = 512 15 16pa = pyaudio.PyAudio() 17app = QtGui.QApplication([]) 18app.quitOnLastWindowClosed() 19# layout 20mainWindow = QtGui.QMainWindow() 21mainWindow.setWindowTitle("Spectrum Analyzer") 22mainWindow.resize(800, 300) 23centralWid = QtGui.QWidget() 24mainWindow.setCentralWidget(centralWid) 25lay = QtGui.QVBoxLayout() 26centralWid.setLayout(lay) 27specWid = pg.PlotWidget(name="spectrum") 28specItem = specWid.getPlotItem() 29specItem.setMouseEnabled(x = False, y = False) 30specItem.setYRange(0, 100) 31specItem.setXRange(0, fftLen/2, padding = 0) 32lay.addWidget(specWid) 33 34mainWindow.show() 35 36# callback 37def callback(in_data, frame_count, time_info, status): 38 data = fromstring(in_data, dtype = "float32") 39 fftspec = fft(data) 40 #problem 41 specItem.plot(abs(fftspec[:len(fftspec)/2]), clear=True) 42 QtGui.QApplication.processEvents() 43 return (in_data, pyaudio.paContinue) 44 45 46stream = pa.open(format = FORMAT, 47 channels = CHANNELS, 48 rate = RATE, 49 input = True, 50 output = True, 51 frames_per_buffer = 512, 52 stream_callback = callback) 53 54 55stream.start_stream() 56app.exec_() 57 58stream.stop_stream() 59stream.close() 60 61pa.terminate()
あなたの回答
tips
プレビュー