前提
観測データを計算してその結果を新たにCSVファイルで保存したいと考えています。しかし横方向に保存されてしまいます。
実現したいこと
計算結果が横方向に保存されてしまう問題を解決
発生している問題・エラーメッセージ
なし
該当のソースコード
Python
1import matplotlib.pyplot as plt 2import csv 3import pandas as pd 4import numpy as np 5from scipy import signal 6N = 1048576 7dt = 0.000001 8"""df=pd.read_csv('csv in/observationdata.csv',names=['time','voltage'])""" 9df=pd.read_csv('csv in/observationdata.csv') 10 11t=df['time'] 12f=df['voltage'] # 変更部分 13F=np.fft.fft(f) 14F_abs=np.abs(F) 15F_abs_amp = F_abs / N * 2 # 交流成分はデータ数で割って2倍する 16F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要 17 18#グラフ表示 19plt.xlabel('time(sec)', fontsize=14) 20plt.ylabel('voltage', fontsize=14) 21plt.plot(t, f) 22# 高速フーリエ変換(FFT) 23F = np.fft.fft(f) 24print(len(F_abs_amp)) 25 26# 周波数軸のデータ作成 27fq = np.linspace(0, 1.0/dt, len(F_abs_amp)) # 周波数軸 linspace(開始,終了,分割数) 28 29 30# グラフ表示(FFT解析結果) 31plt.xlabel('freqency(Hz)', fontsize=14) 32plt.ylabel('amplitude', fontsize=14) 33plt.plot(fq, F_abs_amp) 34# そのまま普通にIFFTで逆変換した場合 35F_ifft = np.fft.ifft(F) # IFFT 36F_ifft_real = F_ifft.real # 実数部 37plt.plot(t, F_ifft_real, c="g") # グラフ 38F2 = np.copy(F) # FFT結果コピー 39# 周波数でフィルタリング処理 40fc = 500 # カットオフ(周波数) 41F2[(fq < fc)] = 0 # カットオフを超える周波数のデータをゼロにする(ノイズ除去) 42# フィルタリング処理したFFT結果の確認 43# FFTの複素数結果を絶対値に変換 44F2_abs = np.abs(F2) 45# 振幅をもとの信号に揃える 46F2_abs_amp = F2_abs / N * 2 # 交流成分はデータ数で割って2倍 47F2_abs_amp[0] = F2_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要 48 49# グラフ表示(FFT解析結果) 50plt.xlabel('freqency(Hz)', fontsize=14) 51plt.ylabel('amplitude', fontsize=14) 52plt.plot(fq, F2_abs_amp, c='r') 53# 周波数でフィルタリング(ノイズ除去)-> IFFT 54F2_ifft = np.fft.ifft(F2) # IFFT 55F2_ifft_real = F2_ifft.real * 2 # 実数部の取得、振幅を元スケールに戻す 56# グラフ表示:オリジナルとフィルタリング(ノイズ除去) 57plt.plot(t, f, label='original') 58plt.plot(t, F2_ifft_real, c="r", linewidth=4, alpha=0.7, label='filtered') 59plt.legend(loc='best') 60plt.xlabel('time(sec)', fontsize=14) 61plt.ylabel('singnal', fontsize=14) 62y1 = f 63y2 = F2_ifft_real 64 65 66c1, c2 = 'blue', 'green' 67l1, l2 = 'original', 'filtered' 68 69xl1, xl2 = 'time(sec)', 'time(sec)' 70yl1, yl2 = 'signal', 'signal' 71 72 73#グラフを表示する領域を,figオブジェクトとして作成。 74fig = plt.figure(figsize = (10,6), facecolor='lightblue') 75 76#グラフを描画するsubplot領域を作成。 77ax1 = fig.add_subplot(2, 1, 1) 78ax2 = fig.add_subplot(2, 1, 2) 79 80#各subplot領域にデータを渡す 81ax1.plot(t, y1, color=c1, label=l1) 82ax2.plot(t, y2, color=c2, label=l2) 83 84#各subplotにxラベルを追加 85ax1.set_xlabel(xl1) 86ax2.set_xlabel(xl2) 87 88#各subplotにyラベルを追加 89ax1.set_ylabel(yl1) 90ax2.set_ylabel(yl2) 91 92# 凡例表示 93ax1.legend(loc = 'upper right') 94ax2.legend(loc = 'upper right') 95print(F2_ifft_real) 96print(t) 97"""outfile = open('filtered.csv','w', newline='') 98writer = csv.writer(outfile) 99writer.writerow(['t', 'F2_ifft_real']) 100 101for i in range(1048576): 102 writer.writerow([t, F2_ifft_real]) 103 104outfile.close()""" 105with open("filtered.csv", 'a', newline="") as f: 106 writer = csv.writer(f) 107 writer.writerow([t, F2_ifft_real]) 108 """writer.writerow(F2_ifft_real)"""
試したこと
長ったらしくなりましたが、後半のコードにprint(F2_ifft_real)とprint(t)で確認したところ前者は[ 0.02396664 -0.00657221 -0.00657108 ... -1.44097691 -1.34897571
-0.73897453]のように横方向、
後者は
0 0.000000
1 0.000005
2 0.000010
3 0.000015
4 0.000020
...
1048570 5.242850
1048571 5.242855
1048572 5.242860
1048573 5.242865
1048574 5.242870
のように縦方向になっているのでこれも悪さしてるのかなと考えています。要はこれをprint(t)のtimeの右側にF2_ifft_realの結果を保存したいと考えています。
補足情報(FW/ツールのバージョンなど)
追加情報10/19 14:50
print(type(t))
print(type(F2_ifft_real))
で確認したところ、
<class 'pandas.core.series.Series'>
<class 'numpy.ndarray'>と型が異なるようです。ここを変更すればいけると今考えているのですが、何しろ初学者なため、間違っているかもしれません。

回答1件
あなたの回答
tips
プレビュー