2009年6月28日日曜日

FMトランスミッタ: プリエンファシス(1)

1.あらまし
 FM変調方式の受信機の音声出力の雑音スペクトラムは、周波数に比例して高音域ほど大きくなるので、高音域ではS/N比が悪くなってしまいます。このため、あらかじめ送信機(放送局)で高音域の変調度を強調(プリエンファシス)しておき、受信機では逆特性(ディエンファシス)を持たせています。この操作により送受を通した音声信号の周波数特性はフラットになりますが、受信機で発生する雑音はディエンファシスされた分だけ下がるので総合的なS/N比が改善されます。

 送信機(トランスミッタ)では、プリエンファシスを実装して高音域のレベルを持ち上げることになり過変調が心配です。これは、人間の声や自然界の音には高音域のエネルギー分布が少ないから問題なし、ということになっているものの、現代の音楽ではシンセサイザー楽器が多用されていることもあり高音域までそれなりの信号が出ています。このため、FM放送用の音声リミッタ(メジャーどころではOrban社OPTIMODなど)はプリエンファシス特性を考慮したものが使われています。


2.プリエンファシス特性
 プリエンファシスの周波数特性は、次式によります。


ただし τ: プリエンファシスの時定数


 日本やヨーロッパのFM放送の時定数は50μs。アナログテレビ放送の音声やアメリカのFM放送では75μsと決められています。

 ※初めてMicrosoft Office付属の「数式エディタ」を使いました。これ便利。
   今まで無理矢理ワープロ打ちしていたのは何?って感じ。



理想的プリエンファシス特性
1kHz基準の場合








 上のグラフは、プリエンファシスの式をもとにエクセルで描画させたものです。便宜上1kHz基準にしてあります。100Hzで約-0.4dB、15kHzでは約13.3dBの周波数特性を持っています。


3.プリエンファシス回路 ディスクリート部品によるプリエンファシス回路としては、抵抗とコンデンサ、抵抗とコイルの組み合わせたものがあります。
                        



プリエンファシス回路(a)













プリエンファシス回路(b)









 FMトランスミッタのキットなどでは抵抗とコンデンサを組み合わせた(a)の回路がよく使われています。一方、(b)の回路は安藤電気のステレオ信号発生器で使われているのを見たことがあります。確かにコイルの方がコンデンサよりも経年劣化要素が少ないのかもしれません。






新日本無線 ステレオモジュレータICNJM2035のプリエンファシス回路
まだ現役なんですね












ローム ワイヤレス・オーディオリンク ICBH1417のプリエンファシス回路

プリエンファシス回路はオペアンプのフィードバック回路に組み込まれています。内部の22.7kΩと2200pFの組み合わせで約50μsの時定数を得ています。

2009年6月21日日曜日

FMトランスミッタ用 入力ローパスフィルタ(6)

7.作成したローパスフィルタの評価
 せっかくなので周波数特性を実測してみます。PCにUSBオーディオを接続し、WaveSpectraを立ち上げます。まずは動作確認として、USBオーディオの入出力を直結して周波数特性を確認。




USBオーディオの周波数特性
0-24kHz、2dB/div
(サンプリング周波数48kHz)





 10kHzくらいからだらだらとハイ下がりになっています。こんなものなんですかね。6年前に買って放置状態のUSBオーディオなのでひょっとすると何か劣化しているのかも。しかも0.5dB範囲くらいでウネウネしています。これは、A/D、D/Aコンバータ内蔵のデジタルフィルタの特性かな。手持ちはこれしかないので仕方ないです。

 それではローパスフィルタの実測値です。



ローパスフィルタの周波数特性
0-24kHz、20dB/div






 いちおう、それらしい特性に見えます。




ローパスフィルタの周波数特性
0-24kHz、2dB/div



 


 通過域の特性は、USBオーディオの単体特性と比較すると、リプルがより目立つようになりました。差分を考えれば、0.5dB程度?と言えるかな。




ローパスフィルタの周波数特性14-20kHz、20dB/div





 阻止域の特性は、19kHz60dB以上を確保できています。

8.実験風景




実験風景
(左)DDT誌 デジタルFMステレオチューナ
(右)デジタル処理型FMトランスミッタ
    (開発中ですが・・・)







