
GOERTZELY - DISCO | stm32f746g-disco (microcontroller) | calculate relative magnitude of each standard tuning guitar strings
Dependencies: TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG
main.cpp
- Committer:
- WasinPT
- Date:
- 2019-05-12
- Revision:
- 3:ccc0103c200e
- Parent:
- 0:9933f7db9a9b
File content as of revision 3:ccc0103c200e:
#include "mbed.h" #include "TS_DISCO_F746NG.h" #include "LCD_DISCO_F746NG.h" LCD_DISCO_F746NG lcd; TS_DISCO_F746NG ts; InterruptIn button1(D0); AnalogIn Ain(A0); TS_StateTypeDef TS_State; Serial pc(USBTX, USBRX); void button1pressed() { wait(0.5); lcd.Clear(LCD_COLOR_BLACK); NVIC_SystemReset(); } int main() { pc.baud(9600); pc.format(8, SerialBase::None, 1); //default float high, high1, low, low1; //in_tune, in_tune1, in_tune2, in_tune3; int note; float Buffer[12005];; float PI=3.1415; int SAMPLE_RATE = 24000; float goertzelFilter4; char rac; int in; /////////////////////////////////////////////////////// //////////////////// //Interupt for Switching Strings button1.mode(PullDown); button1.rise(&button1pressed); int Counter = 0; lcd.Clear(LCD_COLOR_BLACK); lcd.SetBackColor(LCD_COLOR_DARKGREEN); lcd.SetTextColor(LCD_COLOR_YELLOW); // lcd.SetTextColor(LCD_COLOR_RED); lcd.FillRect(1,1,20,20); //AntiHead lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); lcd.FillCircle(111,112,27); lcd.FillCircle(111,160,27); lcd.FillCircle(116,85,9); lcd.FillCircle(116,187,9); //Head lcd.SetTextColor(LCD_COLOR_LIGHTBLUE); lcd.FillRect(114,70,100,133); lcd.FillRect(205,76,57,120); lcd.FillRect(262,70,100,133); lcd.FillRect(262,70,100,133); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.FillCircle(362,70,25); lcd.FillCircle(362,203,25); lcd.SetBackColor(LCD_COLOR_LIGHTBLUE); lcd.SetTextColor(LCD_COLOR_RED); lcd.DisplayStringAt(0,LINE(5),(uint8_t*)"GOERTZELY-disco",CENTER_MODE); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.FillRect(362,95,12,84); lcd.SetTextColor(LCD_COLOR_BROWN); lcd.FillRect(374,95,106,84); lcd.SetTextColor(LCD_COLOR_LIGHTGRAY); lcd.FillRect(426,95,4,84); lcd.FillCircle(400,137,8); lcd.FillCircle(452,137,8); //TuningSlot lcd.SetTextColor(LCD_COLOR_LIGHTGRAY); //TOP lcd.FillRect(298,50,9,20); lcd.FillRect(236,54,9,22); lcd.FillRect(174,50,9,20); // //Bottom lcd.FillRect(298,203,9,20); lcd.FillRect(236,196,9,22); lcd.FillRect(174,203,9,20); lcd.SetTextColor(LCD_COLOR_YELLOW); lcd.FillRect(277,15,52,35);//E4 lcd.FillRect(215,19,52,37);//B3 lcd.FillRect(153,15,52,35);//G3 lcd.FillRect(277,223,52,35);//E2 lcd.FillRect(215,216,52,37);//A2 lcd.FillRect(153,223,52,35);//D3 //Note lcd.SetBackColor(LCD_COLOR_YELLOW); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(278,23,(uint8_t*)"G3",RIGHT_MODE); lcd.DisplayStringAt(216,29,(uint8_t*)"B3",RIGHT_MODE); lcd.DisplayStringAt(154,23,(uint8_t*)"E4",RIGHT_MODE); lcd.DisplayStringAt(278,229,(uint8_t*)"D3",RIGHT_MODE); lcd.DisplayStringAt(216,223,(uint8_t*)"A2",RIGHT_MODE); lcd.DisplayStringAt(154,229,(uint8_t*)"E2",RIGHT_MODE); while (note<50) { ts.GetState(&TS_State); if(((TS_State.touchX[0]>277)&&(TS_State.touchX[0]<329)) &&((TS_State.touchY[0]>223)&&(TS_State.touchY[0]<258))) //6 { lcd.SetTextColor(LCD_COLOR_RED); lcd.FillRect(277,223,52,35); lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(154,229,(uint8_t*)"E2",RIGHT_MODE); note = 82; rac = 'E'; in = 2; } if(((TS_State.touchX[0]>215)&&(TS_State.touchX[0]<267)) &&((TS_State.touchY[0]>216)&&(TS_State.touchY[0]<253))) //5 { lcd.SetTextColor(LCD_COLOR_RED); lcd.FillRect(215,216,52,37); lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(216,223,(uint8_t*)"A2",RIGHT_MODE); note = 110; rac = 'A'; in = 2; } if(((TS_State.touchX[0]>153)&&(TS_State.touchX[0]<205)) &&((TS_State.touchY[0]>223)&&(TS_State.touchY[0]<258))) //4 { lcd.SetTextColor(LCD_COLOR_RED); lcd.FillRect(153,223,52,35); lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(278,229,(uint8_t*)"D3",RIGHT_MODE); note = 147; rac = 'D'; in = 3; } if(((TS_State.touchX[0]>153)&&(TS_State.touchX[0]<205)) &&((TS_State.touchY[0]>15)&&(TS_State.touchY[0]<50))) //3 { lcd.SetTextColor(LCD_COLOR_RED); lcd.FillRect(153,15,52,35); lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(278,23,(uint8_t*)"G3",RIGHT_MODE); note = 196; rac = 'G'; in = 3; } if(((TS_State.touchX[0]>215)&&(TS_State.touchX[0]<267)) &&((TS_State.touchY[0]>19)&&(TS_State.touchY[0]<56))) //2 { lcd.SetTextColor(LCD_COLOR_RED); lcd.FillRect(215,19,52,37); lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(216,29,(uint8_t*)"B3",RIGHT_MODE); note = 247; rac = 'B'; in = 3; } if(((TS_State.touchX[0]>277)&&(TS_State.touchX[0]<329)) &&((TS_State.touchY[0]>15)&&(TS_State.touchY[0]<50))) //1 { lcd.SetTextColor(LCD_COLOR_RED); lcd.FillRect(277,15,52,35); lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(154,23,(uint8_t*)"E4",RIGHT_MODE); note = 330; rac = 'E'; in = 4; } } wait(0.5); while(1){////// mother while /////////////////// lcd.Clear(LCD_COLOR_LIGHTRED); lcd.SetBackColor(LCD_COLOR_LIGHTRED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"...1...", CENTER_MODE); wait(1); lcd.Clear(LCD_COLOR_LIGHTRED); lcd.SetBackColor(LCD_COLOR_LIGHTRED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"...2...", CENTER_MODE); wait(1); lcd.Clear(LCD_COLOR_LIGHTRED); lcd.SetBackColor(LCD_COLOR_LIGHTRED); lcd.SetTextColor(LCD_COLOR_BLACK); lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"...3...", CENTER_MODE); wait(1); button1.mode(PullDown); button1.rise(&button1pressed); Counter = 0; lcd.Clear(LCD_COLOR_RED); for(int i=0;i<10000;i=i+1) { Buffer[i] = Ain.read(); Counter = Counter+1; char str[20],con[20]; lcd.SetBackColor(LCD_COLOR_RED); lcd.SetTextColor(LCD_COLOR_BLACK); sprintf(con," Please Keep Picking : %c%d ",rac,in); lcd.DisplayStringAt(0, LINE(4), (uint8_t *)con, CENTER_MODE); sprintf(str,"We did %d sample",Counter); lcd.DisplayStringAt(0, LINE(6), (uint8_t *)str, CENTER_MODE); wait_us(42); } /////////////////CALCULATION////////// high = 0; low = 0; ////HIGH////// for (int i=3; i<46; i+=3) { float freq = note + i; int N = Counter; float s_prev = 0.0; float s_prev2 = 0.0; float coeff,normalizedfreq,s; normalizedfreq = freq / SAMPLE_RATE; coeff = 2*cos(2*PI*normalizedfreq); for (int i=0; i<=N ; i=i+1) { s = Buffer[i] + coeff * s_prev - s_prev2; s_prev2 = s_prev; s_prev = s; } float goertzelFilter1 = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2; high1 = goertzelFilter1; if (high1 > high) { high=high1; } } //lcd.Clear(LCD_COLOR_BLACK); //lcd.SetBackColor(LCD_COLOR_BLACK); //lcd.SetTextColor(LCD_COLOR_RED); //lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"...1...", CENTER_MODE); wait(0.1); ////LOW////// for (int i=3; i<46; i+=3) { float freq = note - i; int N = Counter; float s_prev = 0.0; float s_prev2 = 0.0; float coeff,normalizedfreq,s; normalizedfreq = freq / SAMPLE_RATE; coeff = 2*cos(2*PI*normalizedfreq); for (int i=0; i<=N ; i=i+1) { s = Buffer[i] + coeff * s_prev - s_prev2; s_prev2 = s_prev; s_prev = s; } float goertzelFilter2 = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2; low1 = goertzelFilter2; if (low1 > low) { low=low1; } } // lcd.Clear(LCD_COLOR_BLACK); //lcd.SetBackColor(LCD_COLOR_BLACK); //lcd.SetTextColor(LCD_COLOR_RED); //lcd.DisplayStringAt(0, LINE(6), (uint8_t *)" ..2.. ", CENTER_MODE); wait(0.1); /////////goertzelFilter3///////////// float freq = note + 1; int N = Counter; float s_prev = 0.0; float s_prev2 = 0.0; float coeff,normalizedfreq,s; normalizedfreq = freq / SAMPLE_RATE; coeff = 2*cos(2*PI*normalizedfreq); for (int i=0; i<=N ; i=i+1) { s = Buffer[i] + coeff * s_prev - s_prev2; s_prev2 = s_prev; s_prev = s; } float goertzelFilter3 = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2; //lcd.Clear(LCD_COLOR_BLACK); //lcd.SetBackColor(LCD_COLOR_BLACK); //lcd.SetTextColor(LCD_COLOR_RED); //lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"...3...", CENTER_MODE); wait(0.1); /////////goertzelFilter4///////////// freq = note ; N = Counter; s_prev = 0.0; s_prev2 = 0.0; normalizedfreq = freq / SAMPLE_RATE; coeff = 2*cos(2*PI*normalizedfreq); for (int i=0; i<=N ; i=i+1){ s = Buffer[i] + coeff * s_prev - s_prev2; s_prev2 = s_prev; s_prev = s; } goertzelFilter4 = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2; //lcd.Clear(LCD_COLOR_BLACK); //lcd.SetBackColor(LCD_COLOR_BLACK); //lcd.SetTextColor(LCD_COLOR_RED); //lcd.DisplayStringAt(0, LINE(6), (uint8_t *)" ..4.. ", CENTER_MODE); wait(0.1); /////////goertzelFilter5///////////// //freq = note - 1; // N = Counter; // s_prev = 0.0; // s_prev2 = 0.0; // normalizedfreq = freq / SAMPLE_RATE; // coeff = 2*cos(2*PI*normalizedfreq); //for (int i=0; i<=N ; i=i+1){ // s = Buffer[i] + coeff * s_prev - s_prev2; // s_prev2 = s_prev; // s_prev = s; //} //float goertzelFilter5 = s_prev2*s_prev2+s_prev*s_prev-coeff*s_prev*s_prev2; // lcd.Clear(LCD_COLOR_BLACK); //lcd.SetBackColor(LCD_COLOR_BLACK); //lcd.SetTextColor(LCD_COLOR_RED); //lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"...5...", CENTER_MODE); // wait(0.4); //in_tune1 = goertzelFilter3; //in_tune2 = goertzelFilter4; //in_tune3 = goertzelFilter5; // if ((in_tune1 > in_tune2) && (in_tune1 > in_tune3)) //{in_tune = in_tune1;} // else if ((in_tune2 > in_tune1) && (in_tune2 > in_tune3)) //{in_tune = in_tune2;} //else {in_tune = in_tune3;} //printf("high = %.2f, low = %.2f, in_tune = %.2f", high, low, in_tune); //if ((in_tune > high) && (in_tune > low)) { // lcd.Clear(LCD_COLOR_GREEN); // lcd.SetBackColor(LCD_COLOR_GREEN); // lcd.SetTextColor(LCD_COLOR_BLACK); // lcd.DisplayStringAt(0,LINE(5),(uint8_t*)"NOW INTUNE!!!!",CENTER_MODE); //wait(1.5); // } //else if (high > in_tune) { // lcd.Clear(LCD_COLOR_RED); //wait(1.5);} //else if (low > in_tune) { // lcd.Clear(LCD_COLOR_BLUE); // wait(1.5);} // else{} lcd.Clear(LCD_COLOR_YELLOW); lcd.SetBackColor(LCD_COLOR_YELLOW); lcd.SetTextColor(LCD_COLOR_RED); char str1[20],str2[20],str3[20]; sprintf(str1," Relative Magnitude "); lcd.DisplayStringAt(0, LINE(3), (uint8_t *)str1, CENTER_MODE); sprintf(str3," Note : %c%d ",rac,in); lcd.DisplayStringAt(0, LINE(5), (uint8_t *)str3, CENTER_MODE); sprintf(str2," %f ",goertzelFilter4); lcd.DisplayStringAt(0, LINE(7), (uint8_t *)str2, CENTER_MODE); wait(4); } }