2014年12月6日土曜日

ZYBO 12 ( I2S コントローラの作成 3 )

久しぶりに、DFT IPのCモデルを使ってみた。 このCモデルは前回DFT IP作成時に作ったもので、DFT IPのアルゴリズムをC言語で実装したものだ。 アルゴリズムと言っても、DFT(離散フーリエ変換)の式を展開(変形)しただけのものだが。 (アルゴリズムの詳細は2012年10月27日のブログに書いてある。)

Cモデルはwav形式のファイルを入力として与えると、その内容をDFTして結果をテキストファイルで出力する。出力形式は5種類を指定できるようにしていたが、今回新たにlog形式を追加した。

このアルゴリズムは1サンプル毎にスペクトル列を生成できるが、出力ファイルが膨大になるので2048サンプル毎に間引いて出力することも出来るようにしている。

また、絶対値出力の場合にはスペクトル値とともに周波数値も出力するようにした。

この出力ファイルをgnuplotとavidemux等を使って編集して動画を作ることができる。
時報のデータをDFTしてみた。
画像化の手順はこんな感じだ。
Cモデルを実行する。

すると、大量のスペクトルファイルが生成される。

これらをgnuplotでグラフ描画してjpegファイルに変換する。これは以下のようなシェルスクリプトで行っている。

このスクリプトの実行が完了すると、jpgというディレクトリ下に変換されたjpegファイルが生成されている。

次に、avidemuxでこれらの画像からAVI形式の動画を作成する。

上記のようにすると、jpg下の全てのjpegファイルが番号順に読み込まれる。
このデータは2048サンプル毎のデータであり、サンプリングレートは44.1kHzなので映像のフレームレートとしては44.1KHz/2048=21.533になるので、レートをそのように設定する。(映像(D)➔フレームレート(F))

次に、音声データを読みこませる。(音声(A)➔主トラック(M))
音声ソースを外部WAVにして、外部ファイルでwavファイルを指定してOKをクリックする。

これで映像と音声が合体できたので、AVI形式で保存する。


生成したAVIファイルはjpegとwavファイルが合成されているだけなのでファイルサイズは大きいが、ffmpeg等を使ってflvやwmv等のフォーマットに変換すれば小さくすることが出来る。(ただし、画質や音質は劣化する。)
こうやって作った映像を見るのは面白く、楽しい。
2012年のDFT IP作成時はしょうもないバグに気づかずに正常動作させるのにものすごく手間取ったが最終的には原因も判明し修正できた。ZynqへのDFT IPの実装が完了すれば、これと同様の映像がリアルタイムで見れるようになる。

0 件のコメント:

コメントを投稿

ERROR: Failed to spawn fakeroot worker to run ...

なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz  家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...