任意周波数の生成:DDSで999Hzを聞いたときにはひどくにごった音でした。今回あらためて999Hzを生成してアルゴリズムの効果を確認します。
例によってmcmを使います。正弦波を生成してコーデックに送るクラスを作ります。クラス内部にはオシレーターとしてDDSを内蔵しています。
#ifndef INCL_GEN
#define INCL_GEN
#include "mcm2191.h"
#include "dds.h"
class CGen : public mcm::fwEzKit2191
{
private:
        dds::CDDS * osc;                // 正弦波生成
public: 
    CGen();
    virtual void handleBuffer( struct mcm::sample * bufTx, 
                               struct mcm::sample * bufRx );
};
#endif
コンストラクタはoscに新しいオブジェクトを代入します。周波数として設定しているのは 0x0553_F7CF です。これは以下の式で求められます。
(freqH,freqL) = ( 2^32 / 48000 ) * 999
上の式48000はサンプリング周波数です。handleBufferメソッドの中ではオシレーターから正弦波をbufTxにコピーし、最後に絶対値を小さくして聞きやすい大きさにします。
#include "gen.h"
CGen::CGen() : mcm::fwEzKit2191()
{
    osc = new dds::CSinCosDDS( 0x553, 0xf7cf );
}
void CGen::handleBuffer( struct mcm::sample * bufTx, 
                         struct mcm::sample * bufRx )
{
    osc ->run( (int *)&bufTx[0].l, sizeof( mcm::sample ), bufSize );
    for ( int i=0; i< this->bufSize; i++ ){
        bufTx[i].r = bufTx[i].l = bufTx[i].l>>4;
    }
}
そういう風に作ったのですからあたりまえですが、まっとうな999Hzの音がします。いやぁ、澄んだいい音です。
おわり