Pythonで,生波形同士の位相差を出力したいです.
現在,20~30個程度の生波形の入ったcsvファイル(図1を参照)をFFTし,一つのExcelにまとめる処理を行っています.
csvファイルのc列目に生波形1,d列目に生波形2、e列目に生波形3、f列目に生波形4が出力されています。
このCSVファイルをfft解析し、0行目に計測時間を、一行目に生波形1,二行目に生波形2,三行目に生波形3,四行目に生波形6,五行目にサンプリング周波数,六行目にfft解析をした生波形1,七行目にfft解析をした生波形2,八行目にfft解析をした生波形3,九行目にfft解析をした生波形4としています(図2参照).
今回行いたいこととして,十行目に生波形1と3の位相差 degを,十一行目に生波形1と4の位相差を出力したいです.
つまり、以下のホームページに記載してあるようなことをPython上で行いたいです。
https://blog.goo.ne.jp/je-suis-sumichan/e/0e562abe1dacdfd5ad65763d4658c685
このホームページでいう、信号1Xnを図1の生波形に、信号2Ynを生波形3や4として、処理したいということです。
ホームページ上のstep1.2.3と書かれた列は出力してもしなくてもかまいません。求められた位相差 degという列を出力できれば嬉しいです。
様々なサイトを調べてみたのですが,グラフを出力するものや,コードが膨大なものが多く,既存の下記に示すコードにどのように埋め込めばよいのかわからなくなってしまいました.
下記に図1と図2,既存のコードを記します.
※図2のcsvファイル名と図1のシート名は対応していません.
図2は,入力フォルダ内に1.2.3.4.5.6というcsvが入っていた際にPython を動かしたものとなります.
ご協力お願いいたします.
質問の欄をご覧ください。
import cv2 import numpy as np import matplotlib.pyplot as plt import csv import os import glob import pandas as pd def my_fft(infile): ##### 実験条件、分析対象の設定 ###### t = np.arange(0,8.192,0.0005) #サンプリング時間,周波数の指定(開始時間(=0),終了時間,サンプリング周期) file = infile #分析対象のファイル指定 ##### データの読み込みy ##### for i in range(4): def loadvtp(file,i): #ファイルの読み込みに使用する関数の定義 vtp = pd.read_csv(file, dtype='float', skiprows=57, usecols=[i+2], nrows=16384, engine='python', header=None) #解析対象となるデータの読み込み vtp = vtp - np.mean(vtp) #平均を引く vtp = np.squeeze(vtp) return vtp ##### 主流(x)成分出力の計算 ##### vx = loadvtp(file,i) ##### FFT ##### freq = np.fft.fftfreq(16384, 1/2000) #周波数軸の生成(サンプリング点数, サンプリング周期) f = np.fft.fft(vx) #FFT f [0]=f[0]/2 #定常成分を1/2にする(スケーリングに必要) amp = np.abs(f)/(16384/2) #FFT結果を振幅に合わせてスケーリング freq = freq[0:16384//2] #周波数軸の対称成分を除く amp = amp[0:16384//2] #振幅の対称成分を除く if i==0: yav=vx xav="" vav="" wav="" y=amp x="" v="" w="" elif i==1: yav=yav xav=vx vav="" wav="" y=y x=amp v="" w="" elif i==2: yav=yav xav=xav vav=vx wav="" y=y x=x v=amp w="" elif i==3: yav=yav xav=xav vav=vav wav=vx y=y x=x v=v w=amp df = [t, yav, xav, vav, wav, freq, y, x, v, w] df=pd.DataFrame(df).T return df infile = glob.glob("入力フォルダ名/*.csv") infile.sort() print('入力csvファイル数', len(infile)) with pd.ExcelWriter('出力Excel名.xlsx', mode='w') as writer: for in_csv_file in infile: in_file_name = os.path.basename(in_csv_file) fft_df = my_fft(in_csv_file) fft_df.to_excel(writer, sheet_name=in_file_name)
