手習ひデジタル信号処理(110) Scilab、包絡線検波の自前関数作成

Joseph Halfmoon

第107回で赤外線リモコン波形の解読を行いましたが、レシーバモジュールが出力する「検波」済の波形に対してでした。簡単にマイコンでも出来る解読。しかし別件シリーズで「生波形」を取得しつつあります。この「生波形」を検波してレシーバモジュールがやっている仕事相当のことを計算して~と考えました。包絡線検波すればよろしいの?

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

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

赤外線リモコンの「生波形」を取得した別シリーズ記事が以下です。

部品屋根性(112) AD8656でトランスインピーダンスアンプ、赤外線リモコン生波形

単電源、レールツーレールのCMOSオペアンプで赤外線PINダイオードの出力を電圧波形にするという、多分確実に「リモコン用レシーバモジュール」のお値段を上回る材料費の回路でゴージャスに生波形を取得しております。赤外線リモコンのサブキャリア周波数38kHzは勿論、一桁速い信号にも対応できるんでないかと(実験してないケド。)ともあれ、38kHzのサブキャリアがアカラサマに見える「生波形」が習得できます。

包絡線検波

赤外線リモコンの場合、0,1のデータは振幅にではなくハイ、ローのパルス幅の時間にエンコードされておるので、一種の周波数変調と思われるのであります。しかし38kHzのサブキャリア波形に「載って」いるので、サブキャリアからハイ、ローの取り出しは振幅方向であります。したらば「包絡線検波」すればいいんじゃね。。。

ということで包絡線検波、envelop detection、手元のScilab環境調べてみましたがテキトーな関数が見当たりませぬ。きっとどなたか偉い人が立派な関数作ってくれていると思うのだけど。

まあ、これも手習ひの一環、自前に作成してみることに。

ターゲット(テスト)波形の生成

自前関数を作製するまえに、作成後のテストのために波形を生成しておくことにいたしました。以下の過去回で作成済のgenASK自前関数を使って、ASK波形を生成しておきます。これを被テスト波形として包絡線を取り出してみたいと。

手習ひデジタル信号処理(82) Scilab、ライブラリ再生成してみたけどダメ。自力更生。

生成方法はこんな感じ。サンプリング周波数Fsは500kHz、キャリア周波数Fcは38kHz(リモコンのサブキャリアにあわせた)、シンボルレートFsymは2000ボー、変調指数0.5で、100ビット長の疑似乱数系列で変調してます。

Fs=500e3;
Fc=38e3;
Fsym=2e3;
m=0.5;
b=prbs(100);
askwave100=genASK(Fs, Fc, Fsym, m, b);

変調した結果の「一部拡大」プロットはこんな感じ。赤で書き加えたのが今回希望の処理であります。envelopExpected

包絡線検波のソース

IQ複素信号を使ってヒルベルト変換するというのがカッコイイ方法みたいです。しかし今回実装したのは実数のまま、多分、ゲルマニウムラジオの原理と共通なやつです。

// detect signal envelope
// Fs: sampling frequency [Hz]
// Fcut: cut off frequency [Hz]
// w: input wave
function envelopwave=detectEnvelop(Fs, Fcut, w)
    coeff64=genFIRLP2(Fs, 64, Fcut, 0);
    w2=2*w^2;
    af64=filter(coeff64, 1, w2);
    envelopwave = sqrt(af64);
endfunction

いいのか?こんなもんで。

包絡線検波適用

以下のように上記関数を被テスト波形に適用した上でプロットしてみました。カットオフ周波数はエイヤ~でシンボルレートの倍にしてみました。知らんけど。

envW=detectEnvelop(Fs, Fsym*2, askwave100);
clf;
plot(envW, "r");
plot(askwave100, "b");

波形の全ぼうが以下に。青が被テスト波形、赤が自前関数で検出した包絡線です。envelopPLOT1

上記だとなんだかよく分からんので拡大したプロットが以下に。

envelopPLOT2

それらしくはある。。。いいのかこんなもんで。

手習ひデジタル信号処理(109) Scilab、ゼロ・ビット・インサート、リムーブ へ戻る

手習ひデジタル信号処理(111) Scilab、2値化の自前関数作成 へ進む