過 去 ロ グ

目次ページへ戻る。

MC56F8323


[1122]Re: Voice_Recorder_Demo の解析 - 投稿者:ryosuke 2005年1月22日(土) 0時14分

過去ログ MC56F8323、[92] の続きです。(ずいぶん古い話です。)

> ITU-T 勧告の G.711 だったんですね。(勧告 1972 年)

G.711 についてです。ただの PCM じゃなくて 14ビットまたは 13ビット
の情報量を対数圧縮した 8ビットのデータになっているようです。

 http://www.kyastem.co.jp/japanese/about-codec/about-codec06.html

なるほど。
確かにリニアな 8ビットでは 256段階しかないためダイナミックレンジ
が狭すぎますよね。


[1019]56F800/56F8300 開発者向けスタータキット - 投稿者:ryosuke 2004年12月16日(木) 21時20分

丸文さんのサイトにハイブリッドコントローラの紹介が出ているのを見つけました。

http://www.marubun.co.jp/semicon/freescale/56fdsk.jsp

トップからだと、Freescale 8ビットマイコン体験デモキットのバナーを
クリックして、MC56F800/8300 から入れました。

これも注目しています。


[102]16KBライセンス で使える低機能 printf - 投稿者:ryosuke 2004年4月23日(金) 2時3分

> putchar を使って、書式付きでない print 関数を作ればコードサイズ
> の小さな低機能版 printf(とは呼べないが)として使えそうです。

さっそく作ってホームページに貼り付けました。
これは、表示させる形式を %s タイプに限定した printf のような
関数です。名前は printstr としました。

 printstr( "Hello!\n" );
とか
 printstr( string1 );
のようにして使えます。

サイズが小さいので printf と違って 16KB ライセンスでも使えます。


[101]Re: 56F8300DEMO で putchar( 'c' ); - 投稿者:ryosuke 2004年4月22日(木) 7時36分

> そうか、改行 0dh, 0ah を送ると 256 文字に満たなくても送ってきそう
> ですね! 今夜試してみます。

書いてから気付いたのですが 0dh, 0ah というのは MS-DOS のテキスト
ファイルで使われている改行コードでした。C言語で書く場合は '\n' でOKです。

そんなわけで、
putchar( 'a' );
putchar( '\n' );
で無事にコンソールが開いて「 a 改行 」が表示されました。
ホッ。


[100]Re: 56F8300DEMO で putchar( 'c' ); - 投稿者:ryosuke 2004年4月21日(水) 8時6分

ちょっと解説を加えます。putchar を実行するたびに 56F8300DEMO
ボードからパソコンのデバッガ内のコンソールに1文字ずつ送られて
くるのではなく、256文字を超えるところで改行を添えていっぺんに
送ってくるようです。if ( cntr <= 256 ) の数字のところを 255 に変更
すると、全部で 256 文字を超えないので文字は送られてきません。

そうか、改行 0dh, 0ah を送ると 256 文字に満たなくても送ってきそう
ですね! 今夜試してみます。
putchar を使って、書式付きでない print 関数を作ればコードサイズ
の小さな低機能版 printf(とは呼べないが)として使えそうです。


[99]56F8300DEMO で putchar( 'c' ); - 投稿者:ryosuke 2004年4月21日(水) 1時31分

コンソールに何か文字を出したいとき、printf が手軽で良かったの
ですが「 30日ライセンス」が終了したので不便を感じていました。
printf を使うといっきにコードサイズが16KBを超えるため、16KB
ライセンスではコンパイルできないのです。
そこで、putchar が使えないか試してみました。結果は、8KB 以下に
収まる程度なので16KBライセンスで十分使えます。
ただ、注意する点があります。putchar で1文字ずつ印字させようと
しても、実際には 256 文字たまった時点でまとめてコンソールへと
転送されてきます。test.c をアップしたので実験してみて下さい。


[97]Voice_Recorder_Demo 小耳情報 - 投稿者:ryosuke 2004年4月12日(月) 22時35分

簡単なテーブルを使って 500Hz の正弦波を作りました。

電子工作のページに、Hybrid Controller 56F8300DEMO の情報を
載せています。今回作った4種類の音を作るプログラムを紹介しています。


