手習ひデジタル信号処理(117) Scilab、Analog LPFでベースバンドフィルタ

Joseph Halfmoon

ASK変調するベースバンド信号をフィルタリングして変調後のサイドローブを落とす実験のポンコツ例としてRC(抵抗とコンデンサで作るフィルタ。レイズド・コサインではないです)フィルタを計算しようとして前回前々回とかなり回り道をしました。ようやく計算できるようになったので今回はポンコツなベースバンドフィルタしてみます。

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

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

ベースバンド信号をハードウエアとしてはもっとも簡単な抵抗R・コンデンサCのフィルタに通したときの波形を計算しようとしてその準備に2回も費やしました。まず、アナログのRCフィルタの特性のフィルタの定義方法を前々回にやってみました。しかし特性を定義できても、「デジタルな数列(信号)」に適用するには結局デジタルなフィルタを定義せんといかんということでRCフィルタ等価なIIRフィルタの定義を前回やりました。しかしまだ準備はあり。

自前関数に手をいれる必要あり

過去回で作ったASK変調のための自前関数は、ビット列から直接信号波形を生成するようになっていたので、これではベースバンド信号にフィルタをかけてからASK変調するという作業が行えませぬ。そこで自前関数を何度目かの改造。ビット列からベースバンド信号を作る関数を作りそのベースバンド信号にフィルタをかけられるように。そしてその信号を「変調」して出力する2段構えとしてみました。といっていつものチョイ変でお茶を濁してます。

    • ビット列をベースバンド信号に変換する関数

nrz関数と似てますが、0を中心とする波形ではなく0/1の信号波形を作り出すだけのもの。

// convert bit sequence to wave
// Fs: sampling frequency [Hz]
// Fsym: symbol rate [baud]
// b: test sequence
function bwave=b2wave(Fs, Fsym, b)
    osf=Fs/Fsym;
    nSym=length(b);
    index = 1;
    for n=1:nSym
        dat=b(n)
        for i=1:osf
            bwave(index)=dat;
            index = index +1;
        end
    end
endfunction
    • ベースバンド信号を受け入れるようにしたASK変調関数

以前作成のgenASK2関数のチョイ変、「ベースバンド信号を乗じて」お茶を濁したもの。

// 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
// w: signal to be modulated
function askwavew=genASKw(Fs, Fc, Fsym, m, b, w)
    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
    askwavew=mw .* cr(1:nSym*nLen) .* w';
endfunction
実験の結果

まずは例によって周波数等の定義とテスト用のビット列(疑似乱数列)の生成。いつも通りでFsはサンプリング周波数、Fsymがシンボルレートっす。

Fs=500e3;
Fc=38e3;
Fsym=2e3;
Fcut=Fsym/2;
FcutNorm=Fcut/Fs;
b=prbs(1000);

上記定義を使って、ビット列bからベースバンド信号bwaveを作製してみます。

bwave=b2wave(Fs, Fsym, b);

この状態では、ただダラダラと0と1が引き伸ばされた数列にしかすぎませぬ。

前回やったとおりで、RCフィルタ等価なIIRフィルタを定義し、上記の「ベースバンド信号」をフィルタリングしてみます。念のため、フィルタリング後の波形のアイ・ダイアグラムを自前関数plotEYEで描いてみます。

hzi=iir(1,'lp', 'butt', [FcutNorm, FcutNorm*10], [0, 0]);
[bwaveFilt, zf]=filter(hzi.num, hzi.den, bwave);
plotEYE(Fs/Fsym, bwaveFilt);

プロットが以下に。以下にもRCフィルタかけましたというなまった波形デス。アナログRCフィルタ「等価」なフィルタは動いているみたいね、多分。EYE_DIAG_Filt

 

さて、フィルタをかけない元のベースバンド信号をそのままASK変調したものと上のフィルタを通した後のベースバンド信号をASK変調したもの、FFTかけて比べてみます。処理はこんな感じ。

askwave=genASKw(Fs, Fc, Fsym, 1.0, b, bwave);
askwaveF=genASKw(Fs, Fc, Fsym, 1.0, b, bwaveFilt);
plotFFT2(Fs, askwave, 1);
plotFFT2(Fs, askwaveF, 1);

まずフィルタをかけない場合のものNofiltN

フィルタをかけた場合のものFiltN

上下見比べると、気持ちサイドローブが低くなっている気がしないでもないです。でもダメダメだあ。それにシンボル周波数の整数倍のところのピンと立っているのは何。もっと良いベースバンド・フィルタを手習ひしろ、ということ?

手習ひデジタル信号処理(116) Scilab、Analog LPF等価なIIRフィルタ作成 へ戻る

手習ひデジタル信号処理(118) Scilab、FIRフィルタの設計関数、どれをどうする? へ進む