音を聞いてみる

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

おわり

2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |