前提・実現したいこと
現在、クロススペクトル解析を行うために、2つのフーリエ変換の結果とその複素共役を元に計算処理を行おうとしています。しかし、フーリエ変換後のリストはnonetypeとなり、複素数とnoneの混合した状態になっているとおもわれます。そこで、別の処理のときにnoneには0を代入する処理を施しましたが、状況は改善されず、計算ができません。
発生している問題・エラーメッセージ
(base) ituski@itsuki-virtualbox:~/Desktop/postgraduate/2ch$ python acoustic_ranging.py Traceback (most recent call last): File "acoustic_ranging.py", line 90, in <module> cross.append(f1[i].conjugate()*f2[i])/(f1[i].conjugate()*f1[i]) TypeError: unsupported operand type(s) for /: 'NoneType' and 'complex'
該当のソースコード
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 34gaus = [] #ガウス乱数を入れるための配列 35for i in range (512): 36 gaus.append(Rand(i)*math.exp(-i*0.1)) 37 38#channel 1 39vc = [] #波の成分を格納するリストの作成 40for i in range(N): 41 transmit, reflect = Wave(x[0], i) #波の作成関数に値を渡す 42 vc.append(transmit + reflect) #合成波の生成 43 44wave = [] #測定系のノイズを入れるための配列 45for i in range (N): 46 figure = 0 47 for j in range (512): 48 if (i-j) >=0: 49 figure += gaus[j]*vc[i-j] #合成波にガウス乱数を畳み込む 50 wave.append(figure) 51 52vc_f = np.fft.fft(wave) #vcを高速フーリエ変化行いfに格 53 54f1 = [] #データの抽出を行う 55for i in range(N): 56 if F/N*i>=F_min and F/N*i<=F_max: #周波数帯域でデータを抽出 57 if vc_f[i] == None: 58 f1.append(0) 59 else: 60 f1.append(vc_f[i]) 61#channel 2 62vc2 = [] #波の成分を格納するリストの作成 63for i in range(N): 64 transmits, reflects = Wave(x[1], i) #波の作成関数に値を渡す 65 vc2.append(transmits + reflects) #合成波の生成 66 67wave2 = [] #測定系のノイズを入れるための配列 68for i in range (N): 69 figure = 0 70 for j in range (512): 71 if (i-j) >=0: 72 figure += gaus[j]*vc2[i-j] #合成波にガウス乱数を畳み込む 73 wave2.append(figure) 74 75vc2_f = [] 76vc2_f = np.fft.fft(wave2) #vcを高速フーリエ変化行いfに格 77 78f2 = [] #データの抽出を行う 79for i in range(N): 80 if F/N*i>=F_min and F/N*i<=F_max: #周波数帯域でデータを抽出 81 if vc2_f[i] == None: 82 f2.append(0) 83 else: 84 f2.append(vc2_f[i]) 85 86cross = [] 87for i in range (len(vc_f)): 88 cross.append(f1[i].conjugate()*f2[i])/(f1[i].conjugate()*f1[i]) 89
試したこと
それぞれのデータのnoneに0を代入することは試しました。
一通り調べて試してみたつもりですが、pythonはまだ初心者なため、解説も付けて頂けると嬉しいです。
補足情報(FW/ツールのバージョンなど)
pythonはバージョン3.7.3を使っています
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。