//******************************************************* // A/D convert -> Static Adaptive Filter -> PWM out wave // 7.37MHz Internal RC oscillator, 16x PLL enabled // Fcy=7.37MHzx16/4=29.48MHz, Tcy=33.92ns // Toshio Iwata at DIGITALFILTER.COM all rights reserved // Last modified on 2007/06/06 //========================================================= // // オリジナル・プログラムは、上記コメントの岩田さん // // dsPIC30F4013による各種FIRフィルタの実験(PWM+LPF出力) // 2012+ブートローダー使用を、4013+PICkit2に変更して実験 // 「自作FRAもどき」にて周波数特性を確認してみる。 // // 2016/3/17 N.Ishii //******************************************************* // パワーオン時のプッシュスイッチ SW1=1, SW2=1 : LPF // パワーオン時のプッシュスイッチ SW1=0, SW2=1 : HPF // パワーオン時のプッシュスイッチ SW1=1, SW2=0 : BPF // パワーオン時のプッシュスイッチ SW1=0, SW2=0 : BRF //#include #include #include #include #include // configuration _FWDT(WDT_OFF); _FGS(CODE_PROT_OFF); _FOSC(CSW_FSCM_OFF & FRC_PLL16); _FBORPOR(PBOR_OFF & PWRT_64 & MCLR_EN); // A/D control register unsigned int _ADCON1; unsigned int _ADCON2; unsigned int _ADCON3; unsigned int _ADCHS; unsigned int _ADPCFG; unsigned int _ADCSSL; // PWM control register unsigned int _PTCON; unsigned int _PWMCON1; unsigned int _PWMCON2; // data unsigned int ResultData; int DelayLine[127]; int Coeff[127]; int outdata; int indata; void CoeffInitLpf() { // FIR型LPFの係数を代入(1kHz以下を通すフィルタ) //Generated by DSPLinks //U_4 //Remez Algorithm LPF //Sampling Frequency = 28800.0 //cutoff1 = 1100.0000000 //cutoff2 = 1900.0000000 //Tap Count = 127 //attenuate = -80.00 //ripple factor = 0.1000000 //Quantized by 16 [bits] Coeff[ 0 ] = -3 ; Coeff[ 1 ] = -4 ; Coeff[ 2 ] = -6 ; Coeff[ 3 ] = -8 ; Coeff[ 4 ] = -11 ; Coeff[ 5 ] = -14 ; Coeff[ 6 ] = -15 ; Coeff[ 7 ] = -16 ; Coeff[ 8 ] = -15 ; Coeff[ 9 ] = -12 ; Coeff[ 10 ] = -6 ; Coeff[ 11 ] = 1 ; Coeff[ 12 ] = 11 ; Coeff[ 13 ] = 22 ; Coeff[ 14 ] = 34 ; Coeff[ 15 ] = 46 ; Coeff[ 16 ] = 56 ; Coeff[ 17 ] = 62 ; Coeff[ 18 ] = 63 ; Coeff[ 19 ] = 58 ; Coeff[ 20 ] = 47 ; Coeff[ 21 ] = 29 ; Coeff[ 22 ] = 5 ; Coeff[ 23 ] = -22 ; Coeff[ 24 ] = -53 ; Coeff[ 25 ] = -83 ; Coeff[ 26 ] = -109 ; Coeff[ 27 ] = -127 ; Coeff[ 28 ] = -135 ; Coeff[ 29 ] = -129 ; Coeff[ 30 ] = -109 ; Coeff[ 31 ] = -73 ; Coeff[ 32 ] = -24 ; Coeff[ 33 ] = 34 ; Coeff[ 34 ] = 99 ; Coeff[ 35 ] = 164 ; Coeff[ 36 ] = 221 ; Coeff[ 37 ] = 264 ; Coeff[ 38 ] = 286 ; Coeff[ 39 ] = 281 ; Coeff[ 40 ] = 245 ; Coeff[ 41 ] = 178 ; Coeff[ 42 ] = 82 ; Coeff[ 43 ] = -37 ; Coeff[ 44 ] = -173 ; Coeff[ 45 ] = -311 ; Coeff[ 46 ] = -440 ; Coeff[ 47 ] = -544 ; Coeff[ 48 ] = -607 ; Coeff[ 49 ] = -617 ; Coeff[ 50 ] = -562 ; Coeff[ 51 ] = -435 ; Coeff[ 52 ] = -232 ; Coeff[ 53 ] = 42 ; Coeff[ 54 ] = 382 ; Coeff[ 55 ] = 772 ; Coeff[ 56 ] = 1196 ; Coeff[ 57 ] = 1632 ; Coeff[ 58 ] = 2056 ; Coeff[ 59 ] = 2443 ; Coeff[ 60 ] = 2773 ; Coeff[ 61 ] = 3023 ; Coeff[ 62 ] = 3180 ; Coeff[ 63 ] = 3234 ; Coeff[ 64 ] = 3180 ; Coeff[ 65 ] = 3023 ; Coeff[ 66 ] = 2773 ; Coeff[ 67 ] = 2443 ; Coeff[ 68 ] = 2056 ; Coeff[ 69 ] = 1632 ; Coeff[ 70 ] = 1196 ; Coeff[ 71 ] = 772 ; Coeff[ 72 ] = 382 ; Coeff[ 73 ] = 42 ; Coeff[ 74 ] = -232 ; Coeff[ 75 ] = -435 ; Coeff[ 76 ] = -562 ; Coeff[ 77 ] = -617 ; Coeff[ 78 ] = -607 ; Coeff[ 79 ] = -544 ; Coeff[ 80 ] = -440 ; Coeff[ 81 ] = -311 ; Coeff[ 82 ] = -173 ; Coeff[ 83 ] = -37 ; Coeff[ 84 ] = 82 ; Coeff[ 85 ] = 178 ; Coeff[ 86 ] = 245 ; Coeff[ 87 ] = 281 ; Coeff[ 88 ] = 286 ; Coeff[ 89 ] = 264 ; Coeff[ 90 ] = 221 ; Coeff[ 91 ] = 164 ; Coeff[ 92 ] = 99 ; Coeff[ 93 ] = 34 ; Coeff[ 94 ] = -24 ; Coeff[ 95 ] = -73 ; Coeff[ 96 ] = -109 ; Coeff[ 97 ] = -129 ; Coeff[ 98 ] = -135 ; Coeff[ 99 ] = -127 ; Coeff[ 100 ] = -109 ; Coeff[ 101 ] = -83 ; Coeff[ 102 ] = -53 ; Coeff[ 103 ] = -22 ; Coeff[ 104 ] = 5 ; Coeff[ 105 ] = 29 ; Coeff[ 106 ] = 47 ; Coeff[ 107 ] = 58 ; Coeff[ 108 ] = 63 ; Coeff[ 109 ] = 62 ; Coeff[ 110 ] = 56 ; Coeff[ 111 ] = 46 ; Coeff[ 112 ] = 34 ; Coeff[ 113 ] = 22 ; Coeff[ 114 ] = 11 ; Coeff[ 115 ] = 1 ; Coeff[ 116 ] = -6 ; Coeff[ 117 ] = -12 ; Coeff[ 118 ] = -15 ; Coeff[ 119 ] = -16 ; Coeff[ 120 ] = -15 ; Coeff[ 121 ] = -14 ; Coeff[ 122 ] = -11 ; Coeff[ 123 ] = -8 ; Coeff[ 124 ] = -6 ; Coeff[ 125 ] = -4 ; Coeff[ 126 ] = -3 ; } void CoeffInitHpf() { // FIR型HPFの係数を代入(2kHz以上を通すフィルタ) //Generated by DSPLinks //U_11 //Remez Algorithm HPF //Sampling Frequency = 28800.0 //cutoff1 = 1100.0000000 //cutoff2 = 1900.0000000 //Tap Count = 127 //attenuate = -80.00 //ripple factor = 0.1000000 //Quantized by 16 [bits] Coeff[ 0 ] = 52 ; Coeff[ 1 ] = -12 ; Coeff[ 2 ] = -14 ; Coeff[ 3 ] = -17 ; Coeff[ 4 ] = -19 ; Coeff[ 5 ] = -21 ; Coeff[ 6 ] = -20 ; Coeff[ 7 ] = -16 ; Coeff[ 8 ] = -9 ; Coeff[ 9 ] = 0 ; Coeff[ 10 ] = 12 ; Coeff[ 11 ] = 24 ; Coeff[ 12 ] = 36 ; Coeff[ 13 ] = 44 ; Coeff[ 14 ] = 47 ; Coeff[ 15 ] = 44 ; Coeff[ 16 ] = 33 ; Coeff[ 17 ] = 16 ; Coeff[ 18 ] = -6 ; Coeff[ 19 ] = -32 ; Coeff[ 20 ] = -58 ; Coeff[ 21 ] = -80 ; Coeff[ 22 ] = -94 ; Coeff[ 23 ] = -97 ; Coeff[ 24 ] = -87 ; Coeff[ 25 ] = -64 ; Coeff[ 26 ] = -28 ; Coeff[ 27 ] = 17 ; Coeff[ 28 ] = 67 ; Coeff[ 29 ] = 115 ; Coeff[ 30 ] = 156 ; Coeff[ 31 ] = 181 ; Coeff[ 32 ] = 186 ; Coeff[ 33 ] = 166 ; Coeff[ 34 ] = 122 ; Coeff[ 35 ] = 54 ; Coeff[ 36 ] = -29 ; Coeff[ 37 ] = -122 ; Coeff[ 38 ] = -212 ; Coeff[ 39 ] = -288 ; Coeff[ 40 ] = -336 ; Coeff[ 41 ] = -348 ; Coeff[ 42 ] = -315 ; Coeff[ 43 ] = -237 ; Coeff[ 44 ] = -114 ; Coeff[ 45 ] = 42 ; Coeff[ 46 ] = 218 ; Coeff[ 47 ] = 396 ; Coeff[ 48 ] = 553 ; Coeff[ 49 ] = 665 ; Coeff[ 50 ] = 710 ; Coeff[ 51 ] = 670 ; Coeff[ 52 ] = 531 ; Coeff[ 53 ] = 290 ; Coeff[ 54 ] = -51 ; Coeff[ 55 ] = -478 ; Coeff[ 56 ] = -971 ; Coeff[ 57 ] = -1501 ; Coeff[ 58 ] = -2035 ; Coeff[ 59 ] = -2535 ; Coeff[ 60 ] = -2968 ; Coeff[ 61 ] = -3303 ; Coeff[ 62 ] = -3514 ; Coeff[ 63 ] = 29181 ; Coeff[ 64 ] = -3514 ; Coeff[ 65 ] = -3303 ; Coeff[ 66 ] = -2968 ; Coeff[ 67 ] = -2535 ; Coeff[ 68 ] = -2035 ; Coeff[ 69 ] = -1501 ; Coeff[ 70 ] = -971 ; Coeff[ 71 ] = -478 ; Coeff[ 72 ] = -51 ; Coeff[ 73 ] = 290 ; Coeff[ 74 ] = 531 ; Coeff[ 75 ] = 670 ; Coeff[ 76 ] = 710 ; Coeff[ 77 ] = 665 ; Coeff[ 78 ] = 553 ; Coeff[ 79 ] = 396 ; Coeff[ 80 ] = 218 ; Coeff[ 81 ] = 42 ; Coeff[ 82 ] = -114 ; Coeff[ 83 ] = -237 ; Coeff[ 84 ] = -315 ; Coeff[ 85 ] = -348 ; Coeff[ 86 ] = -336 ; Coeff[ 87 ] = -288 ; Coeff[ 88 ] = -212 ; Coeff[ 89 ] = -122 ; Coeff[ 90 ] = -29 ; Coeff[ 91 ] = 54 ; Coeff[ 92 ] = 122 ; Coeff[ 93 ] = 166 ; Coeff[ 94 ] = 186 ; Coeff[ 95 ] = 181 ; Coeff[ 96 ] = 156 ; Coeff[ 97 ] = 115 ; Coeff[ 98 ] = 67 ; Coeff[ 99 ] = 17 ; Coeff[ 100 ] = -28 ; Coeff[ 101 ] = -64 ; Coeff[ 102 ] = -87 ; Coeff[ 103 ] = -97 ; Coeff[ 104 ] = -94 ; Coeff[ 105 ] = -80 ; Coeff[ 106 ] = -58 ; Coeff[ 107 ] = -32 ; Coeff[ 108 ] = -6 ; Coeff[ 109 ] = 16 ; Coeff[ 110 ] = 33 ; Coeff[ 111 ] = 44 ; Coeff[ 112 ] = 47 ; Coeff[ 113 ] = 44 ; Coeff[ 114 ] = 36 ; Coeff[ 115 ] = 24 ; Coeff[ 116 ] = 12 ; Coeff[ 117 ] = 0 ; Coeff[ 118 ] = -9 ; Coeff[ 119 ] = -16 ; Coeff[ 120 ] = -20 ; Coeff[ 121 ] = -21 ; Coeff[ 122 ] = -19 ; Coeff[ 123 ] = -17 ; Coeff[ 124 ] = -14 ; Coeff[ 125 ] = -12 ; Coeff[ 126 ] = 52 ; } /* void CoeffInitHpf() { // FIR型HPFの係数を代入(2kHz以上を通すフィルタ) //Generated by DSPLinks //U_11 //Remez Algorithm HPF //Sampling Frequency = 28800.0 //cutoff1 = 1100.0000000 //cutoff2 = 1900.0000000 //Tap Count = 127 //attenuate = -40.00(試しに-80から変更:160319) //ripple factor = 0.1000000 //Quantized by 16 [bits] Coeff[ 0 ] = -12; Coeff[ 1 ] = -6; Coeff[ 2 ] = -6; Coeff[ 3 ] = -5; Coeff[ 4 ] = -2; Coeff[ 5 ] = 1; Coeff[ 6 ] = 6; Coeff[ 7 ] = 12; Coeff[ 8 ] = 18; Coeff[ 9 ] = 23; Coeff[ 10 ] = 27; Coeff[ 11 ] = 28; Coeff[ 12 ] = 25; Coeff[ 13 ] = 19; Coeff[ 14 ] = 9; Coeff[ 15 ] = -4; Coeff[ 16 ] = -20; Coeff[ 17 ] = -37; Coeff[ 18 ] = -53; Coeff[ 19 ] = -64; Coeff[ 20 ] = -71; Coeff[ 21 ] = -69; Coeff[ 22 ] = -58; Coeff[ 23 ] = -39; Coeff[ 24 ] = -11; Coeff[ 25 ] = 23; Coeff[ 26 ] = 60; Coeff[ 27 ] = 97; Coeff[ 28 ] = 127; Coeff[ 29 ] = 148; Coeff[ 30 ] = 154; Coeff[ 31 ] = 143; Coeff[ 32 ] = 113; Coeff[ 33 ] = 64; Coeff[ 34 ] = 1; Coeff[ 35 ] = -72; Coeff[ 36 ] = -148; Coeff[ 37 ] = -219; Coeff[ 38 ] = -274; Coeff[ 39 ] = -306; Coeff[ 40 ] = -306; Coeff[ 41 ] = -271; Coeff[ 42 ] = -198; Coeff[ 43 ] = -90; Coeff[ 44 ] = 45; Coeff[ 45 ] = 198; Coeff[ 46 ] = 353; Coeff[ 47 ] = 493; Coeff[ 48 ] = 599; Coeff[ 49 ] = 654; Coeff[ 50 ] = 642; Coeff[ 51 ] = 550; Coeff[ 52 ] = 373; Coeff[ 53 ] = 109; Coeff[ 54 ] = -234; Coeff[ 55 ] = -644; Coeff[ 56 ] = -1101; Coeff[ 57 ] = -1579; Coeff[ 58 ] = -2052; Coeff[ 59 ] = -2489; Coeff[ 60 ] = -2864; Coeff[ 61 ] = -3151; Coeff[ 62 ] = -3331; Coeff[ 63 ] = 29375; Coeff[ 64 ] = -3331; Coeff[ 65 ] = -3151; Coeff[ 66 ] = -2864; Coeff[ 67 ] = -2489; Coeff[ 68 ] = -2052; Coeff[ 69 ] = -1579; Coeff[ 70 ] = -1101; Coeff[ 71 ] = -644; Coeff[ 72 ] = -234; Coeff[ 73 ] = 109; Coeff[ 74 ] = 373; Coeff[ 75 ] = 550; Coeff[ 76 ] = 642; Coeff[ 77 ] = 654; Coeff[ 78 ] = 599; Coeff[ 79 ] = 493; Coeff[ 80 ] = 353; Coeff[ 81 ] = 198; Coeff[ 82 ] = 45; Coeff[ 83 ] = -90; Coeff[ 84 ] = -198; Coeff[ 85 ] = -271; Coeff[ 86 ] = -306; Coeff[ 87 ] = -306; Coeff[ 88 ] = -274; Coeff[ 89 ] = -219; Coeff[ 90 ] = -148; Coeff[ 91 ] = -72; Coeff[ 92 ] = 1; Coeff[ 93 ] = 64; Coeff[ 94 ] = 113; Coeff[ 95 ] = 143; Coeff[ 96 ] = 154; Coeff[ 97 ] = 148; Coeff[ 98 ] = 127; Coeff[ 99 ] = 97; Coeff[ 100 ] = 60; Coeff[ 101 ] = 23; Coeff[ 102 ] = -11; Coeff[ 103 ] = -39; Coeff[ 104 ] = -58; Coeff[ 105 ] = -69; Coeff[ 106 ] = -71; Coeff[ 107 ] = -64; Coeff[ 108 ] = -53; Coeff[ 109 ] = -37; Coeff[ 110 ] = -20; Coeff[ 111 ] = -4; Coeff[ 112 ] = 9; Coeff[ 113 ] = 19; Coeff[ 114 ] = 25; Coeff[ 115 ] = 28; Coeff[ 116 ] = 27; Coeff[ 117 ] = 23; Coeff[ 118 ] = 18; Coeff[ 119 ] = 12; Coeff[ 120 ] = 6; Coeff[ 121 ] = 1; Coeff[ 122 ] = -2; Coeff[ 123 ] = -5; Coeff[ 124 ] = -6; Coeff[ 125 ] = -6; Coeff[ 126 ] = -12; } */ void CoeffInitBpf() { // FIR型BPFの係数を代入(1kHz〜2kHzを通すフィルタ) //Generated by DSPLinks //U_12 //Remez Algorithm BPF //Sampling Frequency = 28800.0 //cutoff1 = 550.0000000 //cutoff2 = 950.0000000 //cutoff3 = 2100.0000000 //cutoff4 = 2500.0000000 //Tap Count = 127 //attenuate = -55.00 //ripple factor = 0.3000000 //Quantized by 16 [bits] Coeff[ 0 ] = 48 ; Coeff[ 1 ] = -56 ; Coeff[ 2 ] = -10 ; Coeff[ 3 ] = 26 ; Coeff[ 4 ] = 61 ; Coeff[ 5 ] = 95 ; Coeff[ 6 ] = 123 ; Coeff[ 7 ] = 140 ; Coeff[ 8 ] = 140 ; Coeff[ 9 ] = 117 ; Coeff[ 10 ] = 69 ; Coeff[ 11 ] = 1 ; Coeff[ 12 ] = -77 ; Coeff[ 13 ] = -156 ; Coeff[ 14 ] = -221 ; Coeff[ 15 ] = -259 ; Coeff[ 16 ] = -265 ; Coeff[ 17 ] = -235 ; Coeff[ 18 ] = -178 ; Coeff[ 19 ] = -105 ; Coeff[ 20 ] = -33 ; Coeff[ 21 ] = 20 ; Coeff[ 22 ] = 43 ; Coeff[ 23 ] = 30 ; Coeff[ 24 ] = -13 ; Coeff[ 25 ] = -77 ; Coeff[ 26 ] = -138 ; Coeff[ 27 ] = -175 ; Coeff[ 28 ] = -169 ; Coeff[ 29 ] = -109 ; Coeff[ 30 ] = 3 ; Coeff[ 31 ] = 156 ; Coeff[ 32 ] = 322 ; Coeff[ 33 ] = 469 ; Coeff[ 34 ] = 568 ; Coeff[ 35 ] = 595 ; Coeff[ 36 ] = 541 ; Coeff[ 37 ] = 415 ; Coeff[ 38 ] = 243 ; Coeff[ 39 ] = 63 ; Coeff[ 40 ] = -83 ; Coeff[ 41 ] = -162 ; Coeff[ 42 ] = -154 ; Coeff[ 43 ] = -59 ; Coeff[ 44 ] = 92 ; Coeff[ 45 ] = 256 ; Coeff[ 46 ] = 371 ; Coeff[ 47 ] = 381 ; Coeff[ 48 ] = 241 ; Coeff[ 49 ] = -60 ; Coeff[ 50 ] = -506 ; Coeff[ 51 ] = -1038 ; Coeff[ 52 ] = -1570 ; Coeff[ 53 ] = -2001 ; Coeff[ 54 ] = -2232 ; Coeff[ 55 ] = -2186 ; Coeff[ 56 ] = -1828 ; Coeff[ 57 ] = -1170 ; Coeff[ 58 ] = -278 ; Coeff[ 59 ] = 737 ; Coeff[ 60 ] = 1739 ; Coeff[ 61 ] = 2585 ; Coeff[ 62 ] = 3149 ; Coeff[ 63 ] = 3348 ; Coeff[ 64 ] = 3149 ; Coeff[ 65 ] = 2585 ; Coeff[ 66 ] = 1739 ; Coeff[ 67 ] = 737 ; Coeff[ 68 ] = -278 ; Coeff[ 69 ] = -1170 ; Coeff[ 70 ] = -1828 ; Coeff[ 71 ] = -2186 ; Coeff[ 72 ] = -2232 ; Coeff[ 73 ] = -2001 ; Coeff[ 74 ] = -1570 ; Coeff[ 75 ] = -1038 ; Coeff[ 76 ] = -506 ; Coeff[ 77 ] = -60 ; Coeff[ 78 ] = 241 ; Coeff[ 79 ] = 381 ; Coeff[ 80 ] = 371 ; Coeff[ 81 ] = 256 ; Coeff[ 82 ] = 92 ; Coeff[ 83 ] = -59 ; Coeff[ 84 ] = -154 ; Coeff[ 85 ] = -162 ; Coeff[ 86 ] = -83 ; Coeff[ 87 ] = 63 ; Coeff[ 88 ] = 243 ; Coeff[ 89 ] = 415 ; Coeff[ 90 ] = 541 ; Coeff[ 91 ] = 595 ; Coeff[ 92 ] = 568 ; Coeff[ 93 ] = 469 ; Coeff[ 94 ] = 322 ; Coeff[ 95 ] = 156 ; Coeff[ 96 ] = 3 ; Coeff[ 97 ] = -109 ; Coeff[ 98 ] = -169 ; Coeff[ 99 ] = -175 ; Coeff[ 100 ] = -138 ; Coeff[ 101 ] = -77 ; Coeff[ 102 ] = -13 ; Coeff[ 103 ] = 30 ; Coeff[ 104 ] = 43 ; Coeff[ 105 ] = 20 ; Coeff[ 106 ] = -33 ; Coeff[ 107 ] = -105 ; Coeff[ 108 ] = -178 ; Coeff[ 109 ] = -235 ; Coeff[ 110 ] = -265 ; Coeff[ 111 ] = -259 ; Coeff[ 112 ] = -221 ; Coeff[ 113 ] = -156 ; Coeff[ 114 ] = -77 ; Coeff[ 115 ] = 1 ; Coeff[ 116 ] = 69 ; Coeff[ 117 ] = 117 ; Coeff[ 118 ] = 140 ; Coeff[ 119 ] = 140 ; Coeff[ 120 ] = 123 ; Coeff[ 121 ] = 95 ; Coeff[ 122 ] = 61 ; Coeff[ 123 ] = 26 ; Coeff[ 124 ] = -10 ; Coeff[ 125 ] = -56 ; Coeff[ 126 ] = 48 ; } void CoeffInitBrf() { // FIR型BRFの係数を代入(1kHz〜2kHzをカットするフィルタ) //Generated by DSPLinks //U_13 //Remez Algorithm BRF //Sampling Frequency = 28800.0 //cutoff1 = 550.0000000 //cutoff2 = 950.0000000 //cutoff3 = 2100.0000000 //cutoff4 = 2500.0000000 //Tap Count = 127 //attenuate = -55.00 //ripple factor = 0.3000000 //Quantized by 16 [bits] Coeff[ 0 ] = -25 ; Coeff[ 1 ] = 326 ; Coeff[ 2 ] = -512 ; Coeff[ 3 ] = -7 ; Coeff[ 4 ] = 242 ; Coeff[ 5 ] = 277 ; Coeff[ 6 ] = 216 ; Coeff[ 7 ] = 132 ; Coeff[ 8 ] = 59 ; Coeff[ 9 ] = 9 ; Coeff[ 10 ] = -11 ; Coeff[ 11 ] = -4 ; Coeff[ 12 ] = 28 ; Coeff[ 13 ] = 80 ; Coeff[ 14 ] = 142 ; Coeff[ 15 ] = 199 ; Coeff[ 16 ] = 237 ; Coeff[ 17 ] = 243 ; Coeff[ 18 ] = 211 ; Coeff[ 19 ] = 143 ; Coeff[ 20 ] = 51 ; Coeff[ 21 ] = -48 ; Coeff[ 22 ] = -136 ; Coeff[ 23 ] = -192 ; Coeff[ 24 ] = -205 ; Coeff[ 25 ] = -174 ; Coeff[ 26 ] = -113 ; Coeff[ 27 ] = -40 ; Coeff[ 28 ] = 17 ; Coeff[ 29 ] = 34 ; Coeff[ 30 ] = -3 ; Coeff[ 31 ] = -98 ; Coeff[ 32 ] = -235 ; Coeff[ 33 ] = -388 ; Coeff[ 34 ] = -519 ; Coeff[ 35 ] = -592 ; Coeff[ 36 ] = -584 ; Coeff[ 37 ] = -485 ; Coeff[ 38 ] = -309 ; Coeff[ 39 ] = -88 ; Coeff[ 40 ] = 129 ; Coeff[ 41 ] = 297 ; Coeff[ 42 ] = 376 ; Coeff[ 43 ] = 350 ; Coeff[ 44 ] = 228 ; Coeff[ 45 ] = 53 ; Coeff[ 46 ] = -116 ; Coeff[ 47 ] = -210 ; Coeff[ 48 ] = -167 ; Coeff[ 49 ] = 47 ; Coeff[ 50 ] = 432 ; Coeff[ 51 ] = 940 ; Coeff[ 52 ] = 1487 ; Coeff[ 53 ] = 1961 ; Coeff[ 54 ] = 2248 ; Coeff[ 55 ] = 2251 ; Coeff[ 56 ] = 1916 ; Coeff[ 57 ] = 1243 ; Coeff[ 58 ] = 297 ; Coeff[ 59 ] = -804 ; Coeff[ 60 ] = -1906 ; Coeff[ 61 ] = -2846 ; Coeff[ 62 ] = -3476 ; Coeff[ 63 ] = 29069 ; Coeff[ 64 ] = -3476 ; Coeff[ 65 ] = -2846 ; Coeff[ 66 ] = -1906 ; Coeff[ 67 ] = -804 ; Coeff[ 68 ] = 297 ; Coeff[ 69 ] = 1243 ; Coeff[ 70 ] = 1916 ; Coeff[ 71 ] = 2251 ; Coeff[ 72 ] = 2248 ; Coeff[ 73 ] = 1961 ; Coeff[ 74 ] = 1487 ; Coeff[ 75 ] = 940 ; Coeff[ 76 ] = 432 ; Coeff[ 77 ] = 47 ; Coeff[ 78 ] = -167 ; Coeff[ 79 ] = -210 ; Coeff[ 80 ] = -116 ; Coeff[ 81 ] = 53 ; Coeff[ 82 ] = 228 ; Coeff[ 83 ] = 350 ; Coeff[ 84 ] = 376 ; Coeff[ 85 ] = 297 ; Coeff[ 86 ] = 129 ; Coeff[ 87 ] = -88 ; Coeff[ 88 ] = -309 ; Coeff[ 89 ] = -485 ; Coeff[ 90 ] = -584 ; Coeff[ 91 ] = -592 ; Coeff[ 92 ] = -519 ; Coeff[ 93 ] = -388 ; Coeff[ 94 ] = -235 ; Coeff[ 95 ] = -98 ; Coeff[ 96 ] = -3 ; Coeff[ 97 ] = 34 ; Coeff[ 98 ] = 17 ; Coeff[ 99 ] = -40 ; Coeff[ 100 ] = -113 ; Coeff[ 101 ] = -174 ; Coeff[ 102 ] = -205 ; Coeff[ 103 ] = -192 ; Coeff[ 104 ] = -136 ; Coeff[ 105 ] = -48 ; Coeff[ 106 ] = 51 ; Coeff[ 107 ] = 143 ; Coeff[ 108 ] = 211 ; Coeff[ 109 ] = 243 ; Coeff[ 110 ] = 237 ; Coeff[ 111 ] = 199 ; Coeff[ 112 ] = 142 ; Coeff[ 113 ] = 80 ; Coeff[ 114 ] = 28 ; Coeff[ 115 ] = -4 ; Coeff[ 116 ] = -11 ; Coeff[ 117 ] = 9 ; Coeff[ 118 ] = 59 ; Coeff[ 119 ] = 132 ; Coeff[ 120 ] = 216 ; Coeff[ 121 ] = 277 ; Coeff[ 122 ] = 242 ; Coeff[ 123 ] = -7 ; Coeff[ 124 ] = -512 ; Coeff[ 125 ] = 326 ; Coeff[ 126 ] = -25 ; } void PushDelay(int din) { // 遅延器のプッシュ int tmpDelayLine[127]; VectorCopy(127-1, tmpDelayLine+1, DelayLine); // 配列を一個ずらしてコピー(DSPライブラリ使用) tmpDelayLine[0] = din; // 新しいデータを入れる VectorCopy(127, DelayLine, tmpDelayLine); // グローバル配列にコピー(DSPライブラリ使用) } int CalOutWave() { // デジタルフィルタの出力を計算 int tmp; tmp = VectorDotProduct(127, DelayLine, Coeff); // データと係数積和演算(DSPライブラリ使用) return tmp; } // Timer subroutine //void __attribute__((__interrupt__, __shadow__, no_auto_psv)) _AltT3Interrupt(void) void __attribute__((__interrupt__, __shadow__, no_auto_psv)) _T3Interrupt(void) { // --- A/D is 12bits, filtering is 12bits, then truncate 2bits, PWM is 10bits while(!IFS0bits.ADIF); // wait A/D ResultData = ReadADC12(0); // 12bit resolution (28.8kHz sampling) indata = ResultData - 2048; // 符号付きにする PushDelay(indata); // 遅延器のプッシュ outdata = CalOutWave(); // デジタルフィルタの出力を計算 outdata += 2048; // 符号なしにする if(outdata > 4095) outdata = 4095; // オーバフローリミッタ if(outdata < 0) outdata = 0; // アンダーフローリミッタ ResultData = outdata >> 2; // 10ビットにする SetDCOC2PWM(ResultData); IFS0bits.ADIF = 0; // clear A/D interuppt flag IFS0bits.T3IF = 0; // clear T3 interuppt flag } // Main routine int main(void) { // port init TRISB=0x01FF; // Use Alternate Interrupt Vector Table // INTCON2bits.ALTIVT=1; // Confirm to turn off ADC ADCON1bits.ADON=0; // ADC init _ADCHS= ADC_CH0_POS_SAMPLEA_AN3 & ADC_CH0_NEG_SAMPLEA_NVREF; // A-D channel-3 select SetChanADC12(_ADCHS); _ADCON1=ADC_MODULE_ON & ADC_IDLE_CONTINUE & ADC_FORMAT_INTG & ADC_CLK_TMR & ADC_AUTO_SAMPLING_ON & ADC_SAMP_OFF; _ADCON2=ADC_VREF_AVDD_AVSS & ADC_SCAN_OFF & ADC_SAMPLES_PER_INT_1 & ADC_ALT_BUF_OFF & ADC_ALT_INPUT_OFF; // Tad={Tcy(ADCS+1)}/2>334ns, Then ADCS>18.7, Tad=10*Tcy _ADCON3=ADC_SAMPLE_TIME_1 & ADC_CONV_CLK_SYSTEM & ADC_CONV_CLK_10Tcy; _ADPCFG=ENABLE_AN3_ANA; // A-D channel-3 analog input _ADCSSL=SCAN_NONE; OpenADC12(_ADCON1, _ADCON2, _ADCON3, _ADPCFG, _ADCSSL); // Timer3 setting OpenTimer3(T3_ON & T3_GATE_OFF & T3_PS_1_1 & T3_SOURCE_INT, 1024-1); // 28.8kHz sampling ADC ConfigIntTimer3(T3_INT_PRIOR_5 & T3_INT_ON); // Timer2 setting OpenTimer2(T2_ON & T2_GATE_OFF & T2_PS_1_1 & T2_SOURCE_INT, 1024-1); // 28.8kHz carrier PWM OpenOC2(OC_IDLE_CON & OC_TIMER2_SRC & OC_PWM_FAULT_PIN_DISABLE, 0, 0); // enable interrupt DISICNT = 0x0000; if(PORTBbits.RB0 == 1 && PORTBbits.RB8 == 1) { // パワーオン時のプッシュスイッチの値で係数選択 CoeffInitLpf(); // FIR型LPFの係数を代入 } else if (PORTBbits.RB0 == 0 && PORTBbits.RB8 == 1) { CoeffInitHpf(); // FIR型HPFの係数を代入 } else if (PORTBbits.RB0 == 1 && PORTBbits.RB8 == 0) { CoeffInitBpf(); // FIR型BPFの係数を代入 } else { CoeffInitBrf(); // FIR型BRFの係数を代入 } //CoeffInitHpf(); // main loop while(1) { // A/D result store in ResultData } // CloseTimer3(); // never excute // CloseADC12(); // never excute // CloseOC1(); // never excute }