ディジタル発振器

インターフェース誌9月号特集では「音発生用発振器」として105ページで、ディジタル信号処理による通信システム設計―演算の実装から信号の変復調・誤り訂正まで (ディジタル信号処理シリーズ)では「ディジタル発振器」として136ページで取り上げられているアルゴリズムは、わずかな計算で正弦波を発生し続けます。
以下、サンプル

    short osc()
    {
    	static int y1 = 4277; // sin( 2*pi*1000 / 48000 ) * 32768
    	static int y0 = 0;
        int result;
    
        result = (32478*y1>>14) - y0;
        y0 = y1;
        y1 = result;
        return result;
    
    }

たったこれだけで1KHzの正弦波を作ることができます(48Kサンプル/S)。テーブルが不要な上に、関数多項式近似よりも圧倒的に命令サイクル数が小さくなります。一方、

  • 周波数の精度が低い
  • 低い周波数で安定性が悪い

といった問題があるのですが、ビープ音に使うくらいなら手軽です。ためしに数十分間鳴らしてみましたが、ちゃんと動作していました。マイコンでも手軽に使えそうです。