forループについて

8 ビュー (過去 30 日間)
yuta
yuta 2022 年 3 月 10 日
コメント済み: yuta 2022 年 3 月 27 日
筋電図のRMS処理を行いたいです。
以下のコードのrawは3640 × 1 doubleとなっています。
1つの筋に対してRMS処理を行なっているコードとなります。
質問1
このrawが3640 × 8 となり、各列ごと(8つの筋)にRMS処理を行いたいと考えております。
その際はどの様にfor ループを回せば良いでしょうか。
wlength = 30; % 積分区間(データ点数)
RMS = zeros(size(raw));
% 積分区間データ長が偶数の場合,時間窓を積分時刻を中心に
% 左右対称とするため窓長を1増加させる
if mod(wlength, 2) == 0
wlength = wlength+1;
end
nedge = floor(wlength/2); % 時間窓の片側長さ
dlen = length(raw); % データ長
for ii = 1:dlen % RMSの計算
if(ii <= nedge) % データの左端
RMS(ii,1) = rms(raw(1:(ii+nedge), 1));
end
if(ii > nedge && ii < dlen - nedge)
RMS(ii,1) = rms(raw((ii-nedge):(ii+nedge), 1));
end
if(ii >= dlen - nedge) % データの左端
RMS(ii,1) = rms(raw((ii-nedge):dlen, 1));
end
end
質問2
上記の処理を複数のCSVファイルから同時に行いたいと考えております。
例)10個のcsvファイル(cap1.csv, cap2.csv, cap3.csv......)があるとします。
  各csvファイルには8つの筋電図の生データが入っており、行数はファイルによって異なります。
それぞれのファイルから筋電図の生データを取り出し、質問1で行なったRMS処理をそれぞれの筋に対して行うにはどの様にすれば良いでしょうか?
下のコードは
Grip05.csv, Grip15.csv, Grip25.csvという3つのCSVファイル(それぞれ1つの筋のデータが入っている)があり、
RMS処理を行なっているものになります。
これの8筋バージョンを行いたいのですが可能でしょうか?
もし可能であれば、コードを教えていただけると幸いに存じます。
% Grip 5, 15, 25 kg のデータを読み込み,RMS値にしてセル配列に格納。
RMS_data = cell(3,3); % セル配列(3行3列)の初期化
Res = [5, 15, 25]; % 負荷量
Fs = 1000; % サンプリング周波数 Hz
wlength = 30; % RMSの積分区間(データ点数)
% RMSの計算とセル配列への格納
if mod(wlength, 2) == 0 % 積分区間データ長が偶数の場合,時間窓を積分時刻を中心に
wlength = wlength + 1; % 左右対称とするため窓長を1増加させる
end
nedge = floor(wlength/2); % 時間窓の片側長さ
for jj = 1:3; % 3種類の負荷それぞれについて計算する
RMS_data{1,jj} = [num2str(Res(1,jj)), ' kg']; % データのラベル
emg = importdata(['Grip', num2str(Res(1,jj), '%02d'), '.csv']);
raw = emg.data(:,2)/5; % Gain 5000, [mV]
tind = [1:length(raw)]/Fs;
% RMSの計算
RMS = zeros(size(raw));
dlen = length(raw); % データ長
for ii = 1:dlen
if(ii <= nedge)
RMS(ii,1) = rms(raw(1:(ii+nedge), 1));
end
if(ii > nedge && ii < dlen - nedge)
RMS(ii,1) = rms(raw((ii-nedge):(ii+nedge), 1));
end
if(ii >= dlen - nedge)
RMS(ii,1) = rms(raw((ii-nedge):dlen, 1));
end
end
RMS_data{2,jj} = RMS; % RMS値をセル配列に格納
figure(101); subplot(1,3,jj);
plot(tind, RMS);
title(['Resist.: ', num2str(Res(jj)), ' kg']);
ylim([0,0.5]); xlabel('Time [s]'); ylabel('RMS [mV]');
end
何卒、よろしくお願いいたします。
引用: MATLABで学ぶ生体信号処理, コロナ社

採用された回答

Atsushi Ueno
Atsushi Ueno 2022 年 3 月 26 日
> 質問1 各列ごと(8つの筋)にRMS処理を行いたいと考えております。その際はどの様にfor ループを回せば良いでしょうか。
for ループはそのままで、列を指定する添え字を11:8(または:)に変更すれば、各列についてのRMSを演算します。
RMS(ii,1) = rms(raw((ii-nedge):(ii+nedge), 1)); % これを
RMS(ii,:) = rms(raw((ii-nedge):(ii+nedge), :)); % こうする
> 質問2
その後の上記質問と質問1を踏まえ、先に複数のCSVファイルから8つの筋電計データを集める処理を行えばよいと思います。
for jj = 1:3; % 3種類の負荷それぞれについて計算する
RMS_data{1,jj} = [num2str(Res(1,jj)), ' kg']; % データのラベル
emg = importdata(['Grip', num2str(Res(1,jj), '%02d'), '.csv']);
raw(:,jj) = emg.data(:,2)/5; % ここでrawのjj列目にjj番目の筋電計データを格納する
end
  1 件のコメント
yuta
yuta 2022 年 3 月 27 日
解決しました。ありがとうございます!!

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!