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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

受付中

センシングした波形の立ち上がりからピーク(最大値)に到達するまでの時間を知りたい

Uka
Uka

総合スコア25

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

2回答

0リアクション

0クリップ

335閲覧

投稿2022/08/09 10:30

編集2022/08/09 16:09

実現したいこと

ESP32を使ってセンシングしたのちに、波形データの立ち上がりからピーク(最大値)に達するまでの時間を算出したいと考えています(ESPのプログラム内で)

立ち上がりとピーク位置については、下記グラフの青の波形に示したピンク矢印の位置をイメージしています(低周波波形はピークが頭打ちのような形になるので定義が難しいですが、傾きがほぼゼロとなり、最大値をとる最初の点になるかと思います)

ベースが毎回一定でない(波形ごとに多少変動する可能性がある)、波形の周期が一定でないこともあり、どのようにアルゴリズム(プログラム)を組めばいいか苦慮しております。
アドバイスいただけましたらありがたいです。どうぞよろしくお願いいたします。

※生データはばらつきが大きいため、メディアン処理、移動平均処理を施しています。
今回時間データは保存していないため、便宜的にデータ取得順に1,2,3、、、とすることとしています。

処理後データ抜粋(上段:低周波波形データ(1波形ぶん切り出し)、下段:高周波波形データ(2波形ぶん切り出し)

[64,64,64,64,64,64,64,64,64,64,64,64,64,64.1,64.1,64.1,64.1,64.1,64.25,64.35,64.4,64.5,64.6,64.75,64.75,64.85,64.95,65.05,65.25,65.45,65.7,65.8,66,66.1,66.1,66.3,66.5,66.65,66.7,66.85,66.95,67.05,67.15,67.2,67.45,67.55,67.65,67.8,67.9,67.95,67.9,68.05,68.05,68.15,68.4,68.5,68.7,68.75,68.95,69.05,69.2,69.35,69.55,69.75,69.9,70,70.05,70.1,70.2,70.35,70.6,70.75,70.95,71.05,71.2,71.35,71.35,71.55,71.55,71.6,71.7,71.75,71.75,71.8,71.8,72,72.4,72.55,72.65,72.7,72.65,72.75,72.8,72.9,73,73.05,73.15,73.2,73.3,73.4,73.5,73.6,73.6,73.75,73.95,74,73.9,74,74,74.15,74.3,74.5,74.65,74.75,74.85,74.95,75.05,75.2,75.3,75.3,75.4,75.5,75.7,75.9,75.9,76.05,76.1,76.35,76.55,76.55,76.7,76.8,76.8,76.8,76.8,76.8,77,77.2,77.35,77.45,77.45,77.45,77.65,77.6,77.8,77.9,78,78,78.1,78.2,78.3,78.3,78.4,78.5,78.7,78.9,78.8,78.8,78.85,79.05,79.25,79.45,79.45,79.4,79.4,79.4,79.5,79.5,79.5,79.6,79.6,79.6,79.7,79.8,79.8,79.6,79.7,79.7,79.7,79.7,79.7,79.7,79.7,79.8,79.8,79.8,79.8,79.8,79.8,79.8,79.8,79.8,79.8,79.8,79.8,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,79.85,79.45,78.85,78.1,77.3,76.5,75.7,74.9,74.1,73.3,72.5,71.7,70.9,70.1,69.3,68.5,67.7,66.9,66.1,65.3,64.65,64.25,64.05,64,64,64,64] [64,64,64,64,64,64,64,64,64.1,64.35,64.95,65.75,66.55,67.35,68.15,68.95,69.8,70.75,71.7,72.7,73.7,74.65,75.45,76.25,76.85,77.15,77.25,77.3,77.2,76.95,76.35,75.55,74.75,73.95,73.15,72.35,71.5,70.55,69.6,68.6,67.6,66.65,65.85,65.05,64.45,64.15,64.05,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64.2,64.7,65.5,66.3,67.1,67.95,68.9,69.9,70.9,71.8,72.8,73.8,74.8,75.6,76.4,76.8,77,77.1,77.1,77.1,76.9,76.4,75.6,74.8,74,73.15,72.2,71.2,70.2,69.3,68.3,67.3,66.3,65.5,64.7,64.3,64.1,64,64,64,64,64,64,64,64,64,64,64]

試したことと問題点

ベースの値(今回は64くらい)が1波形ごとに多少変動することを考慮し、生データを微分してゼロになる箇所から立ち上がりおよびピーク位置を割り出すことを考えました。高周波の波形ではこの方法でうまく解析できそうですが、低周波波形では、波形の立ち上がりにかけてデータが多少乱れることと、なだらかに上昇していくために、微分による立ち上がりとピークの判別が難しいということがネックになっています。

イメージ説明
※グラフ横軸は、データ取得順に1,2,3、、、としており、これを便宜的に時刻としています。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

y_waiwai

2022/08/09 10:36

で、現状の処理ではどういう問題があるんでしょうか。 そしてそれをどうしたいという話なんでしょう
Uka

2022/08/09 10:47

y_waiwaiさん コメントありがとうございます。要点がわかりづらく申し訳ございません。見出しを微修正させていただきました。現状の処理と問題については見出しの「試したことと問題点」に示したとおりです。自分が考えた微分の方法ではとくにピークの判別が難しいと思ったため、微分の方法以外にもほかにもっといいアルゴリズムがあればご教示いただければありがたいです。
y_waiwai

2022/08/09 10:47

波形データの立ち上がりとピークの時間、というやつが意味不明です。 あなたにとって、これはどういう意味なんでしょうか。 問題が見えません。 繰り返しますが、現状の問題は何でしょうか
ozwk

2022/08/09 12:22

(「時間」は時刻の差ですからある一点を指したいときは「時刻」です) ピーク及び立ち上がりそれぞれの時刻とは何でしょうか? 回答者が適当に決めて回答しても「それは私が思っていたものと違う」と言われかねないので回答しにくいです 立ち上がり時刻とはピークのx%を通過した時刻とする とかある程度明確な説明をください (それが決められないからこの質問なのかもしれませんが…)
SaitoAtsushi

2022/08/09 12:28

質問者は「立ち上がり」「ピーク」が何であるか定義してください。 と言いたいところですが、おそらくそれをどう定義してよいかわからないということなんでしょう。 まずはきちんとした定義でなくてもよいですから、左の波形のどこが立ち上がりでどこがピークだと考えているのかを図示したほうがよろしいですね。
thkana

2022/08/09 12:34

プログラミングは全然関係ないですよね。まぁいいですけど。 で、「低周波」の方はどこを「ピーク」とみなすのが目的に対して妥当なのですか? (その波形で「ピーク」を論じること自体に疑問を感じてしまうのです)
Uka

2022/08/09 15:31 編集

>ozwkさん、SaitoAtsushiさん、thkanaさん コメントいただきありがとうございます。とくに立ち上がりとピークについて説明足らずで大変失礼しました。説明文およびグラフを修正させていただきました。 まず知りたいことは、「立ち上がりからピークに到達するまでの時間」です。 立ち上がりとピークの定義については、SaitoAtsushiさんのおっしゃるように一義的に定義できないところもあるため、イメージとしてグラフに矢印で図示させていただきました。 立ち上がりについては、たとえばベースから5%上昇したときの時刻、 ピークについては、最大値となる時刻(低周波波形については最大値をとる最初の時刻) などを考えています。
Uka

2022/08/10 11:57

>jbpb0さん、 アドバイスいただきありがとうございます。データ前処理の方法について大変参考になります。 こちらの方法で試してみたいと思います。
thkana

2022/08/10 14:21

「低い周波数」なのだから、「高い周波数」との比に応じてサンプリング周波数も同じだけ下げてやれば同じような処理で同じような結果が得られそうな気がしますが、そういうわけにはいかないのでしょうか。
jbpb0

2022/08/10 23:51 編集

> 立ち上がりについては、たとえばベースから5%上昇したときの時刻 変曲点を「立ち上がり」とすることがあります https://www.mlit.go.jp/river/shinngikai_blog/shaseishin/kasenbunkakai/shouiinkai/kihonhoushin/060719/pdf/add1.pdf http://www.mekatoro.net/digianaecatalog/valco-sougou/book/valco-sougou-P0241.pdf 微分値のノイズを減らす必要があります https://hanafsky.com/tips/savgol/ 質問者さんのケースが該当するか分かりませんが、ご参考までに
Uka

2022/08/11 16:06

>thkanaさん、 コメントありがとうございます。できれば測定と解析(立ち上がりからピーク値までの時間)をリアルタイムで行いたいと考えていますが、高周波か低周波どちらの波形になるかは成り行きになってしまうので、測定中にサンプリング周波数を変えることは難しいと思っています。
thkana

2022/08/11 22:26

リアルタイムという言葉は、少なくとも「リアルタイムシステム」という言葉は「入力からある時間内に処理を終える系」という意味で使います。システムの目的によっては、それがマイクロ秒なのか数時間なのか、定義次第(まぁ普通は秒単位まででしょうが)。逆に言えば、制限時間を明らかにしなければ、何も言っていないと同じことになってしまいます。 なので、何ミリ秒以内とか、あるいはフィルタ方法を考える観点からは何サンプル周期以内に検出できなければいけない、という形で定義するのもありでしょう。 > 測定中にサンプリング周波数を変えることは難しい フィルタにとってサンプリング周波数が下がっていればいいわけで、つまりフィルタに与えるデータを間引きして処理してやればよいのではないかと思いますがいかが? で、フィルタは高周波低周波どちらも回しておいて、微分値かなにかでどちらの結果を採用するか決める、と。もちろん、低周波時の応答時間は遅くなるでしょうが、でも信号の変化が緩いんだから仕方ないです。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。