Dodany przez: klima, 20:57 21-02-2025

Nowy Pobierz
  1. //
  2. // *20 - 200Hz Single Pole Bandpass IIR Filter
  3. //
  4. float bassFilter(float sample) {
  5.   static float xv[3] = {0.0f, 0.0f, 0.0f};
  6.   static float yv[3] = {0.0f, 0.0f, 0.0f};
  7.  
  8.   xv[0] = xv[1];
  9.   xv[1] = xv[2];
  10.   xv[2] = sample / 3.0f;  //* regulacja pod siłe sygnału
  11.  
  12.   yv[0] = yv[1];
  13.   yv[1] = yv[2];
  14.   yv[2] = (xv[2] - xv[0])
  15.          + (-0.7960060012f * yv[0])
  16.          + (1.7903124146f * yv[1]);
  17.   return yv[2];
  18. }
  19.  
  20. //
  21. //* 10Hz Single Pole Lowpass IIR Filter
  22. //
  23. float envelopeFilter(float sample) {
  24.   static float xv[2] = {0.0f, 0.0f};
  25.   static float yv[2] = {0.0f, 0.0f};
  26.  
  27.   xv[0] = xv[1];
  28.   xv[1] = sample / 50.0f;
  29.  
  30.   yv[0] = yv[1];
  31.   yv[1] = (xv[0] + xv[1]) + (0.9875119299f * yv[0]);
  32.   return yv[1];
  33. }
  34.  
  35. //
  36. //* 1.7 - 3.0Hz Single Pole Bandpass IIR Filter
  37. //
  38. float beatFilter(float sample) {
  39.   static float xv[3] = {0.0f, 0.0f, 0.0f};
  40.   static float yv[3] = {0.0f, 0.0f, 0.0f};
  41.  
  42.   xv[0] = xv[1];
  43.   xv[1] = xv[2];
  44.   xv[2] = sample / 2.7f;
  45.  
  46.   yv[0] = yv[1];
  47.   yv[1] = yv[2];
  48.   yv[2] = (xv[2] - xv[0])
  49.          + (-0.7169861741f * yv[0])
  50.          + (1.4453653501f * yv[1]);
  51.   return yv[2];
  52. }
  53.  
  54. ///
  55.  
  56.  
  57. ///
  58.   static unsigned int sampleCounter = 0;
  59.   static unsigned long lastSampleTime = 0;
  60.   unsigned long currentTime = micros();
  61.  
  62.   // Utrzymanie stałego tempa próbkowania: 5000Hz (co 200 µs)
  63.   if (currentTime - lastSampleTime < SAMPLEPERIODUS) return;
  64.   lastSampleTime = currentTime;
  65.  
  66.   // Odczyt próbki audio z kanału A0
  67.   // Dla Pico Arduino: zakładamy, że audio jest podane na A0 (np. GPIO26)
  68.   // Offset: dla 12-bit ADC (0-4095), środek to około 2048
  69.   float sample = (float)analogRead(A0) - 2048.0f;
  70.  
  71.   // Przetwarzanie sygnału: filtr basów
  72.   float value = bassFilter(sample);
  73.   if (value < 0) value = -value;
  74.  
  75.   // Filtracja obwiedni sygnału
  76.   float envelope = envelopeFilter(value);
  77.  
  78.   sampleCounter++;
  79.   // Co 200 próbek (~25Hz) wykonujemy filtr beat oraz ustawiamy stan LED
  80.   if (sampleCounter >= 200) {
  81.     float beat = beatFilter(envelope);
  82.  
  83.     // Odczyt z potencjometru na A1 do ustawienia progu
  84.     float thresh = 0.02f * (float)analogRead(A1);
  85.  
  86.     // Jeżeli wykryty beat przekracza próg, włącz LED
  87.     if (beat > thresh)
  88.       digitalWrite(LED_BUILTIN, HIGH);
  89.     else
  90.       digitalWrite(LED_BUILTIN, LOW);
  91.  
  92.     sampleCounter = 0;
  93.   }
  94.  
  95.  ///

Źródło:

Ostatnie wpisy

Linki

Funkcje