2014年6月15日日曜日

DDSでLFOを検証

とりあえず、Visual Cで検証用のコードを書いてみた





周波数変調と位相変調


VCOにかけるLFOの役目は、LFOの出力電圧でVCOの発振周波数を揺らしてやることだ
これをDDSでまじめにやるとすると

初期処理: 
LFOの発振周波数からTuning Wordを計算(浮動小数点演算) 
ループ: 
LFOのTuning WordをPhase Accumulatorに加算
Phase Accumulatorの値を元にテーブルを参照してLFOの出力値を取得
VCOの発振周波数とLFOの出力値を乗算(浮動小数点演算)
得られた周波数からTuning Wordを計算(浮動小数点演算)
        Phase Accumulatorの値を元にテーブルを参照してVCOの出力値を取得
ループ終わり:

と、演算量が少ないというDDSの利点がまったく生かせない事態になる

周波数変調と位相変調は微積の関係なので、位相変調で処理することにした
具体的にはTunig WordにLFOの出力値を加算している

数学的な検証はめんどくさいのでやってないが、DDSでの変調はこれが普通だと思う


LFOの最低周波数


DDSの出力周波数は

  f_out = ( M / 2 ^ n ) * f_smp
  
で求まる。(M: Tuning Word, n: Phase Accumulatorのビット長, f_smp: サンプリング周波数, f_out: 出力周波数)

( M / 2 ^ n )が0以下の場合の場合発振しない。しかも整数なので、M = 1 として
f_smp = 44100, n = 16, の場合を考えると

  f_out = ( 1 / 2^16 ) * 44100 = 0.673[Hz]
  
となる。 また、この1つ上の周波数は M = 2, 1.346[Hz] となりLFOとしてはよろしくない

なので、LFOのサンプリング周波数は波形生成の整数分の1で処理することにした


今後の予定


LFOの効き方をもっと良くするために係数を調整する必要がある。
が、オーバーフローとかビット数とかの計算がめんどさい

気が向いたらやることにして、基本的なエンジン部分はだいたいこんなもんでいいかと思う


シンセなら次はVCAやEGに手を付けるか迷うとこだが、ピュンピュンマシンなので
音色のキモになるフィルタに手を付けたい。

VCFやデジタルフィルタは理論的なことが難しすぎるので
可変抵抗でパラメータをコントロールするタダのアナログフィルタでも面白いかも

0 件のコメント:

コメントを投稿