[96]Re: Voice_Recorder_Demo 困ったぞ - 投稿者:ryosuke 2004年4月12日(月) 8時38分

早速ですが、

> 56F8300 は整数を扱うDSPのようです。
> (違っていたらどなたか指摘してください ^^; )

ふと思い出しました。整数ではなくて、固定小数点DSPというものに
分類されるのでしょう。整数DSPなんて聞いたことないです (^^;
詳しくはまた調べてみますが、2進数で表現された整数をどこかで区切って
そこを小数点と考えれば固定小数点として扱うことができるんじゃないかな。
つまり整数演算を行うプロセッサは、固定小数点を扱うプロセッサと言える
のではないかな?

> 次は正弦波(Sine Wave)を作りたいのですが、整数だけで作るとなると、
> うーん、テーブルかなぁ (^^; それじゃ任意の周波数にしたとき応用が
> 利かないけどなぁ・・・。

手持ちの本「RISC CPU(SH2) で実現するDSP処理のノウハウ」西村芳一著
CQ出版社 初版2000年 を開くと、正弦波を作る方法として3つ紹介されて
いました。

1.テーブル参照 2.漸化式を使う方法 3.三角関数を実際に計算

1については、用意した分だけの精度が得られるということで単純です。
2は複素演算を行うのですが、実数演算に展開してから処理すると案外簡単
な処理になるようです。実は私もパソコンで複素演算を実数演算に展開して
処理することはやっているのですが、今回気になっているのはその実数演算
なんですよね(笑) 固定小数点の扱いがはっきりすれば使えそうです。
3はCORDIC(上記参考文献 p.57にはCORDECと書かれていますがCORDICです)
というアルゴリズムを使って三角関数を計算する方法ですが、処理時間が
どうしても他の方法に比べて長くなるのが難点です。

私はとりあえず、サンプリング周波数32kHzの処理系で500Hzの
正弦波を作って鳴らすということに焦点を絞って試してみます。
これは、1の方法をさらに必要最小限に絞り込んだ方法です。
( [95] でやろうとしたテーブルの方法です。)

ちょっと面白くなってきました。


[95]Voice_Recorder_Demo 困ったぞ - 投稿者:ryosuke 2004年4月12日(月) 1時5分

この前の [91] では
> 次回は「改造方針」の予定です。
なんて書きましたが、ちょっと困ったことになりそうです。

私はDSPは未経験なので、いろいろ勘違いをしていたようです。
まず・・・浮動小数点演算を高速に実行できるのは、浮動小数点DSP
なんですね・・・。で、56F8300 は整数を扱うDSPのようです。
(違っていたらどなたか指摘してください ^^; )

int_var1 = int_var2 * 32 / 2; は普通に高速に計算できるけど
int_var1 = 0.5 * int_var2 * 32; はめちゃめちゃ遅くなっています。
これって2番目の式の右辺が浮動小数点に拡張されて計算されるから
ですね。

もちろん、この例であれば1番目の式で書けば良いから問題ないの
ですが、やりたいのは例えば

var1 = amp * sin( 2.0 * 3.141592 * k * n / N );

のようなことなのです。これを高速に、二重ループで計算させます。

私はパソコンで浮動小数点の変数を使ってフーリエ変換などをやって
いましたから、整数で計算させるとなると整数DSPに適したアルゴリズム
を勉強しないといけません。

整数DSPは、積和演算が高速にできるのがメリット。
資料の揃った何か他のDSPを使って、整数DSPでフーリエ変換する
手法を覚えてから 56F8300 に戻った方が良さそうな気がしてきました。

とは言え、少しは音を出してみたいのでこのまま進めてみます。

まず 500Hz の のこぎり波(Saw Wave)、三角波(Triangle Wave)、
方形波(Square Wave)を作りました。
それぞれ聞き覚えのある音でバッチリOKでした。

次は正弦波(Sine Wave)を作りたいのですが、整数だけで作るとなると、
うーん、テーブルかなぁ (^^; それじゃ任意の周波数にしたとき応用が
利かないけどなぁ・・・。


[93]Re: Voice_Recorder_Demo の解析 - 投稿者:ryosuke 2004年4月6日(火) 18時59分

ちょっと引っかかっていた下記の部分は私の勘違いみたいです。
音声再生のところで、

> この 545 行〜 610 行の部分を行う繰り返し周期は実測で約 250us でした。
> 周波数で表すと約 4kHz です。と言うことは標本化定理により約 2kHz 以下の
> 信号しか再生できないということになりますか。

と書きましたが、良く見ると一度に2つのデータを処理していました。
ポインタで示された D2ASample と D2ASample + 1 のことです。
それらを使って FirstWord SecondWord TempWord を作っています。
つまりこの部分の処理を実行する周期は 4kHz ですが、データを2個ずつ処理
するならば実質的に 8kHz で処理しているのと同じことになります。
そうすると標本化定理により 4kHz 以下の信号を再生できますね。

アナログフィルタが気になって回路図を見たところ、やはりカットオフ周波数
4kHz の4次ローパスフィルタが入っていました。間違いなさそうです。
実は再生される音を聞いて、2kHz 以上の音も入っていそうだなぁ、と思って
いたため断定的でない書き方をしていたのです。

録音側のフラッシュ書き込み部分が 8kHz なのに再生側が 4kHz というのも
変だと思っていましたが、どちらも実質的に 8kHz で処理していると考えて
良さそうです。


[92]Re: Voice_Recorder_Demo の解析 - 投稿者:ryosuke 2004年4月6日(火) 14時27分

G711 について、Google 検索したら沢山出てきました。

ITU-T 勧告の G.711 だったんですね。(勧告 1972 年)

音声符号化の1つでテレビ会議などで使われているらしいです。
わりと一般的に使われる言葉のようです。知りませんでした。(@_@;)

↓このへんがわかりやすいかも。
http://www.ndi.co.jp/okivoip/ip_mame.htm#codec
これを見ると、ただの PCM みたいですね。


[91]Voice_Recorder_Demo の解析 - 投稿者:ryosuke 2004年4月6日(火) 12時32分

Hybrid Controller のデモプログラム、Voice_Recorder_Demo を改造して、
録音してから再生ではなく、計算による音声信号を生成してそれを再生、と
いうことを試そうとしています。

まずは解析です。わかったこと。

◆録音時は、タイマ割り込み処理ではなくA/D変換終了割り込み処理の中で
 タイミングが作られています。Events.C の 88 行〜 101 行の部分がA/D
 変換結果を InputSample という変数に取り込んで、それを AdcRxBuff[ ] と
 いうRAM上の配列に収めています。繰り返し周期は 31.25 us ですから
 周波数で表すと 32kHz ということになります。

◆メイン側では、最初に割り込み処理により AdcRxBuff[ ] に収められたデータ
 に対して、FIR 型のデジタルフィルタ処理を行っています。

◆続いて G711 方式(というものを私は知らないのですが、どうやら PWM で
 音声を再生するためのルーチンのようです)で再生するためのエンコードを
 行います。エンコードした結果をフラッシュメモリに記録していきます。
 それが Voice_Recorder_Demo.C の 349 行〜 397 行の部分です。
 このエンコードは AdcRxBuff[ ] のデータを4つずつまとめて処理しています。
 データの前後関係の差分を利用してエンコードしているのでしょう。
 繰り返し周期は 125us で、周波数で表すと 8kHz となります。

◆録音時にメイン側で行うもう一つの処理に、FFT処理(高速フーリエ変換)が
 あります。402 行〜 492 行がその処理です。FFT と言っても、録音再生の
 ための解析を行っているわけではありません。AdcRxBuff[ ] を調べて、
 周波数分析した結果を数個の LED に表示するためのものです。この処理を
 止めても録音再生には影響がありません。

◆再生時のタイミング生成は、他のファイルによって pD2ARead というポインタ
 変数が変更されることにより、543 行の判定が成立しているようです。詳しく
 調べてはいませんが、他のファイルとは G711 方式の再生ルーチンでしょう。
 G711 処理は単純に音声出力のドライバーだと見て、詳しくは触れないことに
 します。そんなわけでメイン側の処理を調べることにしました。
 Voice_Recorder_Demo.C の 545 行〜 610 行の部分でフラッシュメモリから
 エンコード済みのデータを読み出して G711 方式の音声再生を行っています。
 実際の G711 処理は他のソースコード(いやマニュアルかな)を読まないと
 わかりません(そこは既成の処理ですから今は深入りしません)。
 この 545 行〜 610 行の部分を行う繰り返し周期は実測で約 250us でした。
 周波数で表すと約 4kHz です。と言うことは標本化定理により約 2kHz 以下の
 信号しか再生できないということになりますか。ちなみに 546 行と 557 行
 で D2ASample というポインタを使って Sample へデータを取り込んでいます
 が、D2ASample の初期値としては 519 行目でフラッシュメモリの再生用データ
 のアドレスを書き込んでいるわけです。

他に気が付いたこと。

◆UWord32 というのは、符号なし 32 ビット型 というのを typedef している
 ようです。ソースコードで unsigned long int のように書くと移植性が悪く
 なるのを嫌ってのことでしょう。

◆細かいことですが Voice_Recorder_Demo.C の 548 行と 559 行のコメントは
 write error ではなく read error が正しいと思います。

◆Voice_Recorder_Demo.C の 551 行と 562 行にある asm(debughlt); が何である
 か気になりましたが、debughlt を調べてみるとデバッグモードに入るための
 ニモニックでした。ブレークポイントを設定して動かしてみたところ、通常は
 その前の関数の戻り値が 0 なので実行されないコードということが解りました。

次回は「改造方針」の予定です。


[86]Re: Hybrid Controller 動いた! - 投稿者:ryosuke 2004年3月27日(土) 12時10分

77 と 78 で「 8KB制限のライセンス」と書きましたが、16KBでした。
訂正します。


[85]Re: Voice_Recorder_Demo - 投稿者:ryosuke 2004年3月24日(水) 23時8分

てっきり高速フーリエ変換した結果の周波数軸成分データを記録し、
それを読み出して高速フーリエ逆変換をして時間軸データに戻して
音声データとして再生しているのかと思いましたが、時間軸データの
ままで記録、再生していました。高速フーリエ変換は、録音時に5個の
LEDを周波数別に光らせるための処理でした。高速フーリエ逆変換の
ことが書かれていなかったから変だな、とは思っていたのです・・・。

そういう目的の、つまりLEDを5個光らせるための高速フーリエ変換
だったら精度は思いっきり低くて良いわけですね。そうだったのかぁ。


[84]Hybrid と言っても・・・ - 投稿者:ryosuke 2004年3月23日(火) 0時6分

そうそう、Hybrid Controller ということで、名前からなんとなく
高性能 MCU と DSP を1つのチップ上に載せて、内部でバスを
繋いであるのかと想像していましたが、違うんですね。
普通のマイコンにあるような命令と、DSP が持つような積和演算
命令を両方とも備えた、高性能なコアを1つ持っているということ
のようです。なんとなく、少し何か見えてきた感じがしました。


[81]Voice_Recorder_Demo - 投稿者:ryosuke 2004年3月22日(月) 23時2分

Hybrid Controller MC56F8323 が載ったデモボード 56F8300DEMO は、
なかなか面白そうです。

付属CDの Voice_Recorder_Demo というのを動かしてみました。
マイク入力をデジタルフィルタリングして高速フーリエ変換して記録・再生
すると書かれていたので興味をそそられています。後日解析してみたいと
思っています。


[78]Hybrid Controller 動いた! - 投稿者:ryosuke 2004年3月16日(火) 21時53分

うむ! 8KB 16KB の制限がないライセンス(ただし30日限定)を入手して
console に printf("Hello World\n"); 表示を行うテストプログラムを
動かすことができました! コードサイズはこれだけで 20KB くらいに
なっています。なるほどねぇ。なっとく。


[77]Motorola MC56F8323 Hybrid Controller - 投稿者:ryosuke 2004年3月16日(火) 7時34分

今度は Motorola MC56F8323 という Hybrid Controller を使って
みようとしています。DSP と MCU の Hybrid ということのようです。
デモプログラムをコンパイル〜フラッシュ書き込み〜実行させることは
成功しましたが、パソコンで printf デバッグをするためにコンソール
出力させようとすると「 8KB 16KB 制限ライセンスのため動きません」という
旨のエラーが出てしまいます。
30日間制限フルライセンスを入手しなくては!
というわけで CodeWarrior の Metrowerks さんに問い合わせ中。


目次ページへ戻る。