デジタル版Frequency Shifterの検討 その2 まずはSTM32で
■まずはSTM32F103で
マイコンとしては、Armtheremin Live の音源モジュールとして STM32F103搭載のBluePillを、STM32duinoとして使っていたので、とりあえずこれで検討。
参考→
http://hyamasynth.web.fc2.com/ArmThereminLIVE/ArmTerminLIVE_Root.html
しかし、音源モジュールとは異なり今回のお題は、いわばエフェクターなので、今まで未経験のオーディオ入力も考える必要がある。
目標としては、
(1) 歪やノイズなどはアナログ版並
(2) キャリア漏れや周波数シフトの精度はアナログより高精度
(3) 高音域はアナログのように伸ばせないのは許容するが、エイリアシングノイズは極力避ける
とします。
少なくともアナログ版と比較できるレベルの音質を狙うには、エイリアシングに注力が必要なので、ひょっとしたらFrequency Shifterのデジタル実装よりも、高品質のA/DとD/Aを持つ適切なマイコンシステムの開発が重要になりそう。
そこで、「入力フィルタ→ A/D → マイコン → D/A → 出力フィルタ」のような「無処理」の系で音質を評価することにします。
この際の、A/Dの速度も調査が必要。Armtheremin Liveでも、D/A周りのS/Nでは苦労したので、A/Dも含めるなかなか難しいことが予想されます。
■外付けD/AとA/Dが必要
実際アームテルミンの開発用の改造基板で、STM32F103チップの内蔵12bitA/D と、2チャンネルPWMのアナログ合成で実質12bit精度以上のはずのD/Aで試しましたが、アナログフィルタや、電源グランド周りのアナログ処理のS/Nや歪等とても今回の用途には心もとなく、外付けD/Aを使う必要がありそうです。
また、STM32M3チップの内蔵A/Dは、オーディオで使えるように変換クロックを上げると変換精度が落ち、複数のA/D 入力チャンネル間で大きなクロストークが生じました。(これは、後にADのサンプリング幅の設定が適切でなかったからかもしれない・・)
他に複数個のPOTの読み込みなどにもA/Dは必要なので、オーディオ入力専用とはできず、内蔵A/DはPOT読み込みに回して、オーディオ入力には、外付けA/Dを探すことにします。
デジタル版Frequency Shifterの検討 その4 RP2040 + ( D/A ,A/D )の検討ハード編
■Raspberry PICO (RP2040) 実験ボード
RP2040で検討するに当たって、ブレードボード代わりに実験ボードを試作しました。
音系ではS/Nが重要なのでプレッドボードはお勧めできません。また、配線そのものが多いのでパターン化すれば楽です。
なれないMPUなので変更の可能性があるGPIOは未配線とし、ユニバーサル部を使って色々試せるようににしています。
エフェクタ(A/D+D/A)や音源モジュール(D/Aのみ)の検討がし易いよう、アナログLPFの抵抗が差し替え式にしたり、複数のA/D や D/Aがテストできるように工夫しています。
A/Dとしては、
・RP2040内蔵ADC(12bit)
・ボード上に実装しているSPI ADC BU79100G(6pinのU2)(12bit)
・ユニバーサル部のSPI MCP3201(12bit)
・ユニバーサル部のI2S PCM1808(24bit)
D/Aとしては、
・RP2040 のdual PWM+LPF(実質14bit)
・I2C のMCP4726(12bit)
・ユニバーサル部のI2S PCM5102(16/24/32bit)
UI用のOLEDディスプレイ(SPI) も用意しています。
また、入力用と出力用として2つの2次SALLEN-KEY LPFを用意しています。
これを使っていろいろテストすることにします。
デジタル版Frequency Shifterの検討 その3 A/D,D/Aの選択とマイコンの変更
■外付けA/D,D/Aの選択と、それに最適なマイコンへの変更も検討
結局、良いデジタルエフェクタのプラットフォームを作ることが第一歩となったので、外付けA/D , D/A を使うことを前提に検討します。
A/D,D/Aは、外付けなら16ビット精度程度が欲しい。その際のI/F としては、できるだけ高速なものを選ぶ必要がありI2Cは避けたほうが良いだろう。となると SPI かI2S になる。
SPI の高速ADCでは、16bit 品は高価なものしか無く、選択肢は12bitになります。arduinoでの使用実績がある安価なMCP3201はmax100kspsなので、少し遅すぎます。ROHMのBU79100Gは、500Kspsで動きそうなので候補とします。
デジタルオーディオ専用I/FであるI2S のA/D,D/A は、多くが「オーバーサンプリングの1bit 処理 + デルタシグマ処理 + デジタルフィルタ」の構成で、オーディオ信号に特化して高速、高分解能を実現したものです。16bitはおろか24bitのものもあり、アンチエリアシングとして、高性能なデジタルフィルタが内蔵されており、さらには安価と、言うことがありません。
問題は、I2S はマイコンにハード支援がないと使えない点で、STM32F3(BluePill) では使えなさそうです。しかしデジタルオーディオレベルの性能が期待でき、しかもリーズナブルということで、なんとかしてI2Sを使うためには、マイコンを変えようと思い始めました。
(1) STM32F4 ( BlackPill )
DMAとI2Sサポートがあり、浮動小数点演算が使える魅力もあり、STM32duinoでも開発可能。しかしF3では使えたSTMicroの低レベルライブラリがサポートされておらず、使えるのはarduinoのライブラリのみ。これでは、STM32F1のほうがマシ。今後サポートされたときには再浮上するかも。
(2) ESP32
arduino環境で使えることは確認でき、メモリも多くクロックも高い。しかし、内蔵ADCが酷くて使い物にならない(扱える電圧レベルが低く、ものすごく非線形)。入手した資料と実機とふるまいが違うなど、気持ち悪い点が多く検討をやめた。
(3) RP2040 ( Raspberry PICO )
M0コアだと思い候補に入れていなかったが、調べてみると"M0+"で、STM32F1との比較はわかりませんが、arduino環境でも使え、クロックが高くて、2コアが使えそうです。最も魅力を感じたのは、PIOにハード支援プロセッサを持っており、それを利用したI2Sがarduibo環境でも使えそうなことです。
このチップは面白そうなので、RP2040 + I2S のA/D,D/A の方向で検討を進めることにします。
デジタル版Frequency Shifterの検討 その1 考察と意義
■アナログ版Frequency Shifter
アナログ版Frequency Shifter は、周波数を差の形でシフトできる他のモジュールでは得難い不思議な効果のモジュールであり、ディープなモジュラーファンからは比較的好評で、依頼を受け数台納品したことがあります。
しかし、核となるDomeFilterを構成する各段のオールパスフイルタがシビアで、各段のフィルムコンデンサの選別が必要でかつ、各段の抵抗がすべて異なる値のため、実装の負担が大きく、あまり作りたいものではない。
また、乗算につかうDBMの調整にも高精度が要求され気を使います。
■需要は気にせず興味のみ
そこで、一度デジタルで実現してみようという興味が湧いた。
ただ、アナログであるから良い(アピールボイントとして)という面と、実際に性能面でもアナログが良かったという可能性もあるが、需要の有無は気にせず検討することにする。
参考→ Frequency Shifter の検討(その1) 原理と構成について - 電音の歩み
■デジタルのDomeFilterは意外によいかも
まず最初にデジタルで、90度の位相差を作るには、アナログでは難しいヒルベルトフィルタが考えられるが、高次のFIRが必要で膨大な演算量が必要になると予想される。
参考→dsPIC33FJ64GP802 (17) --- 周波数シフター (1) - シンセ・アンプラグド
そこで今回のアイデアは、デジタルで常識的なヒルベルトフィルタではなく、全くアナログ版と等価なDomeフィルタをデジタルで実装してみようというものです。
両フィルタを簡単に比較すると、
・ヒルベルトは入力に対して全周波数で90度位相をシフトできる。
高次のFIRフィルタが必要でアナログでは困難。
・Domeは、2系統のオールパスフィルタ(フェーズシフタ)の出力が相対的に全周波数で90度シフトになるように設計される。位相しか変えないオールパスフィルタは、人間の耳には音の変化がわからないのを利用して、片側を原音とみなすことにより結果的に全周波数で90度位相をシフトできることになる。
オールパスフィルタは、デジタルではIIRフィルタで構成可能できそうなので、非常に演算量が少なくマイコンのソフト処理で実現できるはず。
また、Domeフィルタは線形フィルタなので、入力信号を適切に帯域制限していれば、フィルタによる新たなエイリアシングの発生による音の濁りは生じない。(当然後段の加減と乗算はエイリアシングを有むが)
次回はマイコンの選択
OLEDに張り付く、 切手サイズのArduino 互換Tiny board その3 ATmega328の後継チップ検討
■ATmega328の後継チップ検討
ikkei さんに後継チップ Dxを教えてもらいました。
AVR64DB32は、DBシリーズチップ、プログラムメモリ64KB、32pinを表しています。
ちょうどATmega328の後継としてちょうど良さそうです。
クロックが24MHz,RAMが8KBに拡張されているのは嬉しいですね。
他にも優れた特長が多々あるのですが、問題はarduinoとしての互換性がどの程度見込めるかです。
arduinoIDEでは、ボードマネジャでDxCoreを追加するとDBシリーズが使えるようになります。
最初古いバージョンのIDE(1.8,9)では、SPIのコンパイルが通らず困っていたのですが、最新のIDE(1.8,19)に上げるとSPI もちゃんと動作するようになり、adafruit oled ssd1306 ライブラリが動作します。
標準のArduino関数は問題ないと思いますので、直接ポートを叩くようなプログラム以外は互換があると思います。
DBシリーズは、今後純正arduinoがでてきて主流になるかは不明ですが、素晴らしいチップですので、これを用いた互換ボードを作ることにしました。
続きは次回
ARM_Theremin (アームテルミン) はその後どうなっているか その4
その3以降、2021年には、
ATMega328のDeepSleepを利用して、SMDでも比較的堅牢なタクトスイッチの長押しによる、Power on/off を実現したガジェット型アームテルミンが完成していました。
(詳しくは「その3」参照)
投稿が随分遅れましたが完成したアームテルミンがこれです。
アームテルミンの詳細については次のサイトにまとめてあります。
これで、「キットではなく完成品がほしい」の要望に応える
ガジェットアームテルミンの完成形として、MFTokyoやMFKyoto、NT京都などで頒布予定でした。
しかし、いずれのイベントもコロナで中止になり中ら浮いてしまっています。
更に悪いことに、世界は深刻な半導体不足に陥りました。
これに使用している32pin TQFPパッケージのATmega328P-AUは全く入手不可能になっています。(もう少し早く気づき必要量の確保できればよかったのですが・・)
DIP版に限っては、秋月のみが在庫を持っているのでこれを利用する方向で検討することにします。