osc.cpp

説明を見る。
00001 /** \file
00002 * 発振器クラスの定義 
00003 */
00004 
00005 #include "osc.h"
00006 namespace osc{
00007         /** cosの上位位相分
00008         *
00009         * 全周を256分割したコサイン・テーブル。 
00010         */
00011     extern shortfract co_h[];
00012         /** cosの下位位相分
00013         *
00014         * 全周の256分の1をさらに256分割したコサイン・テーブル。 
00015         */
00016     extern shortfract co_l[];
00017         /** sinの上位位相分
00018         *
00019         * 全周を256分割したサイン・テーブル。 
00020         */
00021     extern shortfract si_h[];
00022         /** sinの下位位相分
00023         *
00024         * 全周の256分の1をさらに256分割したサイン・テーブル。 
00025         */
00026     extern shortfract si_l[];
00027     
00028         // すべての発振器クラスが共用するコンストラクタ
00029     COscillator::COscillator( int freq )
00030     {
00031         this->setFreq( freq );
00032         this->setPhase( 0 );
00033     }
00034     
00035         // すべての発振器クラスが共用する周波数設定プログラム
00036     void COscillator::setFreq( int freq )
00037     {
00038         this->frequency = freq;
00039     }
00040     
00041         // すべての発振器クラスが共用する位相設定プログラム 
00042     void COscillator::setPhase( unsigned int phase )
00043     {
00044         this->phase = phase;
00045     }
00046 
00047 
00048 
00049     void CTableLookup::run( shortfract i[], shortfract q[], int count )
00050     {
00051         for ( int j=0; j<count; j++ ){
00052                 // 32bitの位相の内、上位16bitのみを使う。
00053             unsigned int hi = ( this->phase >> 24 ) & 0xFF;     // 16bit位相の上位8bit
00054             unsigned int lo = ( this->phase >> 16 ) & 0xFF;     //  8bit位相の下位8bit
00055             
00056                 // 加法定理 cos(A+B) = cos(A)cos(B) - sin(A)sin(B)
00057                 // 加法定理 sin(A+B) = sin(A)cos(B) + cos(A)sin(B)
00058                     // アセンブリ言語による実装
00059             asm(    "a0 = %2*%3;\n"         // cos_h*cos_l
00060                     "%0=(a0-=%4*%5);\n"     // sin_h*sin_l
00061                     "a0 = %4*%3;\n"         // sin_h*cos_l
00062                     "%1=(a0+=%2*%5);\n"     // cos_h*sin_l
00063                     : "=&l"(i[j].v), "=&l"(q[j].v)
00064                     : "l"(co_h[hi].v), "l"(co_l[lo].v), "l"(si_h[hi].v), "l"(si_l[lo].v)
00065                     : "a0"
00066                     );  
00067                 // 位相の更新
00068             this->phase += this->frequency;
00069         }
00070     }
00071 
00072     void CTableLookup::run( shortfract i[], int count )
00073     {
00074         for ( int j=0; j<count; j++ ){
00075                 // 32bitの位相の内、上位16bitのみを使う。
00076             unsigned int hi = ( this->phase >> 24 ) & 0xFF;     // 16bit位相の上位8bit
00077             unsigned int lo = ( this->phase >> 16 ) & 0xFF;     //  8bit位相の下位8bit
00078             
00079                 // 加法定理 cos(A+B) = cos(A)cos(B) - sin(A)sin(B)
00080             asm(    "a0 = %1*%2;\n" 
00081                     "%0=(a0-=%3*%4);\n" 
00082                     : "=l"(i[j].v)
00083                     : "l"(co_h[hi].v), "l"(co_l[lo].v), "l"(si_h[hi].v), "l"(si_l[lo].v)
00084                     : "a0"
00085                     );      
00086                 // 位相の更新
00087             this->phase += this->frequency;
00088 
00089         }
00090     }
00091 
00092     void CTableLookup::run( shortfract i[], int deviation[], int count )
00093     {
00094         for ( int j=0; j<count; j++ ){
00095                 // 32bitの位相の内、上位16bitのみを使う。
00096             unsigned int hi = ( this->phase >> 24 ) & 0xFF;     // 16bit位相の上位8bit
00097             unsigned int lo = ( this->phase >> 16 ) & 0xFF;     //  8bit位相の下位8bit
00098             
00099                 // 加法定理 cos(A+B) = cos(A)cos(B) - sin(A)sin(B)
00100             asm(    "a0 = %1*%2;\n" 
00101                     "%0=(a0-=%3*%4);\n" 
00102                     : "=l"(i[j].v)
00103                     : "l"(co_h[hi].v), "l"(co_l[lo].v), "l"(si_h[hi].v), "l"(si_l[lo].v)
00104                     : "a0"
00105                     );      
00106                 // 位相の更新
00107             this->phase += this->frequency + deviation[j];
00108 
00109         }
00110     }
00111         /** ルックアップ・テーブルのサイズ
00112         * 
00113         * sine/cosineの計算をするための基本ルックアップテーブルのサイズ。
00114         * 16bit位相を8bit/8bitに分割するので、ルックアップテーブルのサイズは
00115         * 256になる
00116         */
00117     const int tableSize = 256;
00118     
00119         /** cosの上位位相分
00120         *
00121         * 全周を256分割したコサイン・テーブル。 
00122         */
00123     shortfract co_h[tableSize]= {
00124            32767,
00125            32757,
00126            32728,
00127            32678,
00128            32609,
00129            32521,
00130            32412,
00131            32285,
00132            32137,
00133            31971,
00134            31785,
00135            31580,
00136            31356,
00137            31113,
00138            30852,
00139            30571,
00140            30273,
00141            29956,
00142            29621,
00143            29268,
00144            28898,
00145            28510,
00146            28105,
00147            27683,
00148            27245,
00149            26790,
00150            26319,
00151            25832,
00152            25329,
00153            24811,
00154            24279,
00155            23731,
00156            23170,
00157            22594,
00158            22005,
00159            21403,
00160            20787,
00161            20159,
00162            19519,
00163            18868,
00164            18204,
00165            17530,
00166            16846,
00167            16151,
00168            15446,
00169            14732,
00170            14010,
00171            13279,
00172            12539,
00173            11793,
00174            11039,
00175            10278,
00176             9512,
00177             8739,
00178             7962,
00179             7179,
00180             6393,
00181             5602,
00182             4808,
00183             4011,
00184             3212,
00185             2410,
00186             1608,
00187              804,
00188                0,
00189             -804,
00190            -1608,
00191            -2410,
00192            -3212,
00193            -4011,
00194            -4808,
00195            -5602,
00196            -6393,
00197            -7179,
00198            -7962,
00199            -8739,
00200            -9512,
00201           -10278,
00202           -11039,
00203           -11793,
00204           -12539,
00205           -13279,
00206           -14010,
00207           -14732,
00208           -15446,
00209           -16151,
00210           -16846,
00211           -17530,
00212           -18204,
00213           -18868,
00214           -19519,
00215           -20159,
00216           -20787,
00217           -21403,
00218           -22005,
00219           -22594,
00220           -23170,
00221           -23731,
00222           -24279,
00223           -24811,
00224           -25329,
00225           -25832,
00226           -26319,
00227           -26790,
00228           -27245,
00229           -27683,
00230           -28105,
00231           -28510,
00232           -28898,
00233           -29268,
00234           -29621,
00235           -29956,
00236           -30273,
00237           -30571,
00238           -30852,
00239           -31113,
00240           -31356,
00241           -31580,
00242           -31785,
00243           -31971,
00244           -32137,
00245           -32285,
00246           -32412,
00247           -32521,
00248           -32609,
00249           -32678,
00250           -32728,
00251           -32757,
00252           -32767,
00253           -32757,
00254           -32728,
00255           -32678,
00256           -32609,
00257           -32521,
00258           -32412,
00259           -32285,
00260           -32137,
00261           -31971,
00262           -31785,
00263           -31580,
00264           -31356,
00265           -31113,
00266           -30852,
00267           -30571,
00268           -30273,
00269           -29956,
00270           -29621,
00271           -29268,
00272           -28898,
00273           -28510,
00274           -28105,
00275           -27683,
00276           -27245,
00277           -26790,
00278           -26319,
00279           -25832,
00280           -25329,
00281           -24811,
00282           -24279,
00283           -23731,
00284           -23170,
00285           -22594,
00286           -22005,
00287           -21403,
00288           -20787,
00289           -20159,
00290           -19519,
00291           -18868,
00292           -18204,
00293           -17530,
00294           -16846,
00295           -16151,
00296           -15446,
00297           -14732,
00298           -14010,
00299           -13279,
00300           -12539,
00301           -11793,
00302           -11039,
00303           -10278,
00304            -9512,
00305            -8739,
00306            -7962,
00307            -7179,
00308            -6393,
00309            -5602,
00310            -4808,
00311            -4011,
00312            -3212,
00313            -2410,
00314            -1608,
00315             -804,
00316                0,
00317              804,
00318             1608,
00319             2410,
00320             3212,
00321             4011,
00322             4808,
00323             5602,
00324             6393,
00325             7179,
00326             7962,
00327             8739,
00328             9512,
00329            10278,
00330            11039,
00331            11793,
00332            12539,
00333            13279,
00334            14010,
00335            14732,
00336            15446,
00337            16151,
00338            16846,
00339            17530,
00340            18204,
00341            18868,
00342            19519,
00343            20159,
00344            20787,
00345            21403,
00346            22005,
00347            22594,
00348            23170,
00349            23731,
00350            24279,
00351            24811,
00352            25329,
00353            25832,
00354            26319,
00355            26790,
00356            27245,
00357            27683,
00358            28105,
00359            28510,
00360            28898,
00361            29268,
00362            29621,
00363            29956,
00364            30273,
00365            30571,
00366            30852,
00367            31113,
00368            31356,
00369            31580,
00370            31785,
00371            31971,
00372            32137,
00373            32285,
00374            32412,
00375            32521,
00376            32609,
00377            32678,
00378            32728,
00379            32757
00380     };
00381         /** cosの下位位相分
00382         *
00383         * 全周の256分の1をさらに256分割したコサイン・テーブル。 
00384         */
00385     shortfract co_l[tableSize]= {
00386            32767,
00387            32767,
00388            32767,
00389            32767,
00390            32767,
00391            32767,
00392            32767,
00393            32767,
00394            32767,
00395            32767,
00396            32767,
00397            32767,
00398            32767,
00399            32767,
00400            32767,
00401            32767,
00402            32767,
00403            32767,
00404            32767,
00405            32767,
00406            32767,
00407            32767,
00408            32767,
00409            32767,
00410            32767,
00411            32767,
00412            32767,
00413            32767,
00414            32767,
00415            32767,
00416            32767,
00417            32767,
00418            32767,
00419            32767,
00420            32767,
00421            32767,
00422            32767,
00423            32767,
00424            32767,
00425            32767,
00426            32767,
00427            32767,
00428            32767,
00429            32767,
00430            32767,
00431            32767,
00432            32767,
00433            32767,
00434            32767,
00435            32767,
00436            32767,
00437            32767,
00438            32767,
00439            32767,
00440            32767,
00441            32767,
00442            32767,
00443            32767,
00444            32766,
00445            32766,
00446            32766,
00447            32766,
00448            32766,
00449            32766,
00450            32766,
00451            32766,
00452            32766,
00453            32766,
00454            32766,
00455            32766,
00456            32766,
00457            32766,
00458            32766,
00459            32766,
00460            32766,
00461            32766,
00462            32766,
00463            32766,
00464            32766,
00465            32766,
00466            32766,
00467            32766,
00468            32766,
00469            32766,
00470            32766,
00471            32766,
00472            32766,
00473            32766,
00474            32766,
00475            32766,
00476            32766,
00477            32766,
00478            32766,
00479            32766,
00480            32766,
00481            32766,
00482            32766,
00483            32766,
00484            32766,
00485            32766,
00486            32765,
00487            32765,
00488            32765,
00489            32765,
00490            32765,
00491            32765,
00492            32765,
00493            32765,
00494            32765,
00495            32765,
00496            32765,
00497            32765,
00498            32765,
00499            32765,
00500            32765,
00501            32765,
00502            32765,
00503            32765,
00504            32765,
00505            32765,
00506            32765,
00507            32765,
00508            32765,
00509            32765,
00510            32765,
00511            32765,
00512            32765,
00513            32765,
00514            32765,
00515            32764,
00516            32764,
00517            32764,
00518            32764,
00519            32764,
00520            32764,
00521            32764,
00522            32764,
00523            32764,
00524            32764,
00525            32764,
00526            32764,
00527            32764,
00528            32764,
00529            32764,
00530            32764,
00531            32764,
00532            32764,
00533            32764,
00534            32764,
00535            32764,
00536            32764,
00537            32764,
00538            32764,
00539            32763,
00540            32763,
00541            32763,
00542            32763,
00543            32763,
00544            32763,
00545            32763,
00546            32763,
00547            32763,
00548            32763,
00549            32763,
00550            32763,
00551            32763,
00552            32763,
00553            32763,
00554            32763,
00555            32763,
00556            32763,
00557            32763,
00558            32763,
00559            32762,
00560            32762,
00561            32762,
00562            32762,
00563            32762,
00564            32762,
00565            32762,
00566            32762,
00567            32762,
00568            32762,
00569            32762,
00570            32762,
00571            32762,
00572            32762,
00573            32762,
00574            32762,
00575            32762,
00576            32762,
00577            32762,
00578            32761,
00579            32761,
00580            32761,
00581            32761,
00582            32761,
00583            32761,
00584            32761,
00585            32761,
00586            32761,
00587            32761,
00588            32761,
00589            32761,
00590            32761,
00591            32761,
00592            32761,
00593            32761,
00594            32760,
00595            32760,
00596            32760,
00597            32760,
00598            32760,
00599            32760,
00600            32760,
00601            32760,
00602            32760,
00603            32760,
00604            32760,
00605            32760,
00606            32760,
00607            32760,
00608            32760,
00609            32760,
00610            32759,
00611            32759,
00612            32759,
00613            32759,
00614            32759,
00615            32759,
00616            32759,
00617            32759,
00618            32759,
00619            32759,
00620            32759,
00621            32759,
00622            32759,
00623            32759,
00624            32758,
00625            32758,
00626            32758,
00627            32758,
00628            32758,
00629            32758,
00630            32758,
00631            32758,
00632            32758,
00633            32758,
00634            32758,
00635            32758,
00636            32758,
00637            32758,
00638            32757,
00639            32757,
00640            32757,
00641            32757
00642     };
00643         /** sinの上位位相分
00644         *
00645         * 全周を256分割したサイン・テーブル。 
00646         */
00647     shortfract si_h[tableSize]= {
00648                0,
00649              804,
00650             1608,
00651             2410,
00652             3212,
00653             4011,
00654             4808,
00655             5602,
00656             6393,
00657             7179,
00658             7962,
00659             8739,
00660             9512,
00661            10278,
00662            11039,
00663            11793,
00664            12539,
00665            13279,
00666            14010,
00667            14732,
00668            15446,
00669            16151,
00670            16846,
00671            17530,
00672            18204,
00673            18868,
00674            19519,
00675            20159,
00676            20787,
00677            21403,
00678            22005,
00679            22594,
00680            23170,
00681            23731,
00682            24279,
00683            24811,
00684            25329,
00685            25832,
00686            26319,
00687            26790,
00688            27245,
00689            27683,
00690            28105,
00691            28510,
00692            28898,
00693            29268,
00694            29621,
00695            29956,
00696            30273,
00697            30571,
00698            30852,
00699            31113,
00700            31356,
00701            31580,
00702            31785,
00703            31971,
00704            32137,
00705            32285,
00706            32412,
00707            32521,
00708            32609,
00709            32678,
00710            32728,
00711            32757,
00712            32767,
00713            32757,
00714            32728,
00715            32678,
00716            32609,
00717            32521,
00718            32412,
00719            32285,
00720            32137,
00721            31971,
00722            31785,
00723            31580,
00724            31356,
00725            31113,
00726            30852,
00727            30571,
00728            30273,
00729            29956,
00730            29621,
00731            29268,
00732            28898,
00733            28510,
00734            28105,
00735            27683,
00736            27245,
00737            26790,
00738            26319,
00739            25832,
00740            25329,
00741            24811,
00742            24279,
00743            23731,
00744            23170,
00745            22594,
00746            22005,
00747            21403,
00748            20787,
00749            20159,
00750            19519,
00751            18868,
00752            18204,
00753            17530,
00754            16846,
00755            16151,
00756            15446,
00757            14732,
00758            14010,
00759            13279,
00760            12539,
00761            11793,
00762            11039,
00763            10278,
00764             9512,
00765             8739,
00766             7962,
00767             7179,
00768             6393,
00769             5602,
00770             4808,
00771             4011,
00772             3212,
00773             2410,
00774             1608,
00775              804,
00776                0,
00777             -804,
00778            -1608,
00779            -2410,
00780            -3212,
00781            -4011,
00782            -4808,
00783            -5602,
00784            -6393,
00785            -7179,
00786            -7962,
00787            -8739,
00788            -9512,
00789           -10278,
00790           -11039,
00791           -11793,
00792           -12539,
00793           -13279,
00794           -14010,
00795           -14732,
00796           -15446,
00797           -16151,
00798           -16846,
00799           -17530,
00800           -18204,
00801           -18868,
00802           -19519,
00803           -20159,
00804           -20787,
00805           -21403,
00806           -22005,
00807           -22594,
00808           -23170,
00809           -23731,
00810           -24279,
00811           -24811,
00812           -25329,
00813           -25832,
00814           -26319,
00815           -26790,
00816           -27245,
00817           -27683,
00818           -28105,
00819           -28510,
00820           -28898,
00821           -29268,
00822           -29621,
00823           -29956,
00824           -30273,
00825           -30571,
00826           -30852,
00827           -31113,
00828           -31356,
00829           -31580,
00830           -31785,
00831           -31971,
00832           -32137,
00833           -32285,
00834           -32412,
00835           -32521,
00836           -32609,
00837           -32678,
00838           -32728,
00839           -32757,
00840           -32767,
00841           -32757,
00842           -32728,
00843           -32678,
00844           -32609,
00845           -32521,
00846           -32412,
00847           -32285,
00848           -32137,
00849           -31971,
00850           -31785,
00851           -31580,
00852           -31356,
00853           -31113,
00854           -30852,
00855           -30571,
00856           -30273,
00857           -29956,
00858           -29621,
00859           -29268,
00860           -28898,
00861           -28510,
00862           -28105,
00863           -27683,
00864           -27245,
00865           -26790,
00866           -26319,
00867           -25832,
00868           -25329,
00869           -24811,
00870           -24279,
00871           -23731,
00872           -23170,
00873           -22594,
00874           -22005,
00875           -21403,
00876           -20787,
00877           -20159,
00878           -19519,
00879           -18868,
00880           -18204,
00881           -17530,
00882           -16846,
00883           -16151,
00884           -15446,
00885           -14732,
00886           -14010,
00887           -13279,
00888           -12539,
00889           -11793,
00890           -11039,
00891           -10278,
00892            -9512,
00893            -8739,
00894            -7962,
00895            -7179,
00896            -6393,
00897            -5602,
00898            -4808,
00899            -4011,
00900            -3212,
00901            -2410,
00902            -1608,
00903             -804
00904     };
00905         /** sinの下位位相分
00906         *
00907         * 全周の256分の1をさらに256分割したサイン・テーブル。 
00908         */
00909     shortfract si_l[tableSize]= {
00910            0,
00911            3,
00912            6,
00913            9,
00914           13,
00915           16,
00916           19,
00917           22,
00918           25,
00919           28,
00920           31,
00921           35,
00922           38,
00923           41,
00924           44,
00925           47,
00926           50,
00927           53,
00928           57,
00929           60,
00930           63,
00931           66,
00932           69,
00933           72,
00934           75,
00935           79,
00936           82,
00937           85,
00938           88,
00939           91,
00940           94,
00941           97,
00942          101,
00943          104,
00944          107,
00945          110,
00946          113,
00947          116,
00948          119,
00949          123,
00950          126,
00951          129,
00952          132,
00953          135,
00954          138,
00955          141,
00956          145,
00957          148,
00958          151,
00959          154,
00960          157,
00961          160,
00962          163,
00963          166,
00964          170,
00965          173,
00966          176,
00967          179,
00968          182,
00969          185,
00970          188,
00971          192,
00972          195,
00973          198,
00974          201,
00975          204,
00976          207,
00977          210,
00978          214,
00979          217,
00980          220,
00981          223,
00982          226,
00983          229,
00984          232,
00985          236,
00986          239,
00987          242,
00988          245,
00989          248,
00990          251,
00991          254,
00992          258,
00993          261,
00994          264,
00995          267,
00996          270,
00997          273,
00998          276,
00999          280,
01000          283,
01001          286,
01002          289,
01003          292,
01004          295,
01005          298,
01006          302,
01007          305,
01008          308,
01009          311,
01010          314,
01011          317,
01012          320,
01013          324,
01014          327,
01015          330,
01016          333,
01017          336,
01018          339,
01019          342,
01020          346,
01021          349,
01022          352,
01023          355,
01024          358,
01025          361,
01026          364,
01027          368,
01028          371,
01029          374,
01030          377,
01031          380,
01032          383,
01033          386,
01034          390,
01035          393,
01036          396,
01037          399,
01038          402,
01039          405,
01040          408,
01041          412,
01042          415,
01043          418,
01044          421,
01045          424,
01046          427,
01047          430,
01048          434,
01049          437,
01050          440,
01051          443,
01052          446,
01053          449,
01054          452,
01055          456,
01056          459,
01057          462,
01058          465,
01059          468,
01060          471,
01061          474,
01062          477,
01063          481,
01064          484,
01065          487,
01066          490,
01067          493,
01068          496,
01069          499,
01070          503,
01071          506,
01072          509,
01073          512,
01074          515,
01075          518,
01076          521,
01077          525,
01078          528,
01079          531,
01080          534,
01081          537,
01082          540,
01083          543,
01084          547,
01085          550,
01086          553,
01087          556,
01088          559,
01089          562,
01090          565,
01091          569,
01092          572,
01093          575,
01094          578,
01095          581,
01096          584,
01097          587,
01098          591,
01099          594,
01100          597,
01101          600,
01102          603,
01103          606,
01104          609,
01105          613,
01106          616,
01107          619,
01108          622,
01109          625,
01110          628,
01111          631,
01112          635,
01113          638,
01114          641,
01115          644,
01116          647,
01117          650,
01118          653,
01119          657,
01120          660,
01121          663,
01122          666,
01123          669,
01124          672,
01125          675,
01126          679,
01127          682,
01128          685,
01129          688,
01130          691,
01131          694,
01132          697,
01133          701,
01134          704,
01135          707,
01136          710,
01137          713,
01138          716,
01139          719,
01140          722,
01141          726,
01142          729,
01143          732,
01144          735,
01145          738,
01146          741,
01147          744,
01148          748,
01149          751,
01150          754,
01151          757,
01152          760,
01153          763,
01154          766,
01155          770,
01156          773,
01157          776,
01158          779,
01159          782,
01160          785,
01161          788,
01162          792,
01163          795,
01164          798,
01165          801
01166      };
01167 };
01168 

tremoloに対してWed Jul 25 11:09:49 2007に生成されました。  doxygen 1.5.2