🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1099閲覧

他のファイルの変数値を読み込みたい。

lynn-lynn

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2020/12/25 11:55

前提・実現したいこと

外部マイクから音を読み取り、リアルタイムでスペクトルアナライザーを表示するプログラムなのですが、ある一定周波数以上の一定以上の大きさの音を指定回観測したらほかの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つ目のプログラムで値を得ようとしています。
まだ始めたてなのでよろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

クラスにはインスタンスメンバとクラスメンバの二種類があります。それぞれローカル変数・関数とグローバル変数・関数みたいなものだと思ってください。それでこの PlotWindow クラスはインスタンスメンバを参照するようにできてます。plotwin=PlotWindow() ってやってインスタンス(ローカルな環境)を作り、__init__ が実行されて動いてます。インスタンスメンバはそのローカルな環境からしか基本呼び出せません。

対して PlotWindow.update() というのはクラスメンバ(グローバルなやつ)を呼び出す時に使われるやり方です。PlotWindow.update() がクラスメンバでない以上この呼び出し方は不可能です(あれをこーしてそーするとできなくもないけど黒魔術)。

素直に同じファイルで動かすか、クラスの使い方を学んでいい感じにクラスを作り変えるかしましょう。

投稿2020/12/25 12:19

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問