osc.h

説明を見る。
00001 #pragma once
00002 #include <shortfract>
00003 /** \file
00004 * 発振器クラスの宣言
00005 */
00006 
00007 /** 発振器クラスの名前空間
00008 *
00009 */
00010 
00011 namespace osc{
00012 /** 抽象発振器クラス
00013 *
00014 * 発振器クラスの親となる抽象クラス。現在の位相と周波数を内部に保持する。
00015 * 位相は2πを32bit符号なし整数にマッピングする。すなわち1周期を40億ステップ
00016 * に分解する。
00017 * 周波数は1サンプルに変化する量(dθ/dt)で指定する。32bit符号つき数である。
00018 */
00019     class COscillator{
00020     protected:
00021             /** 内部位相
00022             *
00023             * 内部位相は32ビット符号なし数である。この位相はrunメソッドで更新
00024             * していく。フルスケールが2πに相当する。
00025             */
00026         unsigned int phase;
00027             /** 周波数
00028             *
00029             * 周波数は32ビット数である。周波数はコンストラクタで指定
00030             * するほかsetFreqメソッドで再設定することもできる。
00031             */
00032         int frequency;
00033     public:
00034             /** コンストラクタ
00035             *
00036             * 周波数を指定する。内部位相は0になる。サンプル周波数
00037             * をfsとし、希望する周波数をfrとすると、コンストラクタに渡すべき値
00038             * freqは、 freq=fr*(2^32)/fs で得ることができる。
00039             */
00040         COscillator( int freq );
00041             /** 周波数の再設定
00042             *
00043             * \param freq 32bit 周波数。
00044             *
00045             * 内部位相を変更せずに周波数を再設定する。
00046             * サンプル周波数をfsとし、希望する周波数をfrとすると、
00047             * コンストラクタに渡すべき値
00048             * freqは、 freq=fr*(2^32)/fs で得ることができる。
00049             */
00050         virtual void setFreq( int freq );
00051             /** 位相の再設定
00052             *
00053             * \param phase 32bit の周波数。
00054             *
00055             * 内部周波数を変更せずに位相を再設定する。
00056             * 0から2^32-1の値で、0-2πを表現する。
00057             */
00058         virtual void setPhase( unsigned int phase );
00059             /** 複素信号の生成
00060             *
00061             * \param i コサイン波信号の出力配列
00062             * \param q サイン波信号の出力配列
00063             * \param count それぞれの配列に出力するサンプル数
00064             *
00065             * 発振器の内部位相をもとに、コサイン波とサイン波を生成する
00066             * 純粋仮想関数。
00067             */
00068         virtual void run( shortfract i[], shortfract q[], int count ) = 0;
00069             /** 信号の生成
00070             *
00071             * \param i コサイン波信号の出力配列
00072             * \param count 配列に出力するサンプル数
00073             *
00074             * 発振器の内部位相をもとに、コサイン波を生成する純粋仮想関数。
00075             */
00076         virtual void run( shortfract i[], int count ) = 0;
00077             /** FM信号の生成
00078             *
00079             * \param i コサイン波信号の出力配列
00080             * \param deviation 周波数偏移を指定する配列
00081             * \param count 配列に出力するサンプル数
00082             *
00083             * 発振器の内部位相をもとに、コサイン波を生成する純粋仮想関数。
00084             * deviation[]によって、サンプルごとに周波数偏移を指定することが
00085             * できる。偏移させたい周波数をfr、サンプル周波数をfsとすると、
00086             * deviation[i]に与える量は fr*(2^32)/fs である。
00087             */
00088         virtual void run( shortfract i[], int deviation[], int count ) = 0;
00089     };
00090 
00091 /** 発振器クラス
00092 *
00093 * 内部の位相と周波数情報を元に、コサイン波、サイン波を生成する。
00094 * 生成にはテーブル・ルックアップを使う。2πを256分割したテーブル
00095 * と、2π/256をさらに256分割した二つのテーブルを用意する。それぞれ
00096 * cosとsinのデータを持っている。この二つのテーブルを元に16bitイン
00097 * デックスに対する三角関数を加法定理を元に計算する。
00098 */
00099     class CTableLookup : public COscillator{
00100     public:
00101             /** コンストラクタ
00102             *
00103             * 周波数を指定する。内部位相は0になる。サンプル周波数
00104             * をfsとし、希望する周波数をfrとすると、コンストラクタに渡すべき値
00105             * freqは、 freq=fr*(2^32)/fs で得ることができる。
00106             */      
00107         CTableLookup( int freq ) : COscillator( freq ) {};
00108             /** 信号の生成
00109             *
00110             * \param i コサイン波信号の出力配列
00111             * \param q サイン波信号の出力配列
00112             * \param count それぞれの配列に出力するサンプル数
00113             *
00114             * 発振器の内部位相をもとに、コサイン波とサイン波を生成する。
00115             * 生成アルゴリズムはテーブル参照に基づく。
00116             */
00117         virtual void run( shortfract i[], shortfract q[], int count );
00118             /** 複素信号の生成
00119             *
00120             * \param i コサイン波信号の出力配列
00121             * \param count 配列に出力するサンプル数
00122             *
00123             * 発振器の内部位相をもとに、コサイン波を生成する。
00124             * 生成アルゴリズムはテーブル参照に基づく。
00125             */
00126         virtual void run( shortfract i[], int count );
00127             /** FM信号の生成
00128             *
00129             * \param i コサイン波信号の出力配列
00130             * \param deviation 周波数偏移を指定する配列
00131             * \param count 配列に出力するサンプル数
00132             *
00133             * 発振器の内部位相をもとに、コサイン波を生成する関数。
00134             * deviation[]によって、サンプルごとに周波数偏移を指定することが
00135             * できる。偏移させたい周波数をfr、サンプル周波数をfsとすると、
00136             * deviation[i]に与える量は fr*(2^32)/fs である。
00137             */
00138         virtual void run( shortfract i[], int deviation[], int count );
00139     };
00140     
00141 
00142 
00143 
00144         /** cosの上位位相分
00145         *
00146         * 全周を256分割したコサイン・テーブル。 
00147         */
00148     extern shortfract co_h[];
00149         /** cosの下位位相分
00150         *
00151         * 全周の256分の1をさらに256分割したコサイン・テーブル。 
00152         */
00153     extern shortfract co_l[];
00154         /** sinの上位位相分
00155         *
00156         * 全周を256分割したサイン・テーブル。 
00157         */
00158     extern shortfract si_h[];
00159         /** sinの下位位相分
00160         *
00161         * 全周の256分の1をさらに256分割したサイン・テーブル。 
00162         */
00163     extern shortfract si_l[];
00164 };

Flangerに対してWed Jul 25 11:10:16 2007に生成されました。  doxygen 1.5.2