手習ひデジタル信号処理(114) Scilab、自前ASK変調関数でBPSK変調?

Joseph Halfmoon

元より信号処理も無線も素人なので常識がありませぬ。今回、あるご本を読んでいて、ASK変調で100%変調を超えた過変調200%とすると、なんとBPSK変調となることに気づきました。ASK変調自前関数とは別にBPSK変調関数を作った私の努力は水の泡?でもま、気づいたからには「手習ひ」してみるのであります。いつもの泥縄。

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

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

まずは今回読んでいた(といって本棚の整理のついでにチラチラ眺めていただけだけれども)は以下です。

無線によるデータ変復調技術 西村芳一著 CQ出版 2002年

上記はCQ出版社の通販サイトの該当の御本のページへのリンクです。一行引用させていただきます。

大変恐縮ですが,こちらの商品は品切れ絶版となりました.

残念なことに絶版なのね。。。でもま、探すとAmazonなどで古本が売られているようなので、流石に良書、いまだ一定の需要と供給あり、ということか。知らんけど。

以前作成の自前関数は過変調に非対応

以下の過去回にて、comm_tbxのASK変調がまともに動作してくれない、ということで「自力更生」してました。

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

今回そのとき作成の genASK 関数を見直しましたが、変調度は0から1(0%から100%)範囲のみ対応で、100%を超えるような過変調には対応していませんでした。残念。そこで200%までの過変調に対応した改訂版を作製してみました。こんな感じ。

// generate ASK modulated signal,  (supporting overmodulation)
// Fs: sampling frequency [Hz]
// Fc: carrier frequency [Hz]
// Fsym: symbol rate [baud]
// m: modulation factor [0-1; 1-2 overmodulation ]
// b: test sequence
function askwave2=genASK2(Fs, Fc, Fsym, m, b)
    nSym=length(b);
    mb=1.0;
    if m > 1 then
        mt=2-m;
        maf=-(1-mt)/(1+mt);
    else
        maf=(1-m)/(1+m);
    end
    mw = [];
    nLen=Fs/Fsym
    t=0:1/Fs:nSym/Fsym;
    Omega=2*%pi*Fc;
    cr=sin(Omega*t);
    for n=1:nSym
        if b(n)==0 then
            mwt=ones(1,nLen) * maf;
        else
            mwt=ones(1,nLen) * mb;
        end
        mw=[mw mwt];
    end
    askwave2=mw .* cr(1:nSym*nLen);
endfunction
実際に200%変調して波形を眺めてみる

以下の5つのケースで変調波形を比べてみました。

    1. 50%ASK変調
    2. 100%ASK変調
    3. 200%(過変調)ASK変調
    4. BPSK変調(自前関数)
    5. BPSK変調(comm_tbxの変調関数)

1,2,3は全て今回作成のgenASK2関数です。4は以下の過去回のもの。

手習ひデジタル信号処理(84) Scilab、BPSK、自前版とtbx版、微妙な違い?

5は「珍しく」手元の環境のcomm_tbxの変調関数mod_process()関数が変調処理できたBPSK波形です。

実験のシーケンスが以下に。

Fs=500e3;
Fc=38e3;
Fsym=2e3;
b=prbs(100);
m05=0.5;
m1=1;
m2=2;
askwave05=genASK2(Fs, Fc, Fsym, m05, b);
askwave1=genASK2(Fs, Fc, Fsym, m1, b);
askwave2=genASK2(Fs, Fc, Fsym, m2, b);
bpskwave1 = genBPSK(Fs, Fc, Fsym, b);
wf = wf_init('bpsk');
mod = mod_init(wf, fs=Fs, fi=Fc, fsymb=Fsym);
[mod,bpskwave2] = mod_process(mod,b);
scf(0); clf();
subplot(511); title('ASK m=50%'); plot(askwave05);
subplot(512); title('ASK m=100%'); plot(askwave1);
subplot(513); title('ASK m=200%'); plot(askwave2);
subplot(514); title('BPSK genBPSK'); plot(bpskwave1);
subplot(515); title('BPSK comm_tbx'); plot(bpskwave2);

シンボル100個分のデータのごく一部を取り出して拡大したグラフが以下です。ask_bpsk

上から3つ目の200%変調のASK波形は、4つ目の自前BPSK変調関数の結果と、5つ目のmod_process()の結果とも微妙?に異なる波形だけれども確かに位相変調されているように見えます。まあBPSK変調されているみたいね。

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

手習ひデジタル信号処理(115) Scilab、RCフィルタ(LPF)をエミュレート? へ進む