前提・実現したいこと
ここに質問の内容を詳しく書いてください。
(例)現在、pythonを用いてクロススペクトル法に関するプログラムを書いていいるのですが、関数を定義してリストにreturnで追加を行いたいのですが二回同じ関数に変数を入れると2回目の呼び出し時の計算でエラーが発生します。これまでC言語でプログラムを書いてきて、今回pythonの学習のため書き換えているためpythonに関する知識はそれ程ありませんが、調べても一向に解決出来そうにないため質問させて頂きました。
関数定義を呼び出すプログラムを実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
% python3 acoustic_ranging.py Traceback (most recent call last): File "acoustic_ranging.py", line 65, in <module> transmits, reflects = Wave(x[1], i) #波の作成関数に値を渡す File "acoustic_ranging.py", line 22, in Wave transmit += Transmitted(x,i,j) File "acoustic_ranging.py", line 27, in Transmitted return A * cos((2*pi*f(j)*(i/F-0.02)) - (2*pi*f(j)*x)/c + theta) TypeError: 'numpy.ndarray' object is not callable
該当のソースコード
python
1import numpy as np 2import math 3import random 4import matplotlib.pyplot as plt 5from statistics import mean 6 7pi, cos, sin = np.pi, np.cos, np.sin #数式の省略 8F, F_min, F_max = 44100.0, 2153, 7644 #サンプリング周波数, 最大, 最小 9F_w = F_max - F_min #周波数帯域幅 10N, N_freq = 2048, 256 #データ点数, 周波数領域でのデータ点数 11A, gannma, theta, c = 1.0, 0.2, 0.0, 340.0 #振幅スペクトル, 反射係数, 初期位相, 音速 12d, d_min = 1.0, c/(2*F_w*(N/N_freq)) #対象物までの距離, 最小測定可能距離 13x = [0.0, 0.006] #マイクロホンの位置 14 15def f(j): #第j周波成分の周波数 16 return (F/N) * (j+100) 17 18def Wave(x, i): #波の作成 19 transmit, reflect = 0.0, 0.0 20 for j in range(N_freq): 21 transmit += Transmitted(x,i,j) 22 reflect += Reflected(x,i,j) 23 return transmit, reflect #それぞれの値を返す 24 25def Transmitted(x,i,j): #送信波成分 26 return A * cos((2*pi*f(j)*(i/F-0.02)) - (2*pi*f(j)*x)/c + theta) 27 28def Reflected(x,i,j): #反射波成分 29 return A * gannma * cos((2*pi*f(j)*(i/F-0.02)) - (2*pi*f(j)*(2*d-x))/c + theta+pi/2) 30 31def Rand(i): #乱数の生成 32 return (random.uniform(0,1)-0.5)*2 #-1〜1までの乱数 33 34#channel 1 35vt, vr, vc = [], [], [] #波の成分を格納するリストの作成 36for i in range(N): 37 transmit, reflect = Wave(x[0], i) #波の作成関数に値を渡す 38 vt.append(transmit) #送信波の格納 39 vr.append(reflect) #反射波の格納 40 vc.append(transmit + reflect) #合成波の生成 41 42gaus = [] #ガウス乱数を入れるための配列 43for i in range (512): 44 gaus.append(Rand(i)*math.exp(-i*0.1)) 45 46wave = [] #測定系のノイズを入れるための配列 47for i in range (N): 48 figure = 0 49 for j in range (512): 50 if (i-j) >=0: 51 figure += gaus[j]*vc[i-j] #合成波にガウス乱数を畳み込む 52 wave.append(figure) 53 54f = np.fft.fft(wave) #vcを高速フーリエ変化行いfに格 55 56f2 = [] #データの抽出を行う 57for i in range(N): 58 if F/N*i>=F_min and F/N*i<=F_max: #周波数帯域でデータを抽出 59 f2.append(f[i]) 60 61#channel 2 62vt2, vr2, vc2 = [], [], [] #波の成分を格納するリストの作成 63for i in range(N): 64 transmits, reflects = Wave(x[1], i) #波の作成関数に値を渡す 65 vt2.append(transmits) #送信波の格納 66 vr2.append(reflects) #反射波の格納 67 vc2.append(transmits + reflects) #合成波の生成 68 69```位置 70 71### 試したこと 72 73channel2をコメントアウトするとプログラムは実行でき欲しい結果の一つが得られます。 74また、反射波や送信波の関数の数式をx+iなどの簡単な式にしても実行することができます。 75また、1回目に渡すデータを入れ替えても1回目だけなら実行できます。 76したがって、原因は式にあると思うのですがその場合、一回だけなら結果が得られる理由を良くわかりません。 77 78### 補足情報(FW/ツールのバージョンなど) 79 80pythonはバージョン3.7.3を使っています
回答1件
あなたの回答
tips
プレビュー