手習ひデジタル信号処理(80) Scilab、変調/復調系関数、どこまでOKなの?

Joseph Halfmoon

ScilabのScilab Communication Toolbox(comm_tbxと略称)をありがたく使わせていただいております。前回までのプロット系の関数などは便利に使えるのですが、どうも変調/復調系の関数、特に復調(demodulation)系が怪しく思えてなりませぬ。復調は自分でやってみろと?

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

※動作確認に使用させていただいているのは、Scilab 6.1.1(Windows版)です。

当方で使用しておりますのは、以下のバージョンです。Scilab環境からATOMS(Scilabのライブラリ管理ツール?)でインストールをいたしたもの。

Scilab Communication Toolbox 0.3.1

comm_tbxの変調、復調関係の関数

helpを見るに以下の6関数が定義されておるようです。

    1. demod_init
    2. demod_process
    3. mod_init
    4. mod_process
    5. wf_init
    6. wf_set_filter

3、4、5あたりの関数は、プロットなどのサンプル信号を生成するために過去回でも何度も使っていて「それなりに動く」ような気がしています(頼りないな。)

しかし、今回上の2つDemodulation関係をちょいと触ろうとしてエラーに遭遇しました。といって自前のコード(自分勝手なパラメータ指定でエラー発生の可能性あり)ではなく、helpに掲載されておる処理例(コピペ)でです。

qpskで変調やって復調して元に戻す(ビットエラーがなければ良かったね)という感じのコード(demod_process関数の処理例)です。走らせてみると、最初の一歩目、demod_init関数でデモジュレータを初期化しようとすると、 ted_qpskというものが未定義で落ちます。知らんよ、そんなもの。

試みに qpskを ask に変更してみると、demod_initは成功するのですが、demode_processで未定義変数に遭遇します。テキトーに変調方式の指定を変えみたのですが、エラーの出方は指定によって様々なのですが最後までたどりつけません。テキトーな指定がエラーを呼んでいるかもしれないっすけど復調できんです。

これは復調は自前で考えないとイケない(多分、その部分を考えるためのcomm_tbxなので、復調関数などに安易に頼ってはイケないのか?)

変調関数の方はどうよ

サンプル信号を生成するのに便利に使わせていただいている変調用の関数にも疑いの目を向けざるを得ません。helpみると合計12種類の変調方式をサポートしていることになってます。この際ということですべてを動かしてみました。

結論からいうと12種のうち1種

oqpsk (Offset Quaternary Phase Shift Keying)

を指定したときはエラーとなりました。他の11種は動作しましたが、ホントに正しい波形かどうかは不明。自分で吟味しろと?

変調関数が動作するかどうかの実験は以下の関数使って行いました。テキトーな共通パラメータで、変調方式を変えてサンプル変調波形を生成し、PSDプロットする、というだけのもの。変調は各方式毎にデフォルト設定があるので、そのままです。また、PSDプロットはデフォルトのままだと差異が見ずらいので、fiに指定した周波数の2分の1から2倍までにフォーカスしとります。

function plotPSDsample(modName)
    fs = 1e6;
    fi = 1e5;
    fsym = 1e4;
    testpat = prbs(100);
    wf_f = wf_init(modName);
    mod_f = mod_init(wf_f, fs, fi, fsym);
    [mod, x] = mod_process(mod_f, testpat);
    gda().grid = [1 1]*color("grey70");
    clf();
    plot_psd(x, fs, fi/2, fi*2);
    gca().sub_ticks = [4 4];
    title("PSD PLOT: "+modName);
    xlabel("Frequency[Hz]")
    ylabel("PSD[dB(/Hz)]")
endfunction

上記関数を定義後、以下のように各変調方式を指定する文字列を食わせてやればそれぞれプロットしますです。

plotPSDsample('bpsk');
plotPSDsample('qpsk');
plotPSDsample('8psk');
plotPSDsample('psk');
plotPSDsample('oqpsk');
plotPSDsample('fsk');
plotPSDsample('gfsk');
plotPSDsample('gmsk');
plotPSDsample('msk');
plotPSDsample('ask');
plotPSDsample('ook');

ただし、qam16はパラメータ指定が必須のようだったので、これのみは手動でやってます。

以下はダラダラとプロット結果(順不同ってか)

8PSK8psk

ASK

ask

BPSK

BPSK

FSK

fsk

GFSK

gfsk

GMSK

gmsk

MSK

msk

OOK

ook

PSK

psk

16値QAM

qam16

QPSK

qpsk

なんだかな~。サンプル信号作るときに変調関数の素性もよく確かめた方がいいなあ。それにしても復調の方は自前かあ。そこが手習ひっしょ。

手習ひデジタル信号処理(80) Scilab、BER(ビットエラーレート)をプロットしてみる へ戻る

手習ひデジタル信号処理(81) Scilab、ライブラリの.binファイルのミスマッチ へ進む