YouTubeの動画の音声でも分かる「ギュルギュル」した音に気付いた人は、私の仲間です。
NuVCOの最初の記事では、STM32G431とPCM5102Aを使ってVCOを動かし、実際の音もYoutubeへアップしました。
最初の記事:
https://dad8893.blogspot.com/2026/07/nuvco-stm32vco.html
最初の記事の動画では、Sawtoothの周波数を上げていくと、音程とは別に動くような「ギュルギュル」した音が聞こえます。
固定した周波数で聞いているより、Tune POTを回して周波数を変化させたときの方が違和感 が出ます。
Sawtooth本来の音程とは別の音が、妙な動き方をしています。
SawtoothとAliasing
Sawtoothは波形の端で、
+1 → -1
のように急激に変化します。
この不連続部分には非常に高い周波数まで高調波が含まれます。
NuVCOのSampling Rateは48kHzなので、Nyquist周波数は24kHzです。
24kHzを超えた高調波はそのまま再生できず、可聴帯域へ折り返してきます。
これがaliasingです。
Sawtoothの音程を変えると元の高調波も動きますが、折り返してきた成分は本来の高調波とは違う動きをします。
Tune POTを回したときに「ギュルギュル」というノイズは、最初はUSB接続で現れがちなノイズ、GNDループによって拾ってしまうデジタル機器のノイズなど疑いまくりました。
FFTで見てみる
約1725HzのSawtoothをFFTで見ると、本来の高調波とは別に多くの成分が現れます。
周波数を変化させると、これらの成分も本来の音程とは違う動きをします。
耳で聞いていた「ギュルギュル」と対応しているように見えます。
PolyBLEPを入れてみる
Sawtoothに PolyBLEP を入れた場合です。
PolyBLEPは、Sawtooth全体へフィルターをかけるのではなく、波形が不連続になる部分の近くだけを補正する方法です。
今回使った一般的なPolyBLEPでは、正規化した位置を x とすると、
-x² + 2x - 1
のような2次関数を使って、不連続点付近の波形を少しなめらかにつなぎます。
実装では、現在の位相が不連続点から1 sample分程度の範囲にあるときだけ補正値を加えています。
つまり、Sawtooth全体の形を大きく変えるのではなく、問題になる急峻な部分だけを局所的に修正しています。
もともとどこで急峻な部分が現れるかがわかっているからできるのがPolyBLEPです。リアルタイムに検知しているわけではないのでご承知ください。
PolyBLEPを入れた結果
PolyBLEP適用後のFFTです。
初期状態で見えていた、本来の高調波とは異なる成分がかなり減りました。
聴感上の変化も分かりやすいです。
特にTune POTを回して周波数を連続的に変えたとき、PolyBLEP OFFでは「ギュルギュル」とした成分が目立ちます。
PolyBLEPをONにすると、その成分がかなり減ります。
一方で、Sawtoothらしい明るい音まで大きく失われた感じはありませんでした。
私の場合、固定した1音を聞き比べるよりも、周波数を動かしたときの方がPolyBLEPの効果はずっと分かりやすく感じました。
実際の音
PolyBLEPをON / OFFしながら、Sawtoothの周波数を変化させた様子を動画でも撮影しました。
OFFのときは、Sawtoothの音程とは別に動く「ギュルギュル」した音に注目すると違いが分かりやすいと思います。
ONにすると、この成分がかなり小さくなります。
処理負荷
当然、PolyBLEPを入れると計算量は増えます。
NuVCOではCycle Counterを使って11 Voice動作時の処理時間も確認しました。
PolyBLEPを有効にしてもaudio生成のdeadline超過は発生せず、まだ十分な余裕がありました。
そのためNuVCOでは、Sawtooth系の波形についてPolyBLEPを基本的にONで使うことにしています。
Aliasingは音で分かる
今回面白かったのは、FFTを見る前にまず耳で違和感に気付いたことです。
単純なSawtoothでも、高い周波数へ上げていくとaliasingはかなり目立ちます。
特に周波数を連続して変化させると、本来の音程とは別に動く成分として聞こえるので分かりやすいです。
PolyBLEPという比較的軽い補正を加えるだけでも、その違和感はかなり減りました。
最初のNuVCO動画に入っていた「ギュルギュル」が、後になってこういう形で改善できたのは面白い結果でした。
0 件のコメント:
コメントを投稿