手習ひデジタル信号処理(100) Scilab、comm_tbx代替自前関数の計画?

Joseph Halfmoon

前回はFM変調でしたが、今回はBPSK変調です。お世話になっておりますScilabのcomm_tbxですが、当方手元の環境ではシバシバ不具合あり信号処理素人はその度に難渋しております。やはり自前関数を作成していくのが良いかと思い定めました。その割に使えるものは使おうという依存性は抜けませぬ。

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

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

気になっているところ

以前の回でも書いてしまいましたが、Comm_tbxを使っていて必発するのが、以下のような警告であります。plot_const_Warning

上記のplot_constはコンスタレーション・プロットを描く関数です。「今後使えなくなるぞ」の警告は出るものの、Scilabバージョン6.1.1では動作しているみたいなのでそのまま使わせていただいております。しかし新しいバージョンのScilabに移行しずらい足かせ?の一つになってます(既にScilabの2023年版はインストールして立ち上げできるところまでやったのですが<一部トラブルあり、先達のお陰で解決>使っておりませぬ。)

続く、復調系関数に関する以下のエラーは致命的っす。demodError

変調方式の指定によって挙動が変わるのですが、なにやらエラーで落ちるので使うこと能わず。自分でやれ、ということだな~。

それでも使えそうなサンプル生成関数

プロット系の関数でも、復調系の関数でも自前で作るとなると、欲しいのがサンプルの入力、変調された信号デス。それでもシツコクcomm_tbxを眺めていたら、以下のテスト信号の生成関数は「使えそう」な感じでした。

sct_test_signal()
この関数を引数なしで呼び出すと以下のようなBPSK信号を生成してくれます。
    • バイナリシーケンス長 100ビット
    • シンボル周波数 10kHz
    • キャリア周波数 200kHz
    • サンプリング周波数 1MHz
以下の引数を与えることも可能です。
    • 第1引数:1なら実数ベクトル、2なら複素数ベクトル
    • 第2引数:1ならBPSK、2ならQPSK
「お仕着せ」のPSK(位相変調)波形を作り出してくれる関数です。ソース内部を見てみると実際には変調系の関数を呼び出しているのですが、この関数内で使われている関数類はエラーを吐かずに動いているみたいです。
戻り値は以下の5つを返してきます。 [x, fs, fi, fsym, b]
    • x 出力信号
    • fs, サンプリング周波数
    • fi, 中間周波数
    • fsymb, シンボル周波数
    • b, 変調につかったバイナリシーケンス
自前の信号生成関数と比較

今回は、以前に自前で作った信号生成関数と上記の信号を比べてみました。どちらも信用置けないのでグダグダ?

まずは、以前の回で作成済の以下2種類の自前関数をロード。

genBPSK.sci
genNCO.sci

お仕着せの仕様にあわせて自前関数で信号波形を生成してみます。こんな感じ。

Fs=1e6;
Fc=200e3;
Fsym=10e3;
b=prbs(100);
x=genBPSK(Fs, Fc, Fsym,b);

一方、サンプル信号生成関数では以下のように1行っす。簡単。

[testSIG1, fs1, fc1, fsym1, bs1] = sct_test_signal(1, 'r');

両方の結果をプロットして比べてみると、その差は一目瞭然。左が自前関数、右がサンプル信号生成関数っす。waveform

左は「原理どおり」に瞬間的に位相を切り替えているので、シンボルの切り替えのところで過激に切り替わってます。一方、右は位相切替のところで「優しく信号」を切り替えている感じ。「パルス・シェーピング」しているのかなあ、多分。流石、素人のバッサリな自前関数とは違う。まずはこの波形を目指すか?

つづいて生成した実数ベクトルに、自前NCO関数で生成した正弦波、余弦波を乗じて、IQの複素数波形に変換、ちょいと色をつけるためにノイズを載せた上で、LPFして5:1のデシメーションをかけてみます。そしてコンスタレーション・プロットと。

nSample=length(x);
[t, swave, cwave]=genNCO(Fs, Fc, nSample, 0);
xi=x .* swave';
xr=x .* cwave';
xc=complex(xr, xi);
Fcutoff=Fsym*2;
coeff100=genFIRLP2(Fs, 100, Fcutoff, 1);
xca=awgn(xc, 0.1);
xca10=polyphase_decimation(xca, coeff100, 5);
clf(); plot_const(xca10);

ここでデシメーションにはcomm_tbx内の

polyphase_decimation()フィルタ関数

を使わせていただいております。ちゃっかり。

一方、同様な処理をサンプル信号生成関数で生成した信号についても行ってみます。こんな感じ。

nSample1=length(testSIG1);
[t, swave, cwave]=genNCO(fs1, fc1, nSample1, 0);
xi=testSIG1 .* swave';
xr=testSIG1 .* cwave';
testSIG1c=complex(xr, xi);
testSIG1_D=polyphase_decimation(testSIG1c, coeff100, 5);
clf(); plot_const(testSIG1_D);

コンステレーションプロットを比べてみると。左が自前、右がサンプル信号生成関数デス。

const_compare

自前の方は、45度くらい回ってないかい?まあ、BPSKなので2か所に点がまとまっているのは同じだけど。右のプロットは縦軸が引き伸ばされているせいで縦棒みたいに見えているケド。

とりあえずの目標

警告、エラーを乗り越えて、BPSK信号の変調から復調まで実験できる自前関数を取り揃えたいと思います。まずは簡単そうなプロット系の関数からかね。

手習ひデジタル信号処理(99) Scilab、位相連続のFM変調方法を実験 に戻る

手習ひデジタル信号処理(101) Scilab、plot_eyeの代替自前関数、五月蠅い へ進む