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

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

詳細はこちら
Windows 10

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

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3070閲覧

PythonでFFT→周波数スペクトル表示。初めての質問です。お願い致します。

takeshi2koza

総合スコア5

Windows 10

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

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/12/21 08:54

前提・実現したいこと

Excelから読み込んだ時系列データにFFTをかけてスペクトル分析を行おうとしています。 
読み込んでいるExcelデータの2列目には簡単なsin関数が書いてあり、その列の中の1000行目から15000行目のデータを使用します。
周波数スペクトルのグラフをアウトプットしたいと考えています。

初心者で、質問の体すらなってないかもわかりませんが、アドバイスをよろしくお願いいたします。

発生している問題・エラーメッセージ

発生している問題は、F = np.fft.fft(f)でFFTが実行されていないことです。 エラーメッセージはありません。 F = np.fft.fft(f)でFFTをかけているつもりですが、Fにはfがそのまま入っています。 結果的に、読み込んだデータを絶対値変換しただけのグラフが出力されます。

該当のソースコード

Python

1import matplotlib.pyplot as plt 2import numpy as np 3import pandas as pd 4 5data = pd.read_excel(r'C:\tmp\test.xlsx', 6 delimiter=",", 7 dtype="float64", 8 #skiprows=0, 9 usecols=[1] 10 ) 11 12data1=data[10000:15000] 13data1 14 15x = np.arange(0, 10, 0.002) 16 17dt = 0.002 18fs = 1/dt 19n=5000 20y=data1 21 22N = len(y) # データ数 23 24# FFT 25f = y 26F = np.fft.fft(f) # 高速フーリエ変換(FFT) 27# 振幅スペクトルを計算 28Amp = np.abs(F) 29# 周波数軸のデータ作成 30fq = np.linspace(0, N/2, len(Amp)) # 周波数軸 numpy.arange(start, stop, step) linspace(開始,終了,分割数) 31 32# 周波数軸のデータ作成 33fq = np.linspace(0, N/2, len(Amp)) # 周波数軸 linspace(開始,終了,分割数) 34 35# 周波数軸に変更してグラフを再表示 36plt.figure(figsize=(8, 4)) 37plt.xlabel('freqency(Hz)', fontsize=14) 38plt.ylabel('signal amplitude', fontsize=14) 39plt.plot(fq, Amp)

試したこと

読み込んだデータが正しく読み込まれていることは確認しました。
また、Excelからデータを読み込まずにコードの中でsin関数を作るとFFTは実行できました。
np.fft.fftのプログラムについて詳しく調べましたが、原因は分かりませんでした。

補足情報(FW/ツールのバージョンなど)

Excelデータの一列目は、0から0.002刻みで60まで。2列目は=SIN(A1*PI())でのように、A列を用いた基本的なsin関数です。
使用ツールはJupyterLabとSpyderの両方を試しました。どちらも最新版です。
OSはWindows10です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1F = np.fft.fft(f) # 高速フーリエ変換(FFT)

を、下記のどちらかに変更

python

1F = np.fft.fft(f.T) 2F = np.fft.fft(f, axis=0)

投稿2020/12/22 00:12

編集2020/12/22 03:02
jbpb0

総合スコア7653

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

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

jbpb0

2020/12/22 01:56

fqが、N個のデータ内にsinが何周期あるのか、という意味なら、最大は N/2 ではなく N-1 です fq = np.linspace(0, N-1, len(Amp)) とすれば、fqは0から始まる整数になります ただし、後半(N/2よりも大きい)は負の周波数なので、本当はそこだけNを引かないといけません fq = np.fft.fftfreq(len(Amp), d=1/N) # 周波数軸 np.fft.fftfreq(データ点数, サンプリング間隔) とすれば、それも含めてやってくれます
jbpb0

2020/12/22 03:03

radames1000さん 見落としてました ありがとうございます 修正しました
takeshi2koza

2020/12/22 05:19

ご回答ありがとうございます。 F = np.fft.fft(f, axis=0)に変更したところ周波数スペクトルのグラフをほぼ出すことが出来ました。 ただ、Ampの値が正しい値の2500倍の値となっています。 2500はデータ点数の半分の値なので、 Amp = np.abs(F)をAmp = np.abs(F)/N*2とすれば上手くいきましたが、こういうものなのでしょうか? 的確なご回答をしていただき本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問