2011年5月アーカイブ

ずっとMPEG2の作業ばっかりやっていると、たまに違うことをやりたくなるわけでして。
先週、無性にアートワークがしたくなった時があって、ちょうどあったフリスクの空きケースを見て
思ったわけです。
「神は言っている。フリスクサイズのマイコンボードを(ry」

で、ありきたりではありますが、設計してみました。
フリスクケースに収めれば、携帯オーディオプレイヤーに。普通にピンヘッダつければブレッドボードでも使えそうなマイコンボードに。

使ったマイコンは最近秋月で単品販売を始めたルネサスRX(R5F56218BDFP)です。デコード専用IC等は載せません。
検証してませんが、たぶんRXならソフトウェアデコードできるだろう、と思いまして。

回路図はこちら3枚。
frisk-rx1.sch.sheet1.png frisk-rx1.sch.sheet2.png frisk-rx1.sch.sheet3.png
または→frisk-rx1.sch.pdf

ご覧になると分かるとおり、まだ定数値をTBDにしている箇所が結構あります。
(まだ何にも考えずに作っている証拠ですw)

現時点でのレイアウトも載せておきます。
frisk-rx1.brd.top.png frisk-rx1.brd.bottom.png

なお、今回のマイコンはD/Aが1chしかありませんので、別途D/A (MCP4922)を載せました。
そして、その基準電圧をRXの持つD/Aから出すようにしてみました。MCP4922は
出力段のアンプでゲイン2倍を選べるので、RXのD/A出力を中心に振ることができるうえ、
そのD/A電圧でボリューム調整ができるのでは、と思ったためです。
これでまっとうな音が出るのかは、試してないのでまだ不明です。
※詳しい方、ぜひツッコミいただけると嬉しいです。

とりあえずアナログ部分の試作評価と、ソフトウェアデコードが出来るのかをRX-Stickでも使って検証していきたいと考えています。

今回はMPEG2デコードIPの全体構成についてです。

その前に、まず動画像の基本を軽く解説します。
動画像とは、パラパラ漫画のように複数の静止画を連続して表示することで実現されます。これについてはご存じの方が大半でしょう。この静止画のことをフレームと呼びます。

問題はフレームの情報をどうやって圧縮するかです。1枚1枚をJPEGなどで圧縮すれば良さそうに思えますが、それだけでは圧縮率を上げることが出来ません。
そこで、動画像の時間的連続性を利用します。

動画像では多くの場合、連続する2枚のフレームの間に共通要素があります。シーンチェンジの瞬間を除き、前後2枚が全く別の画像になることは稀で、
・カメラの動きによる背景の移動
・物が動くことによる、一部の画像の移動
・全く変化無し
など、少なからずとも共通点があります。そこで、1枚前のフレームからの差分を用いることで、データ量を減らす工夫をします。

mpeg2mb.png

また、MPEG2ではフレーム内を図のように空間的に分けて取り扱います。16x16ピクセルの領域をマクロブロック と呼び、1つのマクロブロック(MB)は6つの小ブロック からなります。(分かりやすくするために私は「小」ブロックと読んでますが、規格書ではただの "block" と表されています)
小ブロックは 8x8 のサイズで、輝度成分4つと色差成分2つの計6つです。

なお、MPEG-2規格そのものについては書き始めるときりがないので、当ブログではあまり詳しく解説しません。
その代わり、
・「MPEG Video 技術」 http://home.catv.ne.jp/dd/pub/book/mpeg.html
・規格仕様書「ISO/IEC13818-2 Information technology -- Generic coding
of moving pictures and associated audio
information: Video」
などが参考になります。規格書は本来無料で手に入るものではありませんが、ドラフト版ならばネットで探せば手に入ります。
(大学の理工系図書館や、けいはんなの国立図書館なら正式版を読めるかと思います)


ふぅ、導入だけで書き疲れてしまいましたが、ここから本題のIP構成です。

mpeg2blocks.png

青色の枠が自作するモジュールです。

vctrl ・・・ 入力したビットストリームを解析し、デコードの必要な情報の取り出しと、画素データをrun&lengthペアに分解するところまで行います。run&lengthペアとは、量子化されたデータから、非ゼロの値と、その間にあったゼロの個数とをペアで表したものです。8x8の小ブロック単位で取り扱うので、最大64項目あります。

vdequant ・・・ run&lengthペアと量子化係数を用いて逆量子化を行います。vdequantを出る時点で、各ブロックのデータは8x8の周波数領域画素データになっています。

vidct ・・・ 8x8のIDCT(逆離散コサイン変換)を行います。vidctの出力は、8x8の空間領域画素データになります。

vmc ・・・ 動き補償を行います。前述の通り、MPEG2では直前のフレームとの差分を用いるので、前フレームの参照MBを計算し、vidctからの画素データを足し合わせて、最終的な画像を作ります。作った画像はフレームバッファにいったん格納します。

vdispdrv ・・・ 1枚のフレームをすべて処理し終わったあと、フレームバッファから画像を読み取ってLCDに転送します。

ざっとこんな感じ。すでに全てのモジュールを書き終えていて、単体でのデバッグを進めている段階です。

さて、次回はもうちょっと詳しい内容に踏み込んで書こうと思います。今日はここまで。

このアーカイブについて

このページには、2011年5月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2011年4月です。

次のアーカイブは2011年8月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 6.1.2