STM32F4
AC97 では、1 オーディオ・フレームは 256 ビットから構成されており、「BIT_CLK」 (ビット・クロック) の周波数は、 256 × 48 kHz = 12.288 MHz となります。 256 ビットの 1 フレームはさらに、16 ビット幅のスロットが 1 個、20 ビット幅のスロットが12 …
STM32F446RE などに内蔵されている SAI (Serial Audio Interface) モジュールの AC97 モードを使って、AC97 コーデックとの接続を試してみました。 「AC97 リンク・コントローラ」に「AC97 プライマリ・コーデック」ひとつと「AC97 セカンダリ・コーデック」…
STM32F446RE などに内蔵されている SAI (Serial Audio Interface) モジュールでは、通常の 2 チャネル・ステレオ・オーディオ DAC/ADC とのインターフェースに加えて、 3 ch 以上のマルチ・チャネル構成や、AC97 や SPDIF などのプロトコルに対応しています…
「STM32F4 Discovery」(STM32F407VGT 搭載) 用のFM音源プログラム 「TGSTM32F4」を「STM32CubeIDE」に対応させたパッケージを公開しました。(→こちら) 上記リンクをクリックすると Dropbox ボックスが開きます。 (Dropbox のアカウントを持っている必要は…
STMicroelectronics 製 STM32F4 マイコン・ボード 「STM32F4 Discovery」(STM32F407VGT 搭載) 用のFM音源プログラム 「TGSTM32F4」(2012 年 04 月 18 日に公開) では、開発環境として、無償版の Atollic TrueSTUDIO for STMicroelectronics STM32 Lite V 2…
gcc の「インライン・アセンブラ」で書いた ARMv7E-M (Cortex-M4) 版の acc_calc_slot() 関数のリストを下に示します。 「中身」は armcc 版と同等です。
STM32F4 シリーズには、「Adaptive real-time accelerator」(ART Accelerator) と称するフラッシュ・メモリ読み出しのためのキャッシュ機構が備えられています。 フラッシュの読み出し幅は 128 ビット (16 バイト) で、フラッシュ上の命令 (I-Code) に対して…
Cortex-M4 用の結果では、フラッシュのキャッシュ機構の構成が同じ STM32F446 と STM32F407 とがほぼ同じ結果で、別のキャッシュ機構を持つ STM32F303 がやや異なる結果となりました。 PSoC5LP にはフラッシュのキャッシュのヒット/ミスの回数を計測するレジ…
アセンブリ言語によるスロット (オペレータ) 計算プログラムでは、ARMv6-M (Cortex-M0) の 16 ビット Thumb 命令を主に使うこととし、ARMv7-M (Cortex-M3/M4) に対しては一部を 32 ビット Thumb2 命令で記述することにより効率化しています。 以下に、その「…
armcc の「エンベデッド・アセンブラ」では、関数まるごとアセンブリ言語で記述し、関数冒頭のレジスタ・セーブや、関数最後のレジスタ・リストアやリターン命令まですべてを記述する必要がありました。 gcc の「インライン・アセンブラ」では、C 言語での記…
オペレータ処理をアセンブリ言語で書く場合、C プログラム・ソースの構造体アクセスの o_p->ph_acc のような表現は、アセンブリ言語ソースとしては最終的には ldr r2, [r0, #4] のように「定数オフセット」にまで変換される必要があります。 C プログラム・…
今回は各種のチップ/コンパイラの組み合わせのオブジェクトに対する逆アセンブル・リストを掲載します。 もとの C ソース・ファイルでの記述を少し変えると、コンパイル後のオブジェクトはかなり大きく変化するので、あまり細部に渡る追及はしないでおきます…
プログラムを動作させるマイコン・ボードとしては、オペレータ出力波形をオシロで手軽にチェックするために、手持ちの中で DAC を内蔵するチップを搭載している次のボードを選びました。 Nucleo-F446RE (STM32F446RET6, Cortex-M4) STMF4-Discovery (STM32F4…
これまでのFM音源プログラムでは、オペレータ (スロット) ひとつ分を実現する関数を定義し、それをオペレータの個数だけ呼び出していました。 より効率化するために、ひとつの関数内ですべてのオペレータの計算を行なうように変更することを考えています。…
2016 月 11 月 18 日付けの記事 (→こちら) で述べた EG クロック・プリスケーラの動作は、よく考えればレート・マルチプライア (rate multiplier) そのものでした。 パイプライン方式で複数オペレータを実現する場合に各オペレータ固有の内部変数として 8 進…
リニア出力のアナログ EG では、ディケイ/リリース回路に 1 次 RC 回路の放電特性のエクスポネンシャル・カーブを利用していれば、時間の経過とともに出力電圧はサステインあるいはグラウンド・レベルへ限りなく接近していきます。 リリース状態で「放置」し…
今回の小ネタは、OPL3 の EG パラメタ (AR/DR/RR) の値が有効になる (参照される) タイミングについてです。 結論から言えば、アタック/ディケイ/リリースで、その状態に対応するレート・レジスタ AR/DR/RR が選択されている限り、ラッチされることはなく常…
今回は、OPL3 の音色パラメタの「SL」(Sustain Level) と実際の EG 出力のサステイン・レベルの不一致についての話です。 音色パラメタの SL は 4 ビットの値で、dB 単位の出力レベルと各ビットとが下の表のように対応づけられています。 b3 : -24 dB b2 : -…
OPL3 の EG では、AR/DR/RR で指定するレートが 13 の場合に fs クロックごとに EG アキュムレータの値が変化するようになり、レートが 12 を含んでそれ以下になる場合には、EG アキュムレータを更新するクロックが fs を分周したもの (プリスケールされたも…
ほぼ 1 年前 (→2015 年 9 月 20 日の記事) に OPL3 モードに設定した YMF297 で、セルフ・フィードバックの経路に FIR LPF が存在することを確認しました。 そのときから気になっていたのですが、「普通」のモジュレーション入力のパスには LPF がなく、入力…
2016 年 1 月 1 日付けの記事 (→こちら) の 4 K エントリの場合と同様に、テーブル・インデクスを「マスク」する方法により、テーブル・サイズを 3.75 K (3840) エントリまで削減することができました。 また、4 K エントリの場合と同様に、符号の操作も併用…
2016 年 1 月 1 日付けの記事 (→こちら) の 8 K (8192) エントリの「ウェーブテーブル」を用いる方式で、波形の一部を共有するすることによりテーブル容量を 6 K (6144) エントリまで減らすことができました。 サンプルごとの処理では、8 K エントリ方式と同…
パイオニア PD00601 の測定を行ないました。 PD00601 は 2 DAC 出力モードのみをサポートする 8 倍オーバーサンプリング・ディジタル・フィルタで、 阻止域減衰量 53 dB 通過域リプル -0.046 ±0.023 dB SOP (1.27 mm ピッチ) 16 ピン・パッケージ というスペ…
パイオニア PD00601 の前に、NPC 製 SM5807ES の測定を行なうことにしました。 SM5807 も古い AV 機器から外してきたものですが、それが何の機器だったかは覚えていません。 SM5807 は 4 倍オーバーサンプリング用ディジタル・フィルタで、fs = 44.1 kHz に…
単体の (単純な) DAC と組み合わせてオーバーサンプリング DAC を構成するための、単体のディジタル・フィルタ IC の特性を測定してみました。 対象は YAMAHA の YM3434 で、昔の AV 機器 (MUSE-NTSC コンバータ) から外してきたものです。 昔、秋月で YM343…
FM 音源の「オペレータ」のフェーズ・ジェネレータ部、EG 部を除く、波形生成部分の計算量を見積もる作業をしています。 以下のような、波形テーブルのサイズの違う 3 種類のプロトタイプのプログラムを作ってみました。 8 K (8 × 1024 = 8192) エントリのテ…
ほぼ 1 年ぶりに、OPL3 モードに設定した YMF297 の出力を S/PDIF 経由でキャプチャしてみました。 それは、下の記事に示すように、フィードバック量が多い場合に出力波形が振動的になる現象を追求するためです。 FM音源プログラム(20) -- オペレータ(1…
STM32F4xx シリーズの DMAC は STM32F1xx シリーズの DMAC に比べて機能が拡張されており、ハードウェアで「ダブル・バッファ」機能をサポートしています。 これは、メモリ・ベース・アドレス・レジスタを「2 面」の DMA バッファに対応して 2 組持っていて…
BSP_AUDIO_OUT_Init() で初期化したあとは、 BSP_AUDIO_OUT_Play(uint16_t* pBuffer, uint32_t Size) で実際に DMA 転送によるオーディオ・データ出力を開始します。 第一引数 pBuffer は、配列要素がハーフワード (16 ビット) の DMA バッファ配列の先頭へ…
前回までの話は BSP (Board Support Package) ライブラリの「固定部分」を組み込むための手順でした。 手順 5. はユーザ・アプリケーションから API (Application Programming Interface) 関数を介して BSP ライブラリを利用する方法で、手順 6. は BSP ライ…