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

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

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

1回答

548閲覧

フーリエ変換後のnonetyoeの除去ができない

itsukidesu

総合スコア6

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2019/10/28 07:19

前提・実現したいこと

現在、クロススペクトル解析を行うために、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を使っています

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

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

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

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

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

guest

回答1

0

エラーメッセージの最後から3行~5行目の意味は,

acoustic_ranging.pyの90行目,
cross.append(f1[i].conjugate()*f2[i])/(f1[i].conjugate()*f1[i])の式で,
無タイプ/複素数の除算はサポートされていない

というものです。

ひっとすると,この部分の式はappend(から右全部を値にしないといけないことから次のように
変更した方がいいのでしょうか?

diff

1--- src.py 2022-01-01 00:00:00.000000000 +0000 2+++ dest.py 2022-01-01 00:00:00.000000000 +0000 3@@ -87,5 +87,4 @@ 4 5 cross = [] 6 for i in range (len(vc_f)): 7- cross.append(f1[i].conjugate()*f2[i])/(f1[i].conjugate()*f1[i]) 8- 9+ cross.append((f1[i].conjugate()*f2[i]) / (f1[i].conjugate()*f1[i]))

投稿2022/08/24 10:24

ujimushi_sradjp

総合スコア2152

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問