取得したデータの周期性をみつけたい

조회 수: 15 (최근 30일)
Kev Wat
Kev Wat 2018년 11월 19일
답변: Kev Wat 2018년 11월 25일
[Matlab初心者です]
取得したtableのデータが
:
FFFE
FFFF
FFFF
0000
0000
0000
0001
0001
0002
:
FFFE
FFFF
FFFF
0000
0000
0000
0001
0001
0002
:
のような周期を持っています。
周期ごとに 別tableの別Columnに格納したいです。
Col1 Col2
-----------------
0000 0000
0000 0000
0000 0000
0001 0001
0001 0001
0002 0002
: :
matlabの関数に何か周期性をみつける関数はあるのでしょうか?
  댓글 수: 2
Kazuya
Kazuya 2018년 11월 19일
”周期性”というと難しそうですが、何か具体的なパターンがあるのであれば、それを利用してシンプルに実現できるかも?
Shoumei
Shoumei 2018년 11월 22일
HEX値で負の値から正の値に変化するゼロクロッシングを検出したいということですかね。
Simulinkだとゼロクロッシング検出のブロックがあるんですが。
SL.jpg

댓글을 달려면 로그인하십시오.

채택된 답변

Kazuya
Kazuya 2018년 11월 21일
편집: Kazuya 2018년 11월 21일
地味なコードで好みが分かれそうですが、一例として参考まで。
hoge = [
"0000"
"0001"
"FFFF"
"0000"
"0001"
"FFFF"
"0000"
"0001"
"FFFF"]; % ダミーデータ
idx1 = hoge == "FFFF"; % FFFF である行を見つけます。
idx2 = hoge == "0000"; % 0000 である行を見つめます。
idx = idx1(1:end-1) & idx2(2:end); % 1つずらして論理和を取ると FFFF から 0000 に変化する位置が分かります。
idx = [1; idx] % 元データと行数を合わせます(一番頭は 0000 と仮定)
loc0 = find(idx) % find で何行目に 0000 があるかを求める
% この例だと loc0 = 1,4,7
% 均等に3列に分けられる列数であると仮定して分割
hoge1 = reshape(hoge,loc0(2)-1,[])
hoge2 = array2table(hoge1) % table 型に変換
結果として
hoge2 =
3×3 table
hoge11 hoge12 hoge13
______ ______ ______
"0000" "0000" "0000"
"0001" "0001" "0001"
"FFFF" "FFFF" "FFFF"
となります。
  댓글 수: 2
Kev Wat
Kev Wat 2018년 11월 21일
ありがとうございます。
とても勉強になりました。
一点,
idx = [1; idx] % 元データと行数を合わせます(一番頭は 0000 と仮定)
だけ何をしているか良く分かりませんでした。
もう少し説明頂けたら幸いです。
Kazuya
Kazuya 2018년 11월 21일
配列 idx の先頭に1を追加してます。例えば
>> idx = [2;3;4]
idx =
2
3
4
に対して
>> idx = [1; idx]
idx =
1
2
3
4
1つずらして論理和をとったのでもともとの hoge の行数に対して、idx の行数が1つ減ってしまうので、比較をしやすいように 1 を追加して行数を合わせてます。hoge 内で FFFF -> 0000 と変化する位置が分かりやすいかな・・と。

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Kei Otsuka
Kei Otsuka 2018년 11월 19일
Signal Processing Toolboxをお持ちであれば、自己相関や周波数解析を利用して
周期性を検出するような例題を試すことができます。
記載頂いたデータは16進表記(符号あり?)でしょうか。その場合はhex2dec等で10進数に
変換してからお試しください。

Kev Wat
Kev Wat 2018년 11월 20일
回答ありがとうございます。
周波数の特定が目的ではありません。
何か信号の頭の部分(0000)を捕らえる方法がないか考えています。
Matlabでそのような関数があればいいのですが、なければ 
table の複数rawをfor文で回して
if(i=FFFF & i+1=0000)
のような条件で引っ掛けてみようと思います。
他にスマートな方法があればご教示頂きたいです。
  댓글 수: 3
Kev Wat
Kev Wat 2018년 11월 21일
信号の頭の部分となる条件は、
データがFFFF,0000 と入ってきたところになります。
FFFFがデータの末尾で、0000が先頭になります。
そのあと0000 が何バイトか続きますが、連続回数は不定です。
ネックは、複数行データを跨がないと、データの先頭が分からないことです。
Kazuya
Kazuya 2018년 11월 21일
回答追加してみました。「周期」ごとに別Columnに格納するためには、周期が一定である必要があるかと思いまして、その点を前提にしています。

댓글을 달려면 로그인하십시오.


Kev Wat
Kev Wat 2018년 11월 25일
回答していただいた皆様、
回答ありがとうございます。
とても勉強になりました。
参考にさせていただきます。
本件これでクローズとさせてください。

카테고리

Help CenterFile Exchange에서 MATLAB 入門에 대해 자세히 알아보기

제품


릴리스

R2018a

Community Treasure Hunt

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

Start Hunting!