2019年01月08日

コードを整理する

LaVoixskiは、FTMに入力されたディテクターからの信号のアップ・エッジ間の時間を計測する方式で、オシレーターから復調された信号の周波数を検知する。 

発振器の差分を検出するディテクターには、データ入力とクロック入力にリファレンス用に周波数が固定された発振器とVCOの出力を接続したD-FFを採用しているが、

WS000503c.JPG

簡易型のLC発振器は周波数特性やリニアリティーに特筆すべきところはなく、楽器用途としてはいささか頼りない仕様と言える。

Screen20Shot202018-05-0620at2016.00.52.png

デジタルテルミンの長所は、このような「あまり高性能とはいえない発振器」の、直線性の良い周波数偏移が行われる部分を切り取って使用できる点にあるが、発振器の素の特性の影響は無視できない。 つまり、発振器のアナログ的な特性を追い込むことが安定した楽器を作る上での正道ではある。

とはいうものの、現在の実験環境はプアな性能の発振器を使用することを強いられているわけだが、ソフトウエア面からのアプローチによって安定した性能を獲得することにフォーカスを絞ることにした。

以下、そのような観点から行った試行錯誤を記録していく。

まず、MicroSDからアップロードされたデータのうち、一切の変更が認められない項目を固定した。 具体的には制御用のWaveTable群がそれにあたる。

WS001557.JPG

ピッチ関連のデータも同様に固定することにした。

WS001558.JPG

FTMのカウンタを駆動するクロックの分周率の設定が難しいが、今回は分周率を上げる方向で実験を行っていく。

分周率を上げると低域の処理が安定する半面、再生周波数のレンジは低い方に推移する。

WS001559.JPG

動作を出来るだけ軽くするために、Loop内に記述していたgotoを排除し、While文に書き換えた。

WS001560.JPG

FVCの改良点として、まずPitchアンテナ側のValueに15bitのリミッターを設置している。

WS001561.JPG

当初は、Volumeアンテナ側とPitchアンテナ側に分散してイニシャル値を記録する方式を試していたが、動作に問題が生じたために後ほどこれを修正している。

WS001562.JPG

処理ステップを削減するためにインターラプトのマスクを行うルーティンの合理化を目指したが、周波数ディテクタ入力の介入ポイントが限定されてしまう弊害が認められたため、処理をまとめた項目それぞれに対してこまめにマスクを行う方式に変更した。

WS001563.JPG

また、音の歪みが気になったサブ音声出力に関して、データ送信ルーティンの処理を最適化した後にattatchInterruptのルーティン内にデータ送信のタスクを集中することで、ノイズの発生を回避することができた。

WS001564.JPG

FVCの改良に関しては、まずSwitchで選択しているキャリブレーション関連の処理を、項目別に一元化する整理を行った。

WS001565.JPG

動作の安定を図るため、キャリブレーション-モードの切り替え機構の処理を分散させている。 例えば、EEPROMのハンドリングはVolume側で行っている。

WS001566.JPG

改変の結果はご覧のとおり、入力値が確実に反映されるようになった。

Screen Shot 2019-01-08 at 6.33.53.png

Pitch側の出力値のスケール設定が難しく試行錯誤が続いている。 ビットシフトによる分解能の縮小は安定化に寄与する半面、低域音階の変化が不連続になってしまう。

Screen Shot 2019-01-08 at 20.53.12.png

特に低域の不安定さを解消するために平滑化を強化する方向でウエイトを設定するような対処法では動作速度に支障が出てしまう。 例示している値では演奏に耐えることが出来なかった。

Screen Shot 2019-01-09 at 10.35.38.png

一方、Volume制御側に感じていた問題点は、左手の位置をセンシング出来る領域の狭さで、14bitに設定していたValueの制限値を下方に広げることで領域の拡張を試行したものの、結果はいまひとつだった。

Screen Shot 2019-01-09 at 10.36.32.png

FTMに関しては、Pitch/Volume双方に求められる最適な特性が異なるため、設定値の選択が非常に難しい。 特にVolume側は”分周比2”以外の選択肢がなく、結局はPitch側に折衷を迫られることになった。

Screen Shot 2019-01-09 at 18.06.20.png

結的に、選択した平滑処理に設定するウエイトの値はこうなった。

Screen Shot 2019-01-09 at 18.06.50.png

動作が不安定だったEEPROMの書き込みルーティンには二重動作の防止と、待機時間の設定、それとイニシャル値の再読み込み機能を追加している。

Screen Shot 2019-01-09 at 18.07.21.png

試行錯誤の結果、Volume側には帯域制限が必要なことが判明、最適値の選択はこうなった。

Screen Shot 2019-01-09 at 18.07.29.png

この時点でPitch側のフルスケールは15bitとなっているが、その分平滑化のウエイトを増やすことで対処している。

Screen Shot 2019-01-09 at 18.07.52.png

その後、Pitch側のFVCのスケールを16bitに拡張したので、ついでにウエイトの方も重めな設定に変更した。

Screen Shot 2019-01-10 at 6.29.44.png

オシレーターのイニシャル値はこの設定で安定している。

Screen Shot 2019-01-10 at 6.39.52.png

現在機能は殺してあるが、adatに対応するための2'sComplimentに出力値を変換する機能を実装しておく。

33764270_1871013596262423_2066379358188077056_n.jpg

12bitFSのWavetableは中央値が2048なので其処をゼロポイントとし、それ以上の値は2048との差分を、以下の値は2048から変化量を減算した後、全ビットにXORを掛けてデータを反転したものに1を加えている。

16bitFSでPitchをコントロールする場合、Wavetableの読み出しアドレスを8132stepにすることで、低域の安定度を上げることが出来る。 その場合、波形の登録を1/2に削減しなければならないが、実験を行う価値はあるだろう。 

追記: 

q15_tに指定していたWavetableやVolumeControl系のデータ型をuint16_tに修正した。 

WS001573.JPG

妙なノイズが発生していた原因はコレだった模様。 int16_tを浮動小数点型にまとめて変換した時にミスって指定を行っていたようで、

WS001574.JPG

処理幅が12bitのVolumeControl系は要所要所に"&0x7FF"でリミッターを掛けていたので影響はなかったが、

WS001575.JPG

流石にWavetableの指定はマズかった。

WS001576.JPG

修正後は、出力波形の歪が軽減された。 ついでにVolume系のリミッター群も取り除き、少しでも処理速度のマージンを稼ぐ事を目指している。

WS001577.JPG
posted by Yasuski at 00:00| LaVoixski