任意周波数の生成: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の音がします。いやぁ、澄んだいい音です。
おわり