FMトランスミッタ6.2号機が完成し、お手軽低価格トランスミッタの完成をほぼ見ること?ができました。完成後に性能測定した結果それなりのレベルに到達して
今後もっと性能を出すにはFPGAの多bit高速演算が不可欠になのが分かってきました。今まで使ってこなかったけど、とうとう必要になる時が‥‥‥‥
なのでFPGAを使い方など、まるで分からないけどとりあえず勉強してみようと思いました。


‥どうせならFPGA-FMレシーバーを使って勉強しよう。 FMレシーバーとFMトランスミッタって比べると出口と入り口が逆なだけだし(笑)

という根も葉もない根拠のもと、FPGA-FMレシーバーの作者 林氏のソースコードとデジタルデザインテクノロジー(DDT)誌を片手にいろいろイジリ始めたのでした。



---------------------------------- まさぐり始めて2日目 ------------------------------------------------

気になることがDDT誌に書いてあったのでいろいろ検証してみることにしました。

"CORDICという演算をしてFMを復調していますが、復調後の音声のF特がsinc関数になる"とあります。そして、補正をするためIIRフィルタを駆使してF特補正をしている
と書いてあります。IIRフィルタは少ない演算量でキレの良いフィルタを作ることができますが、位相が狂うのと、計算精度が落ちるのが欠点です。

もしかして、セパレーションが1KHz時で75dB 10KHz時で55dBまで悪化するのはこいつのせいじゃね? 改造しちゃえ という訳で以下のようなフィルタ改造に
着手したのでした。



○IIRフィルタの削除
 まずはIIRフィルタを削除します。IIRフィルタはeqcomp.vhdに記述されているようです。なので、適当にeqcomp.vhd内をまさぐり、シフト演算とか、代入している部分を
 潰して、入力と出力を直結にしてみました。そしてコンパイラーを起動すると‥エラーの雨あられ あれがない、これがない、の大騒ぎ。
 どうやらeqcomp.vhdのファイル以外の部分でグローバル変数のようなものが定義されていて、勝手に変数を抹消したりすると怒り出すようです。
 めんどくさいヤツだ(笑)。電線なんぞ接続せず放置してもノイズが入りやすくなるだけで何も問題ないだろう(怒)

 ‥気を取り直してDDT誌を見ると内部ブロック図と接続図が描かれているページがありました。そのブロック図と同じような事が記述されているファイルが
 dmodmpx.vhdに書いてあったので、↓のように書き換えて配線を変えてみました。fir192の音声入力FLT_INをEQ_OUTからFR_DMDに変更します。
 これでpmfmcv.vhdとfir192.vhdが直結になりeqcomp.vhdを経由しなくなります。eqcomp.vhdは必死に計算しているのに、誰も結果を使ってくれないという‥‥
 お前の事は忘れないよ(^^)/~~      いや、もう忘れた(笑)
 

 この状態でセパレーションを測定すると1KHz時40.56dB それなりに変化はあるようです。




 ○FIRフィルタの作成
 fir192.vhdに復調した音声を90KHz以下に限定するLPFが記述されています。このフィルタに逆sinc補正を入れて、先のeqcomp.vhdの内容も
 踏襲します。まずは周波数特性をエクセルで作り出します。今回は4Hz刻みで96000Hzまで24000個のデータを入力しました。
 


 テキストファイルにコピペして
 


 FIRフィルタ係数製造装置に放り込む
 



 周波数特性は↓の通り。逆sinc補正をしているので、高域になると出力レベルがアップします。
 



 細かく見ると↓ 合ってるような狂っているような‥‥
 



 理想特性との差をdB表示すると↓のようになります。今回フィルターの利得を自由に選べなかった(HDLファイル上の)
 どの部分をいじったらL-Rの差音声のゲインをいじくれるのか?だったので、フィルタに利得調整も兼用させた結果
 特性が悪化してレベル偏差が-80dB位あります。
 もうちょっとフィルタの利得が選べれば-90dB程度まで行くおいしい設定もありますが、それは今後の課題かも
 




 こんな↓ファイルが出力されるので、符号付き18bitデータを1行ずつコピーして
 



 fir_coef_192.vhdにペーストします。当初このファイルじゃなくて、よく似た値が記述されているfir192_90_102.memという
 ファイルの方をまさぐっていました。ぜんぜん特性に変化が無く、おかげで丸1日格闘するハメになったという
 ファイル名もいかにもナイキスト周波数192K、90K〜102Kの範囲で変化しますよって感じでそれっぽいし、値もそれっぽいのに‥‥  すげーだまされた(笑)
 


 ここまでやって、セパレーションは1KHz時57.07dB‥‥あれ?なにかおかしい。






 ○セパレーション補償演算部?を無効にする

 他にもセパレーションをいじくっているポイントがあるはずなので、いろいろ可能性のある部分を探してみました。
 上記のフィルタの係数を変えたり‥‥‥

 仕方なく、下流のマトリクス演算部付近を見ると sub channel gain adjust って‥‥‥ え!?
 ナニやっているのかよく分からないけど、ナニかやっているので、とりあえず0.6875dB->0dBに変更してみました。
 



 FMトランスミッタ6.2号機に1KHzRchのみ100%入力 FMレシーバーのRch出力モニターした結果
 



