前提・実現したいこと
外部マイクから音を読み取り、リアルタイムでスペクトルアナライザーを表示するプログラムなのですが、ある一定周波数以上の一定以上の大きさの音を指定回観測したらほかのpythonファイルでその旨受け取る、というものを作りたく、観測し、print(以下ではfind freqとprintしています)するものまでは作ることができたのですが、ほかのファイルで受け取ることができません。以下のような3つのファイルを作成し、一つで受け取ろうと思いファイルをimportしてやろうと思ったのですが、エラーが出てしまいます。解決法を教えてほしいです。
発生している問題・エラーメッセージ
TypeError: update() missing 1 required positional argument: 'self'
該当のソースコード
Python
1 2#sound_OK2.py# 3#プロット関係のライブラリ 4import pyqtgraph as pg 5from pyqtgraph.Qt import QtCore, QtGui 6import numpy as np 7 8#音声関係のライブラリ 9import pyaudio 10 11#カット周波数と音量 12cutnoise = 5 13cutfreq = 0 14findfreqsound = 10 15freqcount = 50 16x=0 17 18 19class PlotWindow: 20 def __init__(self): 21 #マイクインプット設定 22 self.CHUNK=1024 #1度に読み取る音声のデータ幅 23 self.RATE=50000 #サンプリング周波数 24 self.update_seconds=10 #更新時間[ms] 25 self.audio=pyaudio.PyAudio() 26 self.stream=self.audio.open(format=pyaudio.paInt16, 27 channels=1, 28 rate=self.RATE, 29 input=True, 30 frames_per_buffer=self.CHUNK) 31 32 #音声データの格納場所(プロットデータ) 33 self.data=np.zeros(self.CHUNK) 34 self.axis=np.fft.fftfreq(len(self.data), d=1.0/self.RATE) 35 36 #プロット初期設定 37 self.win=pg.GraphicsWindow() 38 self.win.setWindowTitle("SpectrumAnalyzer") 39 40 self.plt=self.win.addPlot() #プロットのビジュアル関係 41 self.plt.setYRange(0,1) #y軸の制限 42 self.plt.setXRange(0,25000) 43 44 #アップデート時間設定 45 self.timer=QtCore.QTimer() 46 self.timer.timeout.connect(self.update) 47 self.timer.start(self.update_seconds) 48 #10msごとにupdateを呼び出し 49 50 51 def update(self): 52 self.data=np.append(self.data,self.AudioInput()) 53 if len(self.data)/1024 > 10: 54 self.data=self.data[1024:] 55 self.fft_data=self.CUTYMINFREQ(self) 56 self.axis=self.XFILTER(self) 57 global x 58 if(self.fft_data.max()>findfreqsound): 59 x=x+1 60 self.plt.plot(x=self.axis, y=self.fft_data, clear=True, pen="y") 61 #print(x) 62 63 if(x==freqcount): 64 print("find freq") 65 z = 1 66 x = 0 67 z = 0 68 69 70 def AudioInput(self): 71 ret=self.stream.read(self.CHUNK) #音声の読み取り(バイナリ) CHUNKが大きいとここで時間かかる 72 #バイナリ → 数値(int16)に変換 73 #32768.0=2^16で割ってるのは正規化(絶対値を1以下にすること) 74 ret=np.frombuffer(ret, dtype="int16")/32768.0 75 return ret 76 77 def FFT_AMP(self, data): 78 data=np.hamming(len(data))*data 79 data=np.fft.fft(data) 80 data=np.abs(data) 81 return data 82 83 def XFILTER(self, data): 84 xfil=np.fft.fftfreq(len(self.data), d=1.0/self.RATE) 85 #xfil=[0 if i<cutfreq else i for i in xfil]#以下の周波数を0に統合 86 return xfil 87 88 def YFILTER(self, data): 89 yfil=self.FFT_AMP(self.data) 90 #yfil=[0 if i<cutnoise else i for i in yfil] #以下の大きさの音を0に統合 91 return yfil 92 93 def XMINFINDER(self, data): 94 x=[i for i,val in enumerate(self.XFILTER(self)) if val<=cutfreq] 95 return x 96 97 def CUTYMINFREQ(self, data): 98 y=self.YFILTER(self) 99 y[self.XMINFINDER(self)]="0" 100 return y 101 102#all_combine_practice.py# 103 104from sound_OK2 import PlotWindow 105from pyqtgraph.Qt import QtCore, QtGui 106import sys 107 108 109#音声認識プログラムSound_OK2 110#cutfreq以上の周波数の音量がfindfreqsoundをfreqcount回数超えたら次に進むよ 111 112 113if __name__=="__main__": 114 plotwin=PlotWindow() 115 if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'): 116 st=QtGui.QApplication.instance().exec_() 117 118print("a") 119 120#sound_practice_3.py# 121 122from sound_OK2 import PlotWindow 123 124 125#音声関係のライブラリ 126 127PLO=PlotWindow.update() 128z=PLO.x 129print(z) 130 131 132
試したこと
何が正解かわからないので手あたり次第かっこをつけたりしてみましたができません・・・
補足情報(FW/ツールのバージョンなど)
1つ目のプログラムを2つ目のプログラムで動かし、3つ目のプログラムで値を得ようとしています。
まだ始めたてなのでよろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。