рдХрд╛рдиреЛрдВ рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛: Arduino рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреНрд░рдВрдерд┐ рдореЗрдВ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХрд╛рдо рдирдВрдмрд░ 3 рдореЗрдВ рдЕрдкрдиреА рдкреНрд░реЗрд░рдгрд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред рд╣рдо Goertzel рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Arduino рдкрд░ рдЯреЛрди рдбрд╛рдпрд▓рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдзреНрд╡рдирд┐ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрдВрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ Arduino UNO, рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЗрдЯ рдорд╛рдЗрдХреНрд░реЛрдлреЛрди ( adafruit ) рдФрд░ MAX72 рдЪрд╛рд▓рдХ рдХреЗ рд╕рд╛рде 8x8 рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛


  • рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирдореВрдиреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВ ( рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдХрд┐ 256 рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)ред
  • рд╡рд░реНрдгреЛрдВ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╡рд╛рдВрдЫрд┐рдд рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдЖрд╡реГрддреНрддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдпрд╛рдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред
  • рдЖрдпрд╛рдо рдХреЗ рджреЛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рд╡рд╛рдВрдЫрд┐рдд рдЪрд░рд┐рддреНрд░ рдХреА рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рд╕реВрдЪрдХ рджреЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдВрдХрдбрд╝рд╛ 3 рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
    рдЫрд╡рд┐

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВ - рдХреНрдпрд╛ рдЕрд░реБрдбрд┐рдиреЛ рдпреВрдПрдирдУ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛?

рдШрдбрд╝реА рдХреА рдЖрд╡реГрддреНрддрд┐: 16MHz
рдПрдХ рдирдореВрдирд╛ рдЪрдХреНрд░ 13 рдШрдбрд╝реА рдЪрдХреНрд░ рд▓реЗрддрд╛ рд╣реИ
рдкреНрд░реАрд╕реНрдХреВрд▓рд░ рдореВрд▓реНрдп рд╕рдмрд╕реЗ рд╕рдЯреАрдХрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: 128

рдпрд╣ 16 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ / 13/128 ~ 9615 рд╣рд░реНрдЯреНрдЬ - рд╡рд╛рдВрдЫрд┐рдд рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк 4.8 kHz рддрдХ рдХреА рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

ADC рдЯреНрдпреВрдирд┐рдВрдЧ


ADC рдСрдкрд░реЗрд╢рди рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ (ADCSRB рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рд╢реАрдЯ рдореЗрдВ рдПрдХ рдкреВрд░реА рд╕реВрдЪреА)

  • рдПрдХрд▓ рд░реАрдб - рдПрдирд╛рд▓реЙрдЧрд░реЗрдб () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд╡рд░реЛрдзрдХ рдХреЙрд▓ рд╣реИ рдЬреЛ 100 ,s рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдирд┐рд░рдВрддрд░ рдирдореВрдирд╛ рджрд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ
  • рдлреНрд░реА-рд░рди рдореЛрдб - рдЗрд╕ рдореЛрдб рдореЗрдВ, рдЕрдЧрд▓рд╛ рдирдореВрдирд╛ рдЪрдХреНрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдЕрдВрдд рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрддрдо рдирдореВрдирд╛ рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИ
  • рдЯрд╛рдЗрдорд░ рдУрд╡рд░рдлреНрд▓реЛ - рдирдореВрдирд╛ рдЯрд╛рдЗрдорд░ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдПрдбреАрд╕реА рд╕реЗрдЯрдЕрдк рдХреЛрдб, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдлреНрд░реА-рд░рди рдореЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

ADMUX = 0; // Channel sel, right-adj, use AREF pin ADCSRA = _BV(ADEN) | // ADC enable _BV(ADSC) | // ADC start _BV(ADATE) | // Auto trigger _BV(ADIE) | // Interrupt enable _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // 128:1 / 13 = 9615 Hz ADCSRB = 0; // Free-run mode DIDR0 = _BV(0); // Turn off digital input for ADC pin TIMSK0 = 0; // Timer0 off 

рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рдЬреИрд╕реЗ рд╣реА рдирдореВрдиреЛрдВ рдХреА рдкреВрд░реНрдг рд╕рд░рдгреА рдЯрд╛рдЗрдк рдХреА рдЬрд╛рддреА рд╣реИ, рд╣рдо ADC рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ Goertzel рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХреЗ рдЖрдпрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╡рд┐рд╕реНрддреГрдд рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╕рд╛рде рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╡рд░реНрдгрди рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреВрдВрдЧрд╛:

 void goertzel(uint8_t *samples, float *spectrum) { float v_0, v_1, v_2; float re, im, amp; for (uint8_t k = 0; k < IX_LEN; k++) { float cos = pgm_read_float(&(cos_t[k])); float sin = pgm_read_float(&(sin_t[k])); float a = 2. * cos; v_0 = v_1 = v_2 = 0; for (uint16_t i = 0; i < N; i++) { v_0 = v_1; v_1 = v_2; v_2 = (float)(samples[i]) + a * v_1 - v_0; } re = cos * v_2 - v_1; im = sin * v_2; amp = sqrt(re * re + im * im); spectrum[k] = amp; } } 

рд╡рд╛рдВрдЫрд┐рдд рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдирдореВрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдФрд░ рдХреЛрдЬрд╛рдЗрди рдХреА рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рдХреА рдЧрдИ рдереАред рдХреЛрдб рдХрд╛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рд╣реИ ред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдпрд╣ рдирд┐рдХрд▓рд╛ рдФрд░ рд╕рд░рд▓ рдзреНрд╡рдирд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП Arduino UNO рд╕рдВрд╕рд╛рдзрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред


рдореБрдЦреНрдп рд╕рдмрдХ рдЬреЛ рдореИрдВрдиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдПрдбреАрд╕реА рдПрдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЪреАрдЬ рд╣реИ, рдХрдВрд╕реЛрд▓ рдХреЛ рдЪрд░рд┐рддреНрд░ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдмрд┐рддрд╛рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдФрд░ рдореИрдХреНрд╕ 1 9 1 9 рдХреА рдЬрдореАрди рдХреЛ рдЬреЛрдбрд╝рд╛ рдФрд░ рд╕рднреА рдирдореВрдиреЗ рддреБрд░рдВрдд рд╢реЛрд░ рдореЗрдВ рдмрджрд▓ рдЧрдПред

рдХреНрдпрд╛ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рдерд╛? рд╣рд╛рдВ, рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рдФрд░ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рдЖрд╡реГрддреНрддрд┐рдпрд╛рдВ рдирдореВрдирд╛ рдЬрд╛рд▓реА рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреА рд╣реИрдВ, рдЗрд╕рд╕реЗ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рдРрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА f = 8 kHz, N = 205 рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЛ ADC рдХреЛ рдлреНрд░реА-рд░рди рдореЛрдб рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЯрд╛рдЗрдорд░ рдУрд╡рд░рдлреНрд▓реЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдВрддрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред



рдкрд╛рдареНрдпрдХреНрд░рдо рдПрдХ рдХрд░реАрдмреА рдХреЗ рд▓рд┐рдП рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/hi432498/


All Articles