写真は、トランスミッタとチューナを縦続接続しているところです。
ローパスフィルタの特性は、トランスミッタ(DWM誌2007.7付録のSpartan3E FPGAボード使用)に実装した音声コーデック(Cirrus Logic, CS4270)を通して測定しました。


9.まとめ なんとか所期の仕様を満たすものを作成することができました。本当は、一からHDLを書くつもりでしたがどうにも動作周波数を上げられず、自分のスキルのなさを痛感しました。そこでCoreGenの力を借りた訳ですが、適当にやれば動くだろうと期待したところ、そんなことはありませんでした。まず自分のコードの書き方を疑い、シミュレーション波形とにらめっこして最終的にはなんとか動作させることができましたがかなり遠回りをした気分です。今回得た教訓は「原因は、よくわからないと読み飛ばしたところにある」です。


2009年6月20日土曜日

FMトランスミッタ用 入力ローパスフィルタ(5)

6.VerilogモジュールでFIR Compilerを使う
 次は、作成したデジタルフィルタをVerilogモジュールから使ってみます。このコンポーネントをインスタンス化するためのHDLテンプレートは、ISEのSources for ペインで作成したデジタルフィルタを選び、Processペインで View HDL Instantiation Templateをクリックすると表示させることができます。このテンプレートをVerilogモジュールにコピペすることでデジタルフィルタを使うことができます。




インスタンシエーション テンプレートの表示














デジタルフィルタの入出力タイミング
今回は2チャンネル分として設定








デジタルフィルタへの入力
 フィルタコアが新たなデータを受け入れ可能な状態になった場合に、RFD (Ready For Data) がHとして出力されます。そのとき ND (New Data) 入力にHをセットすると、システムクロックの立ち上がりエッジでCHAN_IN (Input Channel Select) の状態に従ったチャンネルに音声データが取り込まれます。CHAN_INはデジタルフィルタの出力端子ですが、初期値はCoreGenの設定で指定できます。


デジタルフィルタからの出力
 出力が確定した段階で、RDY (Ready) がHとして出力されます。そのときの出力チャンネルはCHAN_OUT (Output Channel Select) で知ることができます。


 さて、Verilogモジュールからの使用例ですが、Verilogの教科書を片手に書いたもので、お見せできるレベルではないですが私の作成例を示します。

 詳細は説明しませんが、最低限入出力関係について・・・
  • DIN1, DIN2: オーディオ入力、152ksps、24ビット 、2の補数形式
  • DOUT1, DOUT2: オーディオ出力、152ksps、24ビット 、2の補数形式
  • EN: サンプルタイミングパルス入力、152kHz、パルス幅はシステムクロックの1クロック
  • CLK: システムクロック入力、38.912MHz
  • RSTn: リセット入力、負論理



モジュールのポート宣言部分と
音声入力バッファ



















FIRフィルタへの音声入力




















FIRフィルタの音声出力
















ブログに貼り付けるとタブやスペースが消えてしまうのであえて画像としました。
あと、シミュレーション波形です。タイミング関係がわかりやすいと思います。




Verilogモジュールのシミュレーション波形










2009.7.13追記
ここで紹介したVerilogコードには、クロックのダブルエッジを使うなど正しくない記述が含まれています。おいおい直していきますが、ご覧になるときには鵜呑みにせぬようご注意ください。

2009年6月19日金曜日

FMトランスミッタ用 入力ローパスフィルタ(4)

5.FIR Compiler CoreGeneratorのFIR Compilerを使ってデジタルフィルタを作成します。



New Source Wizardを起動
Sources for のペインにて右クリックし、New Sorceを選びます。













ファイルを作成

IP(CORE Generator & Architecture Wizard)を選んでおき、新規作成するIPコアのファイル名(ここでは"LPF15KFIR")を指定します。














IPコアの選択
ジャンル別に分かれています。FIR Compiler は Digital Signal Processing - Filters にあります。












FIR Complilerの設定(Page1)















  • Load Filter Coefficients(COE File)
Coefficents File: BrowseをクリックしてCOEファイルを指定。
  • Filter Specification
Filter Type: 入出力のサンプルレートが同じため Single Rate
    Number of Channels: 2 ステレオなので
  • Frequency Specification
