MATLAB Answers

Kev Wat
0

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

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

Sign in to comment.

Products


Release

R2018a

4 Answers

Kazuya
Answer by Kazuya
on 21 Nov 2018
Edited by Kazuya
on 21 Nov 2018
 Accepted Answer

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


Kei Otsuka
Answer by Kei Otsuka
on 19 Nov 2018

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

  0 Comments

Sign in to comment.


Kev Wat
Answer by Kev Wat
on 20 Nov 2018

回答ありがとうございます。
周波数の特定が目的ではありません。
何か信号の頭の部分(0000)を捕らえる方法がないか考えています。
Matlabでそのような関数があればいいのですが、なければ 
table の複数rawをfor文で回して
if(i=FFFF & i+1=0000)
のような条件で引っ掛けてみようと思います。
他にスマートな方法があればご教示頂きたいです。

  3 Comments

Kazuya
on 20 Nov 2018
信号の頭の部分となる条件は明示できますか?
0000
0000
0000
みたいに、0000 が 3 つ連続するとか?
それとも if(i=FFFF & i+1=0000) から察するに、ただ単純に FFFFの次に 0000 が来れば頭ですか?スマートな方法も、条件を明記してくれると出てくるかも。
Kev Wat
on 21 Nov 2018
信号の頭の部分となる条件は、
データがFFFF,0000 と入ってきたところになります。
FFFFがデータの末尾で、0000が先頭になります。
そのあと0000 が何バイトか続きますが、連続回数は不定です。
ネックは、複数行データを跨がないと、データの先頭が分からないことです。
Kazuya
on 21 Nov 2018
回答追加してみました。「周期」ごとに別Columnに格納するためには、周期が一定である必要があるかと思いまして、その点を前提にしています。

Sign in to comment.


Kev Wat
Answer by Kev Wat
on 25 Nov 2018

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

  0 Comments

Sign in to comment.