![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Cutoff frequency variable LPF, HPF, BPF, and BRF by FIR 160th-order filter.
Dependencies: UIT_ACM1602NI UITDSP_ADDA mbed UIT_AQM1602
Diff: main.cpp
- Revision:
- 3:24b6aa1a19ba
- Parent:
- 1:58271fae2e01
diff -r 7b8a5b9de72c -r 24b6aa1a19ba main.cpp --- a/main.cpp Tue Dec 09 06:10:08 2014 +0000 +++ b/main.cpp Sat Jul 25 06:36:06 2015 +0000 @@ -4,32 +4,36 @@ // A2: Value which controls cutoff frequency // // 1: LPF, 3: HPF, 5: BPF, 7: BRF, even: through -// 2014/12/09, Copyright (c) 2014 MIKAMI, Naoki +// 2015/07/25, Copyright (c) 2015 MIKAMI, Naoki //------------------------------------------------------------------------------ -#include "mbed.h" - #include "ADC_Interrupt.hpp" // for ADC using interrupt -#include "DAC_MCP4922.hpp" // for DAC MCP4922 -#include "ACM1602NI.hpp" // for LCD display +#include "DAC_MCP4921.hpp" // for DAC MCP4921, MCP4922 +using namespace Mikami; #include "WindowingDesign.hpp" // for design of FIR filter -using namespace Mikami; +// ACM1602Ni を使う場合は次の define 文をコメントにすること +#define AQM1602 + +#ifdef AQM1602 +#include "AQM1602.hpp" +Aqm1602 Lcd_; +#else +#include "ACM1602NI.hpp" +Acm1602Ni Lcd_; +#endif const int FS_ = 16000; // Sampling frequency: 16 kHz ADC_Intr myAdc_(A0, FS_, A1, A2); -DAC_MCP4922 myDac_; +DAC_MCP4921 myDac_; const int ORDER_ = 160; float hm_[ORDER_/2+1]; float xn_[ORDER_+1]; -DigitalIn sw1_(D2, PullDown); -DigitalIn sw2_(D3, PullDown); -DigitalIn sw4_(D4, PullDown); -DigitalIn sw8_(D5, PullDown); - +BusIn sws_(D2, D3, D4, D5); +int sw_; WindowingDesign design_(ORDER_, FS_); uint16_t a2_ = 0; // Inputted data from A2 pin @@ -52,8 +56,10 @@ xn_[k] = xn_[k-1]; // move input signals //----------------------------------------- - if (sw1_ == 0) myDac_.Write(xn_[0]); // Using no filter - else myDac_.Write(yn); // Using filter + if ((sw_ & 0x01) == 0) + myDac_.Write(xn_[0]); // Using no filter + else + myDac_.Write(yn); // Using filter // Read value which controls cutoff frequency a2_ = myAdc_.ReadWait_u16(); @@ -63,11 +69,12 @@ // and enable ADC_IRQn } +void printfLcdDesign(WindowingDesign::Type pb, char str[], int f1, int f2 = 0); + int main() { myDac_.ScfClockTim3(670000); // cutoff frequency: 6.7 kHz - - Acm1602Ni lcd; // objetc for display using LCD + sws_.mode(PullDown); // Clear buffer in FIR filter for (int n=0; n<=ORDER_; n++) @@ -77,14 +84,14 @@ float fc1 = 0; while (true) { - int sw = (sw8_ << 3) | (sw4_ << 2) | (sw2_ << 1) | sw1_; - if (sw1_ == 0) + sw_ = sws_.read(); + if ((sw_ & 0x01) == 0) { printf("Through\r\n"); - lcd.ClearLine(1); - lcd.WriteStringXY("Through ", 0, 0); + Lcd_.ClearLine(1); + Lcd_.WriteStringXY("Through ", 0, 0); wait(0.2f); - lcd.ClearLine(0); + Lcd_.ClearLine(0); fc1 = 0; } else @@ -94,29 +101,17 @@ if (fabs(fc - fc1) > 10.0f) { - printf("fc = %4d\r\n", int(fc+0.5f)); - char str[18]; - sprintf(str, "fc = %4d Hz", int(fc+0.5f)); - lcd.WriteStringXY(str, 0, 1); fc1 = fc; - switch (sw) + switch (sw_) { - case 1: printf("LPF\r\n"); - lcd.WriteStringXY("LPF", 0, 0); - design_.Design(ORDER_, design_.LPF, fc, 0, hm_); + case 1: printfLcdDesign(design_.LPF, "LPF", fc+0.5f); break; - case 3: printf("HPF\r\n"); - lcd.WriteStringXY("HPF", 0, 0); - design_.Design(ORDER_, design_.HPF, fc, 0, hm_); + case 3: printfLcdDesign(design_.HPF, "HPF", fc+0.5f); break; - case 5: printf("BPF\r\n"); - lcd.WriteStringXY("BPF", 0, 0); - design_.Design(ORDER_, design_.BPF, fc-100, fc+100, hm_); + case 5: printfLcdDesign(design_.BPF, "BPF", fc-100, fc+100); break; - case 7: printf("BRF\r\n"); - lcd.WriteStringXY("BRF", 0, 0); - design_.Design(ORDER_, design_.BRF, fc-100, fc+100, hm_); + case 7: printfLcdDesign(design_.BRF, "BRF", fc-150, fc+150); break; } } @@ -124,3 +119,23 @@ wait(0.1f); } } + +void printfLcdDesign(WindowingDesign::Type pb, char str[], int f1, int f2) +{ + printf(((string)str+"\r\n").c_str()); + Lcd_.WriteStringXY(str, 0, 0); + char strFc[17]; + if (f2 == 0) + { + printf("fc = %4d Hz\r\n", f1); + sprintf(strFc, "fc: %4d Hz", f1); + } + else + { + printf("fc = %4d, %4d Hz\r\n", f1, f2); + sprintf(strFc, "fc: %4d,%4d Hz", f1, f2); + } + Lcd_.WriteStringXY(strFc, 0, 1); + + design_.Design(ORDER_, pb, f1, f2, hm_); +}