Input Sampling Frequency "0.152"
    Clock Frequency 今回は"38.912"

    1サンプルあたりシステムクロックが何クロックあるか、からFIR Complilerが
    ハードウェア構成を検討します。
    指定した周波数での動作を保証してくれるわけでありません。

    ※上の例では1サンプルあたりシステムクロックは256クロックになります。
      フィルターコアが新たなデータの受け入れ可能であることを示す RFD (Ready For Data)
      フラグの出力周期もこの設定で決まります。
      私は当初、クロック周波数77.834MHzと設定して38.912MHzで動作させたところ
      RFDが最初の1回しか出てこず、訳がわからず1週間悩みました。
      わかってしまえば馬鹿馬鹿しい話です。





FIR Complilerの設定(Page2)
















  • Filter Architecture
フィルタのアーキテクチャの指定です。なんだかよくわかりませんがデフォルトの
    Systolic Multiply Accumulateとしときます。

  • Coefficient Options
Coefficient Structure: Symmetric 係数の構造です。対象なので。
    Coefficient Type: Signed。係数は極性あり。(2の補数)
    Quantization: Quantize Only
             係数の取り扱い方法。係数は実数なので、FIR Complilerの演算の都合上、
             2進数に量子化します。Quantize Onlyは単なる丸め処理。
             Maimize Dynamic Rangeは、係数の最大値が所定のビット幅を使い切るよう
             スケーリングしてくれるようです。
             桁取りがわかりにくくなりそうなのでQuantize Onlyで行きます。
    Coefficient Width: 18
             係数のビット幅。FPGAの18×18ビットのビルトイン乗算器が使われることを
             想定しています。数字を増やせば精度があがりますが、
             乗算器がたくさん消費されます。
    Coefficient Fractional Bits: 19
             係数の小数点位置。自動的にセットされます。

  • Datapath Options
Number of Paths: 1
             同時処理するフィルタ数。1なら2つのチャンネルを時分割処理となり、
             2とすればフィルタが別々に作成されます。
    Input Data Type: Signed
             入力は極性あり。2の補数フォーマット。
    Input Data Width: 18
             入力のビット幅。係数と同じ理由で18としました。
    Input Data Fractional Bits:0
             単なる情報扱いのため、入力不要です。
    Output Rounding Mode: 出力ビットの丸め方を指定します。
             "Full Precision" 以外を選べば、出力ビット幅を指定できます。
    Output Width:24 出力のビット幅です。

  • Filter Response Analysis
この項目に適切に数値をセットしておけば、Frequency Responseタブの
    周波数特性グラフで、通過域および阻止域の特性数値が表示されます。
    単に表示のためのだけに使われているもようです

    Passband Range: 0.0 - 0.2
    Stopband Range: 0.25 - 1.0

    今回はサンプリング周波数152kHzで通過域が15kHzまでで
    15k/152kHz ≒ 0.1。阻止域は19kHz以上で 19k/152k = 0.125です。
    単位は[π rad/sec]なので、それぞれ2倍すると上記の数値になります。





FIR Complilerの設定(Page3)















  • Optimized Goal: Area
最適化の方針を決めます。Speedは速度優先。デフォルトのAreaは(チップ上の)エリア最小。
  • Control Options: デフォルト通り
入力データが有効になったことをフィルタコアに知らせる ND (New Data) ピンをセットします。
  • CHAN_IN Options: デフォルト通り
CHAN_INの初期値をセットします。
  • Memory Options: デフォルト通り






FIR Complilerの設定
Frequency Responseタブで、読み込んだ係数の周波数特性が表示されます。
このグラフ、周波数軸の表示が独特ですが1.0が0.5fsということになります。このレポートによると通過域のリップルが0.18dB、阻止域の減衰量は-61.4dBだということです。

2009年6月17日水曜日

