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

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

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

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

Q&A

解決済

1回答

5148閲覧

python 高速フーリエ変換処理

p_pp

総合スコア17

Python 3.x

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

0グッド

0クリップ

投稿2019/02/14 07:09

前提・実現したいこと

pythonを使ってCSVデータを読み取り、FFTをしたいと考えています。

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

CSVデータを読み取るところまでは出来たのですが、エラーが出てしまい上手くFFTできません。
恐らく、次元が同じではないというエラーだと思うのですが修正方法が分かりません。

ValueError: x and y must have same first dimension, but have shapes (10000,) and (1, 10000)

該当のソースコード

Python

1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4 5 6def main(): 7 8 ''''''''''''''' 9 #データのパラメータ 10 11 ''''''''''''''' 12 N= 10000   # サンプル数 13 dt = 0.00001 # サンプリング間隔:10μs 14 t = np.arange(0, N*dt, dt)#時間軸 15 freq = np.linspace(0, 1.0/dt, N) # 周波数軸 16 17 18 ''''''''''''''' 19 #エクセルから値を取得 20 21 ''''''''''''''' 22 # CSVファイルをpandasへ格納 23 # usercolで列を指定、skiplowsで行をスキップし読み込むことが出来る 24 df = pd.read_csv('C://***.CSV', header=None, usecols=[4, 5],skiprows=31) 25 dft=df.T 26 npx_array=np.array(dft[:1]) 27 npy_array=np.array(dft[:2]) 28 29 # 高速フーリエ変換 30 Fx = np.fft.fft(npx_array) 31 32 33 # 振幅スペクトルを計算 34 Amp = np.abs(Fx) 35 F_abs_amp=(Amp/N)*2 36 print(freq.shape) 37 print( F_abs_amp.shape) 38 plt.xlabel('freqency(Hz)', fontsize=14) 39 plt.ylabel('signal amplitude', fontsize=14) 40 plt.plot(freq, F_abs_amp[:int(N/2)+1]) 41 plt.show() 42 43if __name__ == "__main__": 44 main() 45

修正方法が分からず困っています。
よろしくお願い致します。

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

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

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

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

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

kazto

2019/02/14 08:55

エラーが発生している行を、というかエラー文を省略せず全て記載お願いします。
guest

回答1

0

ベストアンサー

Excelの4列の1次元データ (10000,) のみをFFTしたいだけなのか、それともあえて拡張性(?)のために2次元データ (1, 10000) を使用しているのかの意図が掴めていないのですが、後者だと仮定して説明します。

エラーとなっているのは

plt.plot(freq, F_abs_amp[:int(N/2)+1])

の行で、エラーの内容は 「X軸とY軸に渡す配列のFirst Dimensionの数を揃えろ」となっております。
ですので現状で X軸に (10000,) のデータを渡しているのに対して、Y軸として (1,10000) のデータを渡たしていることが問題となります。

ソースコードでは F_abs_amp[:int(N/2)+1]) として配列サイズを半分にしようとしておりますが、F_abs_amp の First Dimension は 1 なので、この部分は機能しておりません

ということで、とりあえずY軸に渡す配列を転置して

plt.plot(freq, F_abs_amp.T[:N//2])

となります。が、今度は Y軸の First Dimension が半分(5000)となるりX軸の値(10000)と揃わなくなるので X軸も同様の処理をいれて

plt.plot(freq[:N//2], F_abs_amp[:N//2])

で良いかと思います。

オリジナルのコードでは +1 を行っておりますが N/2 番目のデータは有効な値ではありませんので必要ないかと思います

あと細かいことですが、X軸の freq を求めている方法に若干の間違いがありますので、素直に numpy.fft.fftfreq() を使用して

freq = np.fft.fftfreq(N, dt)

のほうが良いでしょうね。

投稿2019/02/15 01:28

magichan

総合スコア15898

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

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

p_pp

2019/02/18 06:50

ありがとうございます!! 教えていただいたとおりに直したら、無事解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問