정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 주파수 검출 코드인데 이해가 안됩니다 좀 알려주시기 바랍니다
졸업하고싶은1인 | 2019-03-06

int buttonarray[] = {13, 12, 11, 10, 9, 8}; // [E2, A2, D3, G3, B3, E4]
// each pin represents a guitar string
// next we create and array with frequencies matching each of the strings above
// such that when 13 is selected the freq matching the note e is selected).
float freqarray[] = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63};//sll in Hz

int lowerLed = 7;
int higherLed = 6;
int justRight = 5;

#define LENGTH 512

byte rawData[LENGTH];
int count = 0;

// Sample Frequency in kHz
const float sample_freq = 8919;
int len = sizeof(rawData);
int i,k;
long sum, sum_old;
int thresh = 0;
float freq_per = 0;
byte pd_state = 0;

void setup(){
  for (int i=0; i<=5; i++)
  {
    pinMode(buttonarray[i], INPUT_PULLUP);
  }
  pinMode(lowerLed, OUTPUT);
  pinMode(higherLed, OUTPUT);
  pinMode(justRight, OUTPUT);
  Serial.begin(115200);
}
void loop(){
  
  if (count < LENGTH) 
  {
    count++;
    rawData[count] = analogRead(A0)>>2;
  }
  else {
    sum = 0;
    pd_state = 0;
    int period = 0;
    for(i=0; i < len; i++)
    {
      // Autocorrelation
      sum_old = sum;
      sum = 0;
      for(k=0; k < len-i; k++) sum += (rawData[k]-128)*(rawData[k+i]-128)/256;
      // Serial.println(sum);
      
      // Peak Detect State Machine
      if (pd_state == 2 && (sum-sum_old) <=0) 
      {
        period = i;
        pd_state = 3;
      }
      if (pd_state == 1 && (sum > thresh) && (sum-sum_old) > 0) pd_state = 2;
      if (!i) {
        thresh = sum * 0.5;
        pd_state = 1;
      }
    }
    // Frequency identified in Hz
    if (thresh >100) {
      freq_per = sample_freq/period;
      Serial.println(freq_per);
      for (int s=0; s<=5; s++)
      {
        if (digitalRead(buttonarray[i])== HIGH)
        {
          if (freq_per - freqarray[i] < 0)
          {
            digitalWrite(lowerLed, HIGH);
          }
          else if(freq_per - freqarray[i] > 10)
          {
            digitalWrite(higherLed, HIGH);
          }
          else
          {
            digitalWrite(justRight, HIGH);
          }
         
        }
      }
    }
    count = 0;
  }
}

프로필사진

kocoafab 2019-03-20 15:23:49

A0번에 연결된 센서에서 데이터를 512개를 한번에 받아서 나누는 코드 같습니다.

 

올려주신 내용만으로 파악하기도 힘들고(뭐가 어떻게 연결되어있고 어떻게 동작하는지 모르겠습니다.), 전체 코드를 다 분석해드리진 않으니 한번 각 부분별로 코드를 검색하셔서 어떤 동작하는지 확인해보시고, 그래도 어려운 부분만 다시 정리해서 질문 주시면 감사하겠습니다.

이전글   |    아두이노 없이 버튼으로 모터 구동시 2019-03-01
다음글   |    아두이노 시리얼 통신에 문제가 있습니다 2019-03-08