TMS 320C6711 D S P (2007.10) |
最近、何を血迷ったのか、DSPをいじりたくなってしまいました。以前から、いつかは遊んでみようと準備だけはしていたのですが、なかなか手がつかずじまいだったのです。思い立った動機としては、最近、汎用PCでSDRができる様子を見るにつけ、動作はどうなってるのか興味は尽きないのですが、私にはWindowsソフトはまったく歯が立たないので、他の手段で、少しでも信号処理の雰囲気を味わいたいと思ったからです。
一般にデジタル信号処理の本(学術系?)を見ると、殆どが、Z変換に始まって、FIR/IIRフィルタ、FFT/IFFTといったデジタル信号処理っぽいアプリケーションの数学的な記述がメインです。まぁ味も素っ気もなくて、これからして、足を踏み入れるには敷居が高いカンジで一杯ですね。なまじ読み始めても途中下車はあたりまえ、よしんば最後まで読んでも、最初の方はおろか、10ページ前の記述も覚えて無いという情け無い状況です。これらの教科書的な本を読んでも、実際の感覚はほとんど掴むことができません。FFTなんて、実際にシミュレーションで周波数帯域の変形お遊びをやって、IFFTで時間領域に引きもどして、波形はこんな影響を受けるのか・・・と実感しない限り、身につくことは無いでしょう。大学の教科書としてなら数学的に厳密なのは歓迎されましょうけど、「趣味で遊ぶ」には、あまりにも遠いところにあるカンジがします。
一方、実際にDSPを動かしたり、PC上のシミュレータを動かしてデジタル信号処理もどきの体験をする事を目的とした本はCQ出版から多く出されています。
ここに挙げた、TR技術誌2002年10月号(右上)がTMS320C6711のDSKを中心に解説したもの、C言語によるディジタル信号処理入門(右下)も同じくTMS320C6711DSKと簡単な信号処理の解説、Scilabで学ぶ・・・・(左上)はPC上のMATLAB系のフリーのシミュレータScilabの活用本、初めてのDSP活用大全(左下)はTR技術誌2002年10月号の中身をベースにTMS320C6713にバージョンアップしたものです。
いずれも、数学的な厳密さよりも、初心者がDSPを使って、実際に動作させながら、DSPってどんなものか体得するためのガイド本なのでしょう。これらの本を、初心者というかDSPを初めていじる私の観点から見てみましょう。
【TR技術誌2002年10月号(右上)】
DSKの解説に力を割いている。そのぶん、DSP自体の応用に関しては、雑誌の特集という制限もあってか、手薄気味。簡単な音響処理とFIRフィルタ、あまり使うことはないと思われるDSPのI/Oについての実例がありますが、全体的に魅力的な「できること」の例示が少ないのは、ページ数の制約上仕方がないのかもしれません。
【C言語によるディジタル信号処理入門(右下)】
これは、DSKの解説のあと、多くの応用事例が続きます。AM/FMの変調/復調の事例もあり、「なるほど、DSPでやると、こんなプログラムでこんな動きをするんだ」と実感できる事例が多いので、オススメの本です。
【Scilabで学ぶデジタル信号処理(左上)】
Scilabというシミュレーションツールを使って、Z変換からディジタルフィルタまで、DSPを使わなくてもPC上で信号いじり(←「信号処理」というにはあまりに??)が堪能できます。簡単な数式しか使っていませんが、説明が適切で、物理的なイメージが掴みやすいと思います。中身は簡単なのでScilabは例題の1/4くらいしか実行させてみませんでしたが、じっくりやれば初めて身につくものは多いと思います。
【初めてのDSP活用大全(左下)】
これはTR技術のバージョンアップ版で、C6711をいじり終わったら、すでに入手したC6713スタータキットに使おうと思っています。ざっと読んだだけですが、いずれは役に立つはずです。
ということで、この程度の本をひととおり読んで、実際の例題プログラムをにらんで、自分の頭がDSPになったつもりでソースを追えば、かなり「DSPが見えてくる」ことは確かです。
こいつはテキサスインスツルメント(TI)社のTMS320C6711というDSPを搭載したスターターキットです。もう4年以上も前に入手してあったのですが、ずーっとデッドストックになっていました。購入当時、あるいは時々思い出したようにヘルスチェック(動作確認)だけはしていたのですが、それ以上は進めず、手をこまねいていました。
写真の左端の25PinDSUBコネクタでPCのレガシーパラレルポートに接続されます。今となっては、パラレルプリンタポートなんてついているPCも少ないでしょうから、使える環境からして制限されることになってしまいます。I/OはAD/DAと4ビットの入出力があります。CPUクロックはたったの150MHz、AD/DAのサンプリング周波数は8kHzですから、主に「電話回線」レベルの帯域(0-4kHz)の信号処理しかできないことになってしまいます。どうもこのサンプリングクロックは固定されているようで、DREAMを始めとしたSDRソフトのような48kHzサンプリングは、このままでは無理のようです。バッファリング用のSRAMは4Mワード(32ビット幅)でプログラム用のFROMは128kBですので、勉強用には十分です。
これはDSPのTMS320C6711です。中身はTIのサイトをあたっていただくとして、もう2世代以上前のDSPらしいですが、浮動小数点演算ができる、ソフトが書きやすい奴です。なんせ演算にスピード以外の制限が殆どありません。一方、PCの世界では、今となっては、デュアルコアのチップもまったく普通の存在で、汎用PCのCPUの処理能力がP-Wのクロック換算で6GHzとかいう時代ですから、どうあがいてもこんなちっぽけなDSPは勝てそうにありません。現に、DREAM等のSDRソフトの演算量をこいつでやれと言っても逆立ちしてもできないでしょう。でも、こいつを使えば、C言語の簡単な記述で、実際のDSP処理が体験できます。まぁ、本当に勉強用の域を出ませんがね。
DSPといえば、TIのお家芸のような感じがしますが、アナログデバイセズもいい味出しているようです。通称Blackfinと呼ばれる高速の16ビット固定小数点DSPもあるようですが、素人がいじるには資料が少ない(解説本が少ない)ような気がします。判りやすい資料の多さではTIのDSPが一番のようで、仕事とかでいじったことの有る人ならともかく、まったくのド素人の私はTIに向いてしまいました。
上はCode Composer StudioというDSP統合(開発)環境でスターターキットに付属のものです。プロジェクトでソース、インクルード、リンクコマンド、リセットベクターの各ファイルを管理します。一連のDSPの操作、ファイルエディットが使いやすく統合されています。
ソースファイルを表示してありますが、これはAM変調のプログラムです。C言語で書いてあって、中身は本当に単純です。IIRフィルタで正弦波を作るパートと、A/Dから入力された変調信号をAM変調の数式どおりに演算して、D/Aに吐き出すだけの記述です。あっけないほど簡単です。
実は、ここにたどり着くまでに大きなバリアーがあるのではと思います。というのは、上記の体験本では、DSPのヘッダーファイルや、リンクコマンドファイル、リセットベクターファイルなんていう、呪文のような「わけわかんねー」中身の説明が延々と続くので、普通の神経の人なら、まず十中八九はここで挫折します。肝心のDSPを動かす前に参ってしまうのです。私もこの類(たぐい)で、いままでヘルスチェックしか動かせていませんでした。しかし、実際、ここまでたどり着くと、「なんだぁ、DSPって数式どおりに動くし、C言語で書けば、ソースの記述も簡単だ」と自然に気がつきます。
要は、A/Dで取り込んだデータをサンプリング周期の間(次のA/Dのデータがreadyになるまでの間)に、必要な処理をしているだけのことみたいです。8kHzサンプリングなら125μS、48kHzサンプリングなら20.8μSの間に全ての処理を終えて、その繰り返しを延々と行う・・・・こいつがリアルタイムなDSPの動きのようです。 だとすると、一般のプログラムに比べて随分と単純な構造に見えます。
これは、先のAM変調のプログラムをRunさせて、A/Dから上図右の200Hzの変調用正弦波を入力し、キャリアを1.5kHz(元プログラムは2.5kHz)として、AM変調信号を計算し、D/Aに吐き出し、PCに取り込んでFFTでスペクトルを見たものです。信号発生、周波数解析とPCのオーディオボードの扱える領域なら、最近はフリーなツールがそろっていて、何をするのも大変便利です。
さて、これからは、なにか自分でプログラムを書いてアップできるように努力したいと思います。最初のターゲットはSSB/CWの検波かな??
<SSB変調復調=周波数変換> 【2007.10.27】
DSPに少し興味を持った無線屋が必ず通る道があります。そう、SSBの変調と復調をやってみたいというところでしょう。私も御多分にもれず、すこし調べてみました。すると複数のサイトで実験例が見つかりました。いずれも精力的で、大いに勉強になりました。DSPの種類は違うのですが、酔漢さんの検討には目からうろこの感でした。
一方、教科書を読んでいくと、「C言語によるディジタル信号処理入門」三上直樹先生著 に「解析信号による周波数変換」という項目がありました。耳慣れない表現ですが要はI/Q直交信号処理のことで、複素信号を用いた周波数変換ということのようです。周波数変換と銘打っているのですが、これは良く見るとSSB変調そのものです。入力信号(Fi)からキャリア信号(Fc)を使ってUSB(Fc+Fi) or LSB(Fc-Fi)を作る演算だからです。 この本のp189の図を下記に転記させていただきます。
要はフェージングタイプのSSBジェネレータと同じですね。 信号入力とキャリアを複素信号化するための90度位相器をつけて、DBMで乗算して。最後は加算して一丁あがりです。この方式は大昔からあるSSB発生方式で、アナログ時代は、フェーズシフトネットワークにどえらい注力をしないと良好な特性が得られず、また、長期安定度もメロメロだったというのが私の認識です。もちろん、簡易化したネットワークではオハナシになりません。こういったモノは、DSPでやる格好の材料です。なんせ、数式計算に経年変化はありませんから、デジタルで処理している部分は特性変化が起きません。
キャリアはDSP内部でIIRフィルタを用いて生成しているようです。
入力信号スペクトラム
上の図はトランジスタ1石のOSC回路で約1kHzを発振させたときのスペクトラムです。一石のOSCでどこまで高調波が減られられるか遊んでいたときの残骸ですが、今回、入力信号として採用してみました。第2高調波が-45dB近くまで落ちているので、まぁ使ってあげてもいいかもしれません。ただ、どうもキャリア周辺の位相雑音特性が良くないのか、-100dBとかいう領域ではスペクトラムが広がっていますが、これは愛嬌です。
DSPで処理する場合、二個の乗算と加算はC言語で書けば一行です。問題は90度位相器です。原本でもヒルベルト変換器をFIRフィルタで作っていますが、私も、まずはこれを採用しました。なんせ、サンプリング周波数が8kHzで、処理できる帯域が4kHzですから、まだまだ遊びの域を出ないし、ヒルベルト変換の次数も少なくて済むだろうと考えたからです。(Fsが48kHzとかになるとちょっと厄介) また、キャリアの移相には単一周波数なので本当に簡単なヒルベルト変換器で済むはずですが、面倒なので、入力信号の移相器のパラメータをそのまま使いました。
ヒルベルト変換器の設計ですが、デジタルフィルタの設計には、もうこれ以上のものは無いのでは?と思うほど便利なツールが、三上先生から提供されています。上記の本の付属のCDの中にある設計ツールです。下記のように、素人には殆ど不自由無くデジタルフィルターの設計がオートマチックに設計できる、超スグレモノです。下記は手はじめに40次で計算しています。
ヒルベルト変換器(次数=40)
0.3-3.7kHzの間で振幅偏差は0.029dB(上記の図ではスライダーの陰で見えませんが)となっています。こんな移相器はアナログでは逆立ちしてもできませんね。んでもって、これで1kHzのトーン信号をDSPにぶち込むと下のようなスペクトラムが得られます。
実は、このスペクトラムは入力信号のDC除去の処理が入っていません。オリジナルのプログラムには、このDC除去のルーチンが書かれておらず、ここで悩んでしまいました。というのも、オリジナルの例ではキャリア抑圧が-35dB(主信号-5.2dB-残留キャリア(-40.3dB))くらいなので、いかにもアナログのPSN変調器と同じじゃないか・・・・・という訳だからです。逆サイドバンドはとりあえず-60dBくらい取れているので、ヒルベルト変換の次数を上げれば、まだまだ下がる・・・・とは踏んでいました。
変調器出力(DC除去無し)
散々、キャリア漏れの原因に関して考えてみたのですが、本の中でも、TIのDSPに付属しているA/Dには残留DCが有るとの記述を見つけて、これが原因に違いないと踏んで、DC除去を考えてみました。DC除去方法はいろいろあるのでしょうが、これも0.-3.7kHzのヒルベルト変換器の15次のものを使ってみました。本当にDCを除去するだけですから、BPF特性の得られるフィルタならなんでも良いのではと思います。
変調器出力(DC除去有り)
ということで、キャリアもれはまったく無くなりました。-100dB以下で見えません。次はサイドバンドサプレッションの変化をみてみます。
変調器出力(DC除去有り、次数=30)
上の図はヒルベルト変換の次数を30次に減じてみました。結果、サプレッションは43.7-4.9=38.8dBとかなり悪くなりました。
変調器出力(DC除去有り、次数=50)
それではということで、次数を50にアップすると、71.1-7.6=63.5とちょいとアップしましたが、ドラスティックじゃありません。いっそ100次くらいまで上げようかと思いましたが、踏みとどまって70次で計算して、実際に計測したのが下図です。
変調器出力(DC除去有り、次数=70)
おー、ついにノイズレベル以下です。すごいですねぇ。ディジタルのすばらしさを感じることができます。なお、出力信号レベルは左上にデシベルで示されていますが、測定日が違うと、少し変動しています。これは、入力信号が1石のOSCで歪レベルを下げるために、測定毎に帰還量をVRで調整していて、出力レベルが変わっているからです。DSP処理ではこんな変動はしません。
一番右の-90dBあたりのスペクトラムは、周波数的にはFc-2Fi(逆サイドバンドので入力の二倍の高調波)の通過帯域(4kHz)からの折り返しのように見えます。 通過帯域が4kHzの中でSSB生成をしているので、こんな話になりますが、次のステップでは48kHzサンプリングでキャリアは12kHzに置こうと思っているので、適切なフィルタリングで無くなると思います。
サイドバンドサプレッションとヒルベルト変換次数
上の図はヒルベルト変換の次数VSサイドバンドサプレッションをグラフにしてみました。参考までに。
また、最終のCのプログラムを下に示します。三上先生オリジナルのプログラムをおおいに利用させていただきました。本当にいい勉強になりました。
Cのプログラム
これから下は次のネタ用です。48kHzサンプリング時のキャリア用移相器と信号用移相器の計算例ですが、信号用移相器の次数が大きくなる(あたりまえ)のでインターポーレーターとか複素フィルターを用いたりとか、処理の方法を考えないと時間オーバー(なんせ20.8μS内に処理しないといけない!)になりそうなので。変調処理だけでこんなにステップを使ったら、(多分できるはずですが)、如何にももったいないという気はしています。