オーディオアナライザ

 アンプやフィルタなど音声信号を扱う製作モノが完成したら特性評価をしてみたくなります。オーディオアナライザは、信号発生器とレベル・周波数・歪み率などの解析機能が一体化された専用測定器で、市販のものは入力信号のレベル範囲や周波数範囲が広いなど使い勝手に優れていますが非常に高価です。ところが最近ではPCのサウンド入出力機能を使ってソフトウエアで同様の機能を実現するものがフリーで入手できます。(でも、さすがに測定器ではないのでレベルは相対値だけで絶対値の測定はできません)

 有名どころとしては、RightMark Audio AnalyzerWaveSpectra でしょうか。RightMark Audio Analyzerは、たとえばアンプの性能評価など決められた測定をワンクリックで行いレポート化するような用途を想定しているようで、特定の周波数をクローズアップして観測するような細かな測定には向きません。それに対し、WaveSpectra(スペクトラムアナライザ) は無骨な感じでワンクリックで測定を実行するといった易しさはありませんが、必要な設定項目が豊富でかゆいところに手が届き好印象です。WaveGene(信号発生器)と組み合わせて、周波数特性も測れます。そういえば作者のefu氏には以前、WaveDAT(DDSドライブで音楽DATテープを再生するソフト)でお世話になりました。




RightMark Audio Analyzer














WaveSpectra
音楽信号を測定中














WaveSpectra
USBオーディオの周波数特性














WaveGene
周波数特性測定のためスイープ信号を発生中。

2009年6月13日土曜日

FMトランスミッタ用 入力ローパスフィルタ(3)

4.COEファイルを作成
 XilinxのISEでデジタルフィルタを作成するには、係数をHDLソースにベタ書きするか、CoreGenで作成したROMの初期値として係数を読みこませ、デジタルフィルタ処理を行うモジュールから呼び出すのが王道・・・?ではないかと思います。
 この半月ほど、チャレンジしてきましたが、デジタルフィルタ処理のモジュールでどうやっても所要の速度が得られず挫折。仕方ないのでお勉強にはなりませんが、CoreGenの力を借りることにします。デジタルフィルタは基本的な処理なので、標準で登録されています。




"FIR Compiler v4.0"
オーバサンプリングやダウンサンプリングにも対応しています。今回は、入出力のサンプルレートは同一にしました。










"FIR Compiler"を使うには、フィルタ係数を記録したCOEファイルを作成しておく必要があります。ちなみにCOEファイルはROMを作成するときにも使われますが微妙に中身が異なります。




"FIR Compiler"でのCOEファイルフォーマット
拡張子がCOEでテキストファイル形式です。coefficient_radixは、係数の基数を指定します。係数が2進数、10進数、16進数のとき、それぞれ2、10、16となります。






 設計ツールから書き出した係数データは"TIフォーマット"でしたので、適宜整形します。エディタやエクセルにコピペして手を加えてCOEファイルを作成しました。





COEファイルを作成

2009年6月12日金曜日

FMトランスミッタ用 入力ローパスフィルタ(2)

3.FIRフィルタの設計
 書店で参考書を探したところ「ディジタル信号処理による通信システム設計」が目にとまりました。簡単なフィルタ設計ソフトがついています。これを使えば、理屈を理解していない私でも仕様を指定するだけでフィルタの係数を計算することができました。
 最近では、ウェブ上でデジタルフィルタの設計ができるサイトもあります。便利ですね!




FIR設計TOOL
周波数特性プロット結果を見ながら、適宜パラメータを変えてみます。















振幅周波数特性
フィルタ特性を急峻にするほど、通過域のリップルが増え、阻止域の減衰量が悪化します。タップ数を増やせば改善できますがハードウェアの規模も大きくなります。タップ数を変えずに必要な特性に近づけるよう試行錯誤します。












トランジェント特性
インパルス、ステップ応答です。中心から左右対称な波形になっています。FIRフィルタの係数は、インパルス応答と同じなので、作成した係数も中央部の係数は大きく、最初と最後は小さくなっています。









 作成したフィルタの周波数特性は、15kHz(正規化周波数0.1)で約0.2dB、19kHz(正規化周波数0.125)で60dB程度です。パラメータを細かく触ればさらに追い込めそうですが適当なところでストップ。まあスペック的には十分に思えます。ここでフィルタ係数を書き出します。このソフトの出力は「TIフォーマット」で、XilinxのISEに読み込ませるには少し手を入れる必要があります。




係数の計算結果

2009年6月7日日曜日

FMトランスミッタ用 入力ローパスフィルタ(1)

1.あらまし
 FMトランスミッタを経由して音楽を聴く場合、ラジオのステレオインジケータが点滅して一時的にステレオ受信できなくなってしまうことがあります。この理由としてはだいたい2つあります。

  • プリエンファシスによって高音域のレベルが持ち上がり過変調のためFM復調できなくなる。
  • 音楽に含まれる高音成分がステレオパイロット信号に干渉し、ステレオ復調できなくなる。

 前者の対策は、プリエンファシスを考慮したコンプレッサ/リミッタを作ることになりかなり難しそう。こういう処理はMultiMaxSound Solution等のソフトに任せるとして、今回はデジタルフィルタのお勉強をかねて、後者にチャレンジしてみます。
