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

14 views (last 30 days)
Kev Wat
Kev Wat on 19 Nov 2018
Answered: Kev Wat on 25 Nov 2018
[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 Comments
Kazuya
Kazuya on 19 Nov 2018
”周期性”というと難しそうですが、何か具体的なパターンがあるのであれば、それを利用してシンプルに実現できるかも?
Shoumei
Shoumei on 22 Nov 2018
HEX値で負の値から正の値に変化するゼロクロッシングを検出したいということですかね。
Simulinkだとゼロクロッシング検出のブロックがあるんですが。
SL.jpg

Sign in to comment.

Accepted Answer

Kazuya
Kazuya on 21 Nov 2018
Edited: Kazuya on 21 Nov 2018
地味なコードで好みが分かれそうですが、一例として参考まで。
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 Comments
Kev Wat
Kev Wat on 21 Nov 2018
ありがとうございます。
とても勉強になりました。
一点,
idx = [1; idx] % 元データと行数を合わせます(一番頭は 0000 と仮定)
だけ何をしているか良く分かりませんでした。
もう少し説明頂けたら幸いです。
Kazuya
Kazuya on 21 Nov 2018
配列 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 と変化する位置が分かりやすいかな・・と。

Sign in to comment.

More Answers (3)

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

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

Sign in to comment.


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

Categories

Find more on MATLAB 入門 in Help Center and File Exchange

Products


Release

R2018a

Community Treasure Hunt

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

Start Hunting!