MATLAB Answers

0

圧曲線の平均圧較差をだす方法

Asked by Futoshi Yamanaka on 6 May 2019
Latest activity Commented on by Etsuo Maeda on 8 Aug 2019
お世話になっております。
添付ファイルの様に、csvファイルから曲線を描いて、任意の時相の平均圧較差を求めたいです。
codeを書いてみましたが、Matlabの初心者で曲線すら書けないため、困っております。
ご教授の程、よろしくお願い致します。
Fig.jpg

  2 Comments

Yoshio
on 6 May 2019
どこがお分かりにならないのか、もう少し具体的に質問をお願いします。
Codeもあれば良いですが、「任意の時相の平均圧較差」を求める、という問題はこの分野以外の人にはわかりませんから、定義をして頂きたいです。
また、MATLAB 入門は勉強されましたか? こちらがまだ終わっていければ、終わらせてからCodeを見直して、再度ご質問ください。プロットの方法と基本の文法はカバーしています。
Futoshi Yamanaka on 23 May 2019
コメントありがとうございます。また、遅いお礼になり失礼いたしました。
MATLABの本を買って勉強しましたが、意図した解析をするcodeが書けませんでした。MATLAB入門も確認してみます。

Sign in to comment.

1 Answer

Answer by Etsuo Maeda on 23 May 2019

回答がついていないようですので、諸々用語とデータが分かっていない状態で回答します。
質問の際は、Yoshioさんの言うように、回答者になるべく多くの情報を提供されるのがよろしいかと思います。
添付画像の情報が全てとして、以下の1-4のアプローチが考えられます。
1. ファイルの読み込み
見たところ、Excelのスクリーンショットのようです。
readtable/ xlsread/ csvread などで読み込むことができます。
readtable関数であれば、自動的にヘッダを読み飛ばします。
自動判定に失敗するようであれば'HeaderLines'オプションをつかってみてください。
T = readtable('aaa.xlsx')
この状態で当該のファイルの16行目以降がWorkspaceに T として格納されます。
明示的にオプション指定をしない場合、readtableは数字を数値もしくは文字列として自動認識します。
文字列を数値に変換するときは、str2num/ str2doubleを使います。
2. グラフを描く
画像から読み取る限り、横軸は5 msec刻みの時間、縦軸は時間と一対一対応したデータのようです。
まずは、横軸のデータを作ります。
aaa.xlsxがどのようにTに格納されているか次第ですが、大まかには次のような記述が有効です。
myTime = T.Time
myTime = T.Var8 % Timeを変数名として認識していない場合
myTime = (0:length(T))*0.05 % 0.05刻みのベクトルを自力で作成
続いて縦軸のデータを作ります。
例えば、Pdのデータを抜き出すなら
myPd = T.Pd
myPd = T.Var1 % Timeと同じくPdを変数名として認識していない場合
最後にプロットをします。これもどうしたいか次第ですが、もっとも単純なプロットなら
plot(myTime, myPd)
のように描きます。
3. "任意の時相"
これはFutoshiさんの所属されている業界でどのように定義されているか次第です。
例えば、Pd列の値の立ち上がりから立ち下がりまでを一つの時相として捉えるのであれば、Pdの値を微分すれば相の境目が分かりそうです。
Y = gradient(myPd)
手動で相の境界を設定するならば、グラフが描けてしまえば、データ点の座標から指定できます。
4. "平均圧較差"
"平均圧較差"は心臓関連の用語でしょうか。
軽く調べた範囲ですと、測定した血液の流速から圧力差を算出する方法があるようです。
記録したデータの何が何にあたるのかを説明いただけば、何かご案内できるかもしれません。
HTH

  4 Comments

Show 1 older comment
Etsuo Maeda on 30 May 2019
ご説明ありがとうございます。
曲線を描くところまでは出来るようになったという理解でよいでしょうか。
まだよくわからない部分がありますが、以下回答します。
1. R-wave
"0から1までが、ひとつのサイクル" は具体的にどのようなデータが入っているでしょうか。
最初のQuestionに添付されている画像ではR-waveは 0 の部分しかみえていません。
0 or 1のデータでしょうか?それとも、0, 0.1, 0.2, ... 0.9, 1.0のように刻みがあるデータでしょうか?
サイクルを抜き出す必要があるかどうかは分かりませんが、次のように関係演算子が使えそうです。
T.R_wave(T.R_wave == 1)
T.R_wave(T.R_wave >= 0.5)
関係演算子
https://jp.mathworks.com/help/matlab/matlab_prog/array-comparison-with-relational-operators.html
2. diastole
diastoleは、演算で抜き出したいのでしょうか?それとも手動で値をとるつもりでしょうか?
データが見えていないので何ともいえませんが、R-waveの1サイクル内にノッチが二か所しかないという状態であれば、前回Answerのgradientを組み合わせれば判定ができそうです。
3. diastole部分の最初に25%から最後の5ms部分まで
1. 2. でdiastole部分のインデックス(start_idx, end_idx)が分かるはずです。
こちらも、関係演算子で勘定ができるはずです。
myDiastole25_idx = round((end_idx - start_idx)*0.25 + start_idx) % diastole開始から25 percent 時間経過した時点のインデックス
myEndMinus5 = T.myTime(end_idx) - 0.05 % distole終了から5msec前の時間
myEndMinus5_idx = find(T.myTime == myEndMinus5) % distole終了から5msec前の時間のインデックス
4. 圧較差
グラフDに描かれている赤色の線のデータから緑色の線のデータを引いたものが圧較差でしょうか?
グラフDに凡例がなく、データ定義も不明なので、素人には判別がつきかねます。
もしそういうことであれば、3. で取得したインデックスを使って減算してから平均をとることができます。
myRedData = T.RedData(myDiastole25_idx:myEndMinus5_idx)
myGreenData = T.GreenData(myDiastole25_idx:myEndMinus5_idx)
myAverage = mean(myRedData - myGreenData)
HTH
Maeda様
いつも親切なご指導、ありがとうございます。
ようやく添付のようなFigureを書くことが出来ました。次に青/オレンジの値が、最も低くなる点の値を知りたいのですが、どのようにすればよいでしょうか?よろしくお願い致します。
Etsuo Maeda on 8 Aug 2019
最小値のインデックスを知りたい場合は、min関数の第2出力引数をとります。
[M, I] = min(myData)
もし、繰り返しの波形の中から谷部, dipとなる点群のインデックスを探すのであれば、
[pks, locs] = findpeaks(-1*myData)
の構文が有効です。
findpeaksはSignal Processing Toolboxに含まれる関数で、peakを検出することができます。
-1を乗算してy軸方向に反転したデータに変換すれば、dipを検出することができます。
もし、うまくdips/ peaksが見つけられない時、例えば1つの谷に2つのdipが検出されてしまう時は、"プロミネンス"を調整してみてください。
data = [25 8 15 5 6 10 10 3 1 20 7];
[pks, pklocs] = findpeaks(data); % find peaks
[dps, dplocs] = findpeaks(-1*data); % find dips from negative value
figure, hold on
plot(data)
scatter(pklocs, pks, 'filled') % plot peaks
scatter(dplocs, -1*dps, 'filled') % plot dips as negative value
hold off, grid on
HTH

Sign in to comment.