手習ひデジタル信号処理(112) Scilab、自前関数の更新、2件

Joseph Halfmoon

とっとと先に進めるべしとて、前回前々回で作成の自前関数2つを組み合わせて次のテストパターンを作ろうとしてハマリました。自前関数の相性とても悪かったです。単独では動いている振りをしているのに、組み合わせると意外なところでエラーを起こしてくれます。トホホ。なんとかFIXできた感じがあるので今回はそれだけ。まだ怪しい?

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

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

意外なところでエラー

発生したエラーのメッセージは以下のようなものです。前回作成のバイナリ化関数の中で発生してました。

Complex comparison not supported. Please define %s_2_s_custom() or check your code.

なんじゃらほい。複素信号など扱っていないんだが。。。心あたりがまったくないのでハマリました。上記の原因は前回作成のバイナリ化関数の中にはなく、前々回作成の包絡線検波の自前関数の方にありました。a + 0i という形で0がかかっているので実質は実数なのですが、形式的には複素数が紛れ込んでました。見つからんよ。。。

その修正過程でいろいろ弄っているうちに、バイナリ化関数にも飛び火。こちらも修正せざるを得ないことになりましたです。

修正した2関数が以下に。まだ分からんけど。。。

    • 包絡線検波の自前関数
// 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 = real(sqrt(af64))';
endfunction
    • 2値化の自前関数
// binarization
// Fs: Sampling frequency [Hz]
// Fsym  Symbol rate [Hz]
// Z0: default level to zero
// Z1: default level to one
// w: input wave
function wo=makeBIN(Fs, Fsym, Z0, Z1, w)
    mav=ma(abs(w), Fs/Fsym);
    nSym=length(w);
    for n=1:nSym
        if mav(n) > Z1 then
            th = Z1
        else
            th = Z0
        end
        if w(n) > th then
            wo(n)=1
        else
            wo(n)=0
        end
    end
endfunction
修正済の関数を連続で適用してみる

上記2つを修正後のテストシーケンスが以下に。

Fs=500e3;
Fc=38e3;
Fsym=2e3;
Flev=10;
m=1;
b=prbs(100);
askwave100=genASK(Fs, Fc, Fsym, m, b);
[t0, TW0]=genTriangular(Fs, length(askwave100), Flev, 180, 1);
twave = askwave100.*TW0';
te=detectEnvelop(Fs, Fc/4, twave);
tb=makeBIN(Fs, Fsym, 0.1, 0.2, te);
clf;
plot(twave, "b");
plot(te, "g");
plot(tb, "r");

上記により生成したプロットの結果updateResults

前回出来たと思ったところまで戻ってくるのに、とっても時間かかったな。年末のいろいろ忙しいときに。。。

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

手習ひデジタル信号処理(113) Scilab、クロックリカバリ?ASKを復調 へ進む