手習ひデジタル信号処理(107) Scilab、赤外線リモコン実機波形の読み取りと解読

Joseph Halfmoon

前々回、赤外線リモコンの波形(NECフォーマット向け)を生成するScilab関数を作製。その一方、別シリーズにて実際にNECフォーマットのIR信号を出力しているらしいリモコンの実機波形をCSVファイルに取得しました。今回は取得した実機波形から01の生データを解読、前回作成の比較関数で期待値と比較してみます。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

※Windows11上で、Scilab6.1.1およびScilab上のツールボックス Scilab Communication Toolbox 0.3.1(以下comm_tbx)を使用させていただいとります。

赤外線リモコンの実機波形の読み込み

赤外線リモコンの実機波形の取得は、レシーバ部品の不調?もあり、以下2回もやっております。

IoT何をいまさら(123) 38kHz IR receiver,赤外リモコンの波形を取得

部品屋根性(106) Sharp GP1UXC41QSで赤外リモコンの波形を再取得

どちらもレシーバの出力端子に現れる波形をDigilent Analog Discovery2(AD2)のオシロで捕まえて、CSVファイルに落としております。いくつも波形は取得したのですが、今回テストに使用してみたのは、イマイチ挙動が安定しない(もしかすると部品不良?)な素性の怪しいデバイスで取得した方の以下のデータです。だって「手動で0,1解読する」のを行ったのがこれだけだから。手で(目で)デコードするのは辛いっす。特に老眼の年寄には。

NEC_CHM_DECさて、AD2からExportしたCSVファイルのScilabへの読み込みは以下のようにしてみました。

nec_chmFnam=fullfile("C:\proj\DSP\scilab_irdata", "NEC_CHM.csv");
[nec_chm, nec_chm_comment]=csvRead(nec_chmFnam, ",", [], "double", [], '!#!', [], 10);
plot(nec_chm(1:8192,1),nec_chm(1:8192,2))

2行目が懸案だった、AD2のコメントの読み飛ばし対応のcsvReadです。AD2のCSV出力にはデータの素性が失われないように先頭にいろいろ記載があるのですが、単にcsvReadするとその部分が失われるだけでなく、肝心のデータにNaNが載ってしまうのです。ちなみにAD2のヘッダは以下のようです。

#Digilent WaveForms Oscilloscope Acquisition
#Device Name: Discovery2
#Serial Number: SN:~ここに装置のシリアル番号
#Date Time: 2023-11-10 14:44:28.521
#Sample rate: 40000Hz
#Samples: 8192
#Trigger: Source: Channel 1 Type: Edge Condition: Falling Level: 700 mV Hyst.: Auto HoldOff: 100 ns
#Channel 1: Range: 1 V/div Offset: 0 V Attenuation: 1 X Sample Mode: Average

Time (s),Channel 1 (V)
-0.02238703389830508,3.162599155799449
-0.02236203389830507,3.162599155799449
-0.02233703389830508,3.162599155799449
~以下略~

そこでコメント、ヘッダ部をデータに含めないようにし、かつ、後で参照できるようにコメントを文字列として取り込むこともするようにしてみました。

上記によりScilabへ取り込んだデータをプロットしたところが以下に。縦軸が電圧、横軸が時間です(トリガ点を0秒とする。)rawData

今回解読処理するのは上記グラフで黄色のマーカを引いた部分です。ここに32ビットのコードが載っています。緑のマーカ部分は、頭だしのためのリーダー部分でそこにはデータが載っているわけではないので無視してます。

今回作成の解読用関数

NECフォーマットの赤外線リモコン波形(IRレシーバモジュールにより38kHz搬送波からの検波は済)を想定しています。しかしNECフォーマットのデータチェックのためのお作法などは含まない生のビットデータ列を取り出すだけの関数が以下に。何時もの通り手抜きデス。

// Ir-remote-control pulses raw decoder (by J.Halfmoon Nov. 16, 2023)
// rdat: Rawdata time..(n, 1), voltage..(n, 2)
// Fs: Sampling frequency, detected
// Th: Threshold level, detected
// b: binary sequence, etected
//function [Fs, Th, b, cnt]=decIRpulses(rdat)
function [Fs, Th, b]=decIRpulses(rdat)
  itvl = rdat(2,1)-rdat(1,1);
  cntT = 562e-6 / itvl;
  cntC1 = int(cntT*3.5);
  cntC2 = int(cntT*2);
  Fs = 1/itvl;
  Th = (rdat(2,2) + rdat(1,2)) / 4;
  N = size(rdat)(1);
  b=[];
  counter = 0;
  flag=%f;
  for n = 1: N do
    if rdat(n, 2) >= Th then
      counter = counter + 1;
      flag=%t;
    else
      if flag then
        if counter < cntC1 then
          if counter > cntC2 then
            b=[b, 1];
          else
            b=[b, 0];
          end
        end
        counter = 0;
        flag=%f;
      end
    end
  end
endfunction
実機波形の処理結果

前回作成のビット列比較関数を使用してチェックするために、手動にて解読済のビット列を bexpected として定義した後で、解読、そして比較チェックを行ってみた様子が以下に。

Result

期待値と解読したビット列は同じ。よかった。

手習ひデジタル信号処理(106) Scilab、cmp_bits()の代替自前関数 へ戻る

手習ひデジタル信号処理(108) Scilab、CRC8の計算、Pythonから移植 へ進む