フィルターのクリア

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

14 ビュー (過去 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 Center および File ExchangeMATLAB 入門 についてさらに検索

製品


リリース

R2018a

Community Treasure Hunt

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

Start Hunting!