Feeds:
投稿
コメント

Archive for the ‘R’ Category

 GWの休み中、K♂が大学の課題をやっていた。課題っていうのはCSVファイルの電圧波形のV-tデータのからピークを検出するというものだった。彼はPythonで彼のアルゴリズムで書いていたけど、面白そうなのでR言語でできるかどうかやってみた。結果はできた。
 はじめはライブラリがあるだろうと簡単な気持ちで始めたけど、R言語にはそのようなライブラリは見つからない(かつてはあったらしいけど、今はないみたい)。Pythonにはあるらしいんだけど。仕方ないので書いてみたよ。
 簡単にアルゴリズムを説明すると、まず波形の山を見つけて、その山のピーク(最大値)をその山のピークとする。って感じ。波形の山の検出は、データを平均で横にバッサリ切ったので2波長混ざったりしているとこのアルゴリズムでは検出できなくなるけど、今回のデータは1波長だったのでまずこれで。

 一応、参考までにスクリプトを残しておく。

library(tidyverse)

#最大値の位置を返す関数を定義
peak <- function(df,dp) {
j=0
st=c(NULL)
for(i in dp){
s_df % filter(time>j,time<i)
m = which.max(s_df$abs_d)
n = s_df$time[m]
st =c(st,n)
j=i
}
return(st)
}

######## 処理スクリプト

# データの読込み
df_r <- read_csv("JX20198_0507_500Hz.txt",col_names = c("time","V"))

#MaxピークとMinピークを見つけるために波形を半分に分割する
avg = mean(df_r$V)
df_0 % mutate(d1=V-avg) %>% mutate(abs_d=abs(d1)) #ピークはすべて最大値で検出する準備
#ピークの開始点・取終了点を求める
df_1 %
mutate(d2=d1*lag(d1)) %>% 
filter(d2 %
mutate(t2=trunc(time*10)/10) %>% #疑似ピークは削除する
distinct(t2,.keep_all=TRUE)

dpint<- c(df_1$time,df_r$time[nrow(df_r)]) #timeベクトルに変換

p=peak(df_0,dpint) #ピーク関数でピークの位置を求める

###### グラフ化

df_p % filter(time %in% p) #ピーク位置のデータだけ抽出

g0 <- ggplot(NULL)
g0 <- g0 + geom_point(data=df_r,aes(x=time,y=V)) #生データをプロット
g0 <- g0 + geom_point(data=df_p,aes(x=time,y=V),color="red",size=2) #ピーク位置をプロット

plot(g0) #出力

Read Full Post »