FMレシーバーのLch出力モニターした結果    セパレーションは-4.78-(-89.02)=84.24dB うひょーー やっとここまで来たよ
本当はL-Rの差音声を32770/32768倍するとセパレーションは95dB程度になるのですが、FIRのフィルタ係数をいじくる程度ではもうムリ。
 





 簡易測定した結果は↓の通り。 いゃ もうこの次元まで来るとトランスミッタの性能を測っているのか、FPGA-FMレシーバーの性能を
 測っているのか、どっちなのかよく分からん⊂⌒~⊃。Д。)⊃
 




○ 総括

verilog-HDL駆け出し4日目なので何も分かってませんが、とりあえず変な所を書き換える能力は身につきました(笑)
この調子でがんばって逝きたいと思います。
何か昔を思い出すなぁ  ソフトを逆アセンブルして書き換え+改造しているみたいで‥‥‥‥‥‥え!?


それと、ソースコードを見ていろいろ苦労しているなあと思いました。 switch〜case文だらけでナニやってるんだろうと良く考えてみたら
おなじリソースをある時はAに使ったり次にBに使ったり、時分割で使い回しをしているような様子が見て取れました。
それとバケツリレー方式で演算したり。たぶん高速化のためだと思いますが、傍から見てるとナニやっているのかよく分からん(笑)

セパレーションをいじくろうと今回いろいろ格闘しましたが、プログラム中のいろいろな場所を操作しないと目的とする動作をしてくれませんでした。
という事は、逆に言えば林様がいろいろな手を尽くしてセパレーションの改善を尽しているという事になります。如何にFM関連の装置でセパレーションを
出すのが大変か(;つД`)‥‥‥




さいごに、FMトランスミッタをFPGAで作る能力は取得したかって? いゃ変な所を書き換える能力は身についただけだし(笑)



-----------後日談 林氏にいろいろ(上記ソフト記載許可や本記事内容など‥)聞いた中で正常なフィルタ係数の書き換え方について
言及されていましたので紹介します。

FIRフィルタの係数の変更は、.mem ファイルの内容を変更されるのが、本来は設計データ管理上、正しいやり方です。
.memを更新した上で、FPGA設計ツール DIAMOND で IPexpress を起動し、このROM (fir_coef_192.ipx)を再度、コンパイルすれば
係数が組み込まれたVHDLはその時点で生成されます。

です。まちがってもvhdファイルを直接書き換えないように‥ってやるヤツいないか orz





2016/01/27追記



上記テクニックを内蔵した最新版ソフトが林様からリリースされています。
何でもセパレーションが90dBを超えているようで‥







-------------------------------------------------------------------------------------------------------------------------------
訂正・変更履歴

2014.04.02     初版
2016.01.27 新版ソフトリリースについて追記


TOPページ inserted by FC2 system