・・・記事が途中で止まった場合、挫折した、と察してください。


2.要求仕様
(1)FM放送音声の最高周波数
 CDなどの音楽ソフトでは、20kHzを越える周波数帯までを再生することができます。ところが、FMステレオ放送のパイロット信号は19kHz。ちょうど周波数帯が重複するので、この周波数の音声信号を除去するローパスフィルタが必要になります。

 FM放送音声の最高周波数は、総務省令で定められており最高15kHzということになっています。また、総合周波数特性としては、電波法の無線設備規則で理想プリエンファシス特性曲線からの偏差として規定されています。(ネットでは特性図が見れませんね。電波法令集を買うしかない?)

  【総合周波数特性の許容偏差】
  50Hz: 0~-3dB
  100Hz ~ 10kHz: 0~-2dB
  15kHz: 0~-3dB

(2)パイロット信号
  FMステレオ信号では、メインチャンネル(L+R)の最大変調度は90%、19kHzパイロット信号は10%一定です。メインチャンネルとパイロット信号のレベル差は少なくとも19dBあります。パイロット信号に影響を与えないために必要なレベル差がどれだけなのかよくわかりませんが、仮に10分の1まで許容されるなら加えて20dB低減しなくてはなりません。さらに、プリエンファシスで高音域が持ち上げられる(15kHzで13.6dB)ことを考えると、

  19dB + 20dB + 13.6dB = 52.6dB

をフィルタで低減させる必要があります。


(2)ローパスフィルタの仕様
 どの程度の規模が妥当なのか見当も付かないので、とりあえず目標とする仕様を決めます。

  • フィルタタイプ: FIRフィルタ
  • タップ数: 128
  • 入力サンプリング周波数: 152kHz
  • 出力サンプリング周波数: 152kHz
  • 入力ビット幅: 18bit
  • 出力ビット幅: 18bit
  • 通過域: 0~15kHz(リプル0.5dB以下)
  • 阻止域: 19kHz(減衰量50dB以上)


2009年6月5日金曜日

ISE Design Suite 11

 Xilinxから2度もリリース案内が届いていたので、意を決してISE10から乗り換えました。
確かにデザインや細かな操作に変更があります。とはいえ私は初心者。表面的な機能しか使っていませんので困るほどではないですが、私にとっては、論理合成レポートの「Maximum Frequency」が厳しい、またはより正確になったように感じます。
 以前から取り組んでいるFMトランスミッタでは、外付け水晶発振器の信号をSpartan3EのDCMで、てい倍してシステムクロックとして使用しています。以前は、論理合成レポートの「Maximum Frequency」表示はDCM出力をのシステムクロックとして扱っていたような感じですが、ISE11ではDCM入力を見ているようです。ISE11に変えたところ、「Maximum Frequency」が急に低くなってしまったのでびっくりしました。
 しかもクロック関係の記述を整理したところ、レポート結果は最大9.6MHz。しかし外部クロック周波数は12.288MHzなので逆転です。普通なら動かないところ、いちおう動いています。これは偶然動いているのか、レポートに誤差があるのか(前者かな?)、どの記述がボトルネックになるのか知ることができれば良いのですが、見方がわかりません。それに本来は制約をきちんと指定してあげないと、正確な表示がでないでしょうし、適切ではない設計だとやっぱりダメ?。うまく行きません。課題は多いです。













インストールしたのは、無償のWebPackです。Web Install Clientからインストールしました。

2009年6月1日月曜日

コガタスズメバチの巣

変わった形ですね。徳利を逆さに吊したかんじ。市役所に相談したら、直ぐに取ってくれました。
なんでも、まだまだ若い巣だそうで女王バチが幼虫を育てている状態だそうです。
幼虫(働きバチ)が生まれると、くびれた入り口を壊します。
そしてさらに巣を大きくしていって、あの縞模様の巣を作っていくそうです。

この巣、見た目とのわりにヤワらしく、棒でつつくと簡単に壊れます。