1

同様の質問をいくつか見たことがありますが、そこからシステムを作成しましたが、このプログラムだけで多くの CPU 負荷がかかっているため、最適化する必要があります。

これがまさに問題です。

リアルタイムでプロットする必要がある入力信号/データ ストリームがあります。一度に表示するポイントの数を制限したいので (たとえば 1024 ポイント)、x 軸の 0 ~ 1024 のインデックスに対して y 軸に沿ってデータ ポイントをプロットします。着信データの値の範囲は 0 ~ 1023 です。

私が現在行っていること (これはすべて C++ で行われます) は、データが来るたびに循環ループに入れ、データが更新されるたびに (または 2 番目/3 番目のデータ ポイントごとに)、ファイルに書き出し、パイプを使用することです。 、そのファイルのデータを gnuplot でプロットします。

これはほぼ完全に機能しますが、かなりの負荷がかかります (入力データ レートによっては、私の Core 2 Duo の両方のコアで 70% の使用率さえ見られました)。この短いプログラムと一緒にプロセッサを集中的に使用するコードを実行する必要があるため、最適化する必要があると感じています。

私ができることを望んでいたのはこれです:現在のプロットと新しいデータの違いのみをプロットできますか (または、その x インデックスの古い項目が削除されるようにグラフ全体を再プロットせずに、各ポイントをプロットできます) .

グラフのポイント数が固定されているため、replot は機能しません。その x 位置の古いポイントを削除したい。

4

2 に答える 2

1

関数を使用して、 FAQで説明されているように、gnuplot を使用してデータの動的プロットを行うことができますreread。かなり低負荷で動いているようで、グラフが最後までくると自動でスクロールしてくれます。低負荷で実行するには; sleep 1、awk コマンドの後に (サンプル ファイル dyn-ping-loop.gp で) を追加する必要があることがわかりました。

于 2015-05-08T16:07:38.870 に答える
1

残念ながら、達成しようとしていることは実行できません。データファイルを as としてマークしvolatileたり、キーワードを使用したりできますrefreshが、それらはデータを再読み込みせずにプロットを更新するだけです。データを再読み込みして、相違点のみを更新したいとします。

ただし、役立つ可能性のあることがいくつかあります。1) あなたの目は 1 秒あたり最大 26 フレームしか登録できません。したがって、データを 1 秒あたり 26 回だけ gnuplot に送信するようにする方法があれば、それが役立つかもしれません。2) どのようにデータファイルを書き込んでいますか? アスキーまたはバイナリとしてダンプしていますか? バイナリ ダンプを実行すると、(書き込みと gnuplot の読み取りの両方で) 高速になる場合があります。実験する必要があります。

おそらくスクリプトを高速化しないハックが 1 つありますが、それを試すことができます (設定する妥当な範囲を知っていて、ポイントを使用してデータをプロットしている場合)...

#set up code:
set style line 1 lc rgb "blue"
set xrange [0:1023]
set yrange [0:1]
plot NaN notitle #Only need to do this once.
for [i=0:1023] set label i+1 at i,0 point ls 1  #Labels must have tags > 0 :-(

#this part gets repeated by your C code.
#you could move a few points at a time to make it more responsive.
set label 401 at 400,0.8              #move point number 400 to a different y value
refresh                               #show it at it's new location.
于 2012-07-12T02:04:51.293 に答える