とっとと先に進めるべしとて、前回、前々回で作成の自前関数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");
前回出来たと思ったところまで戻ってくるのに、とっても時間かかったな。年末のいろいろ忙しいときに。。。