みなさんこんばんは、福岡でおもちゃドクターもやっている トドお父さんです。
前回はテスト用のサイン波のWAVファイルの音声データからHEXファイルを作って、フラッシュメモリICに書き込む所まででしたね。
【Part1】Sound Player基板V2の特性検討と音声データの作成方法
今日は、 生成した音声ファイルのインデックス vos_mac.txt に従って各曲のスタート
アドレスをプログラムに書き込むところ、およびフラッシュに書き込んだPCMデータの
確認方法、また音声再生したデータの再現性と周波数特性などを評価してレポしますね。
また、余裕があればVer3でAB級アンプICとHブリッジICの切り替えができるように設計した
ので、両者の消費電力を含めた比較を行いたいと思います。(これは別途のポストにします)
さて、ATMEL STUDIOでビルドしたファイルのATTINY402/202への書き込み方法に
ついては、前のこの記事に詳しいです。
PA0 UPDI端子をFUSE書き込みでGPIOに変更しなければHVP(高電圧プログラム)の
必要もないので、プログラムはseriauUPDIと言われる中華製の安価なSrialUSB変換モジュール
にダイオードと抵抗1本を追加するだけで構成できるから簡単ですね!
[Part2] ATTINY202への書き込みとプログラムをやっています!
閑話休題:ATMEL STUDIOでorgel_2 のorgel_SW_402プロジェクトを開いたら、
main.cを開きます。
356行 付近のvoice_s に音声データのインデックスが入ってます。
まず、「キティミラーナ」の音声データのインデックスを全てコメントアウトし、今回作成した
インデックス(vo_mos)を書き込みます。
そしたら、main.cをセーブしてリビルドを行います。今回はreleaseフォルダに生成されます。
プログラムがビルドできたら、AVRDUESSを立ち上げて、プログラムの書き込みを行います。
詳しくは前の記事を参照ください。
ATTINY202/402のFUSEビットをAVRDUDESSを使って書く方法
今回はMCUにt402(ATTINY402)を選んで、下記のフォルダにあるプログラム
orgel_SW_402.hexへのパスを指定します。
D:\Users\powpher\documents\Atmel Studio\7.0\orgel1_2_anpan_240820\orgel_SW_402\Release\orgel_SW_402.hex
さらにprogramボタンを押すと、Additional command lineに書かれたFUSE書き込み後に
ビルドしたプログラムの書き込みを実行します。
FUSEデータは -U fuse2:w:0x01:m -U fuse5:w:0xC4:m クロックを16MHz、PA0はUPDI
PA0 UPDI端子はSW0 (タクトSW)の入力に使っていますが、UPDIからGPIOに変更する
とHVP(高電圧プログラミング)の対応が必要となります。
そのときのFUSEデータは-U fuse2:w:0x01:m -U fuse5:w:0xC4:m になります。
今回はUPDIのまま入力端子として使っていますが、きちんと”H"、”L"認識するようです。
Sleep時の電流が増すとの情報がありましたが、確認した所 1uA 以下になりました。
これで、基板のタクトSWを押すたびに、wavelistで指定した音声ファイルが順次ラウンド
ロビンで再生されるようになりますね。
これで、ようやく音声再生の波形をオシロで測定して波形と周波数特性を評価できます。
前回作ってフラッシュメモリICに保存したのは、下記のサイン波 音声データでしたね。
1.1kHz 0dB 30秒
2.400Hz 0dB 30秒
3.100Hz -6dB 20秒
4.400Hz -6dB 20秒
5.1kHz -6dB 20秒
6.2kHz -6dB 20秒
7.5kHz -6dB 20秒
1.から 再生してみました。
1kHz 0db 400Hz 0db
あれっ、なんか波形がおかしいですね。
WAVデータとHEXデータを比較して確認してみます。
WAVデータはAudicityで16kHzサンプル 8bit PCM信号になっていますから、
WAVデータのRIFFヘッダ44バイトを除けば同じデータになるはずです。
こちらが1kHz 16kHz 8bit -6dB のWAVファイル
こちらが1kHz 16kHz 8bit -6dB の生成したHEX
WAVファイルの45バイト目から、83h、98h、AEh、BBh、と続くデータになるはずが
飽和したFFhまでの拡大したデータになっているようです。
続いて 400Hz 16kHz 8bit -6dB のWAVファイル
こちらは400Hz 16kHz 8bit -6dBのHEXファイル
これも正しければ、WAVファイルの45バイト目から、81h、8Ah、94h、9Dh、と続くデータになるはずが、やはりFFhまでの拡大して飽和したデータになっているようです。
大泉さん作成の WAV2HEXのC++プログラムをVisual Studio 2022で開いてみます。
ファイル名の末尾に’#’ がつけば、no_volというフラグが0になって、データの
加工をしないようにプログラムされています。
またHEXデータを生成するmake_hex()というメソッドはパラメータとしてno_vol
有り/なし を渡すようになっています。
当然プログラムには問題がないようですが、私のファイル名の付け方がまずくて認識しない
のかもしれません。そこで、no_volの値に関わらず、データを加工しないようにします。
これらの変更をした後、リビルドをします。
現状のexeファイルと区別するために、出力をReleaseから、Debugに変更します。
batファイルのWAV2HEX.exeへのパスもDebugに修正します。
出力 HEXファイル名も区別のため、変えておく方がいいでしょう。
さて、できました。
今度はどうでしょうか?
まず、1kHz 16kHz 8bit -6db のHEXファイル
WAVファイルの45バイト目と同じ、83h、98h、AEh、BBh、になりました!
次に、400Hz 16kHz 8bit -6db のHEXファイル
WAVファイルの45バイト目からとおなじ、81h、8Ah、94h、9Dh、になっています。
これで波形データは正常です。ようやくきちんとオシロで測定できるようになりました!
1kHz 0db 400Hz 0dB
0dBなのでサイン波が飽和しています。 これは正常です。
100Hz -6dB 400Hz -6dB
1kHz -6dB 2kHz -6dB
5kHz -6dB
-6dBでは、0xFFの飽和データが現れないので、ちゃんとサイン波になっています。
振幅を見ると、2~5KHzくらいまでは、ちゃんと周波数特性が取れているようです。
5kHzでは、波形の振幅が少し弱くなります。サンプリングのせいかもしれませんね。
この実験に先立ち、アンプ前にいれたCRフィルタの定数は少し変更しました。
時定数 τ=CR で、1kΩと0.1uFで時定数は0.1mS(10kHz)になりますが、
フィルタとしてのカットオフ周波数は f=1/2πCR になります。(勘違いしてました💦)
つまり、この時のカットオフ周波数は ≒ 1.5kHz で、-3dBになります。
サンプリング周波数は16kHzにした場合、4~8kHzくらいまで帯域を伸ばしたいですね。
R8 1kΩ → 220Ω に変更しローパスフィルタのカットオフ周波数を1.5 →7KHzにしました。
以上の内容で、Sound Player基板の周波数特性の検討を終了します。
音声のHEX化で思わぬ問題が出たので、検討してよかったです。
今後は、Audicityで音声を事前に加工して、HEX化の際は加工なしにしたいと思います。
サイン波での試験では、スピーカからの音声はノイズっぽい感じは全く出ていません。
あとは、実際に音楽を鳴らして、音質の改善を確認したいと思います。
すこしPWMが残っているので、気にはなるところです。
少し高音が落ちても、フィルタを利かすか、現状でいくか検討が必要ですね。
それでは、おやすみなさい。
過去記事
[Part1] ATTINY402で音声再生のテストをしました
[Part2 テスト終了です] ATTINY402で音声再生のテストをしました
ATTINY用Sounds Player基板の設計をしました!