前提・実現したいこと
numpy.fft.ifft()を使いwavファイルからケプストラムを得るために、フーリエ逆変換をしようとしているのですが、numpy.nan,numpy.inf,numpy.NINFを含まない配列を渡したつもりだったのにnanを含む配列が返ってきてしまいます。
該当のソースコード
python3
1 2import numpy as np 3 4#wavはあるwavファイルから0.04秒分を切り出してint16の一次元配列に変換したものです。各要素の範囲を-1から1に 5#正規化してあります。 6 7hanningWindow = np.hanning(len(wav)) 8wav = wav * hanningWindow[:,None] 9 10n=2048 11 12Plog=10 * np.log10(np.abs(np.fft.fft(wav,n))**2) #対数スペクトル化 13 14 15nan1=np.where(Plog==np.inf,(sys.float_info.max),Plog) #正の無限大を有限に 16 17nan2=np.where(nan1==np.NINF,-(sys.float_info.max),nan1) #負の無限大を有限に 18 19print("isfinite ",np.all(np.isfinite(nan2))) #nan2の要素全てがnan、inf、NINFでない、有限の数のみなのかを 20 #チェックしているつもりです 21 22nan3=np.fft.ifft(nan2) #フーリエ逆変換 23 24print("isnan ",np.any(np.isnan(nan3))) #nan3の要素のうち、一つにでもnanが含まれているかを 25 #チェックしているつもりです 26
発生している問題(出力結果)
C:...\teratailyou.py:32: RuntimeWarning: divide by zero encountered in log10 Plog=10 * np.log10(np.abs(np.fft.fft(wav,n))**2) isfinite True isnan True
試したこと
- numpy.fft.ifft()にnan,inf,NINFを含む配列を与えるとnanを含む配列が返ってくることを知り、
それらを有限の数に置き換えてみました。その結果前述の結果となってしまい、以降何も思いつけませんでした。
どうかご助力ください。
回答1件
あなたの回答
tips
プレビュー