質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

NumPy

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

Python

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

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

Q&A

解決済

1回答

2035閲覧

Pythonのnumpyで高速フーリエ変換(FFT)をしたい

naoya7076

総合スコア28

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

NumPy

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

Python

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

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

0グッド

0クリップ

投稿2019/01/23 03:00

編集2019/01/24 06:03

電圧と時間のデータからFFTで周波数を推定したい

電圧と時間のデータ(下のリンク参照)を元にフーリエ変換をして周波数を推定したいです
Jupyter notebookでfftを行ったところ、下の2つ目のの結果になってしまい、0のところに最大値が出てしまいます。

電圧と時間の関係のは1つめのグラフで、これを見る限りでは2Hz辺りにピークが来そうなのですが、予想通りになりません。
コードに問題があると思うのですが、自分で考えた限りでは分からなかったので教えていただきたいです。

test.ipynb

1 2test_data = pd.read_csv("CSVファイルへのパス") 3x = test_data["time"] 4y = test_data["volt"] 5N = len(y) 6dt = x[1]-x[0] 7 8t = np.arange(0,N*dt,dt) 9Y = np.array(y) 10 11F = np.fft.fft(Y) 12Amp = np.abs(F) 13freq = np.fft.fftfreq(N,d=dt) 14 15#PLot 16plt.figure(figsize=(18,3),facecolor="white") 17plt.plot(x,y,'b-', linewidth=1) 18plt.xlabel('Time') 19plt.ylabel('Volt') 20plt.grid(True) 21 22#FFT graph 23fig, ax = plt.subplots(nrows=4, sharex=True, figsize=(6,6)) 24ax[0].plot(F.real, label="Real part") 25ax[0].legend() 26ax[1].plot(F.imag, label="Imaginary part") 27ax[1].legend() 28ax[2].plot(freq, label="Frequency") 29ax[2].legend() 30ax[3].plot(Amp, label="Amp") 31ax[3].legend() 32ax[3].set_xlabel("Number of data") 33plt.show() 34

イメージ説明

電圧データ

DC成分を引いた場合

remove_dc.ipynb

1test_data_middle = pd.read_csv("CSVファイルへのパス") 2x = test_data_middle["time"] 3y = test_data_middle["volt"] 4N = len(y) 5dt = x[1]-x[0] 6 7t = np.arange(0,N*dt,dt) 8#DCを削除する為に元データの平均を引く 9Y = np.array(y) 10Y_block_offset = Y - Y.mean() 11 12 13F = np.fft.fft(Y_block_offset) 14Amp = np.abs(F) 15freq = np.fft.fftfreq(N,d=dt) 16 17#PLot 18plt.figure(figsize=(18,3),facecolor="white") 19plt.plot(x,Y_block_offset,'b-', linewidth=1) 20plt.xlabel('Time') 21plt.ylabel('Volt') 22plt.grid(True) 23 24#FFT graph 25fig, ax = plt.subplots(nrows=4, sharex=True, figsize=(6,6)) 26ax[0].plot(F.real[0:20], label="Real part") 27ax[0].legend() 28ax[1].plot(F.imag[0:20], label="Imaginary part") 29ax[1].legend() 30ax[2].plot(freq[0:20], label="Frequency") 31ax[2].legend() 32ax[3].plot(Amp[0:20], label="Amp") 33ax[3].legend() 34ax[3].set_xlabel("Number of data") 35 36plt.show()

###結果
イメージ説明

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

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

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

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

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

ozwk

2019/01/23 03:44 編集

* Ampをプロットしてください * [0:10]という謎範囲じゃなくてとりあえず全部プロットしてください
guest

回答1

0

ベストアンサー

下の2つ目のの結果になってしまい、0のところに最大値が出てしまいます。

電圧のグラフ見る限りDC成分がかなり大きいので0Hzの値が大きくなるのは当然です。
試しに元の電圧の平均をとって引いた電圧をFFTかけてみてください。

電圧と時間の関係のは1つめのグラフで、これを見る限りでは2Hz辺りにピークが来そうなのですが、

山と山の間隔がざっくり1秒なので1Hzでは?
全体表示したら大体2Hzぐらいのところにピークでましたね。

投稿2019/01/23 04:38

編集2019/01/23 04:51
ozwk

総合スコア13521

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

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

naoya7076

2019/01/23 04:46

すみません電圧のグラフ(1つめのグラフ)を間違えていたので修正しました
naoya7076

2019/01/24 05:44

全体を表示しても0Hzのところにピークあるように見えるのですが これが2Hz辺りだとグラフではなく数学的に分かるためにはどうすればよいのでしょうか?
ozwk

2019/01/24 06:05

横軸を周波数にすればいいとかそういう話ではなく?
naoya7076

2019/01/24 08:45

この横軸は周波数だと勘違いしていました。 この横軸を周波数にすることはできるのでしょうか?
ozwk

2019/01/24 08:56 編集

いやあなた時間-電圧のグラフ描けてますよね? それができてて周波数-振幅ができないんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問