?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

안녕하세요^ㅇ^

페이지 정보

작성자 정윤진 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-02-23 19:06 조회1,012회 댓글1건

첨부파일

본문

안녕하십니까 항상 답변해주셔서 감사합니다ㅎ 근데도 항상 저는 헤매는 군요 ㅜ 바로 질문하겠습니다.

제가 만들고 싶은 것은 노래를 틀면 그 노래의 계이름을 알 수 있도록 하는 것입니다.

계이름은 각각 주파수를 가지고 있을 것이니 주파수를 알아내면 되겠다고 생각했습니다.

그래서 아두이노 우노와 ADAFRUIT MAX4466을 구입하였습니다.

아두이노 공식홈페이지로 들어가 REFERENCE 에 보니 LIBRARY에 FFT라이브러리가 있어 그것을 다운로드받고 예제 소스코드를 활용했습니다. 제가 소스코드를 직접 쓸 만큼 실력이 되지 않아 예제코드를 그대로 쓰고 편집할 부분은 구글링해서 편집했습니다. 

업로딩까지 완료한 후 시리얼 모니터를 보니 빠른 속도로 값들이 뜨더군요 근데 아무리 높은 음을 들려줘도 200을 넘지 않고 아무소리도 들려주지 않아도 0에서 100사이 값들이 마구잡이로 나오는 겁니다.  

저는 4옥타브 도(C) 즉 262HZ를 들려주었을 때 최소한 262 근처의 값이 나오도록 하고 싶습니다.스케치를 어떻게 수정하면 될까요? 부분 삭제해보고 수정해보고 덧붙여 보기도 했는데 되질 않네요 ㅜ

 

http://www.hardcopyworld.com/ngine/aduino/index.php/archives/2354

http://www.hardcopyworld.com/ngine/aduino/index.php/archives/2351

http://wiki.openmusiclabs.com/wiki/ArduinoFFT

이때까지 제가 참고했던 페이지중 몇개입니다 ㅜ

 

=======================================================

 

/*
fft_adc.pde
guest openmusiclabs.com 8.18.12
example sketch for testing the fft library.
it takes in data on ADC0 (Analog0) and processes them
with the fft. the data is sent out over the serial
port at 115.2kb.  there is a pure data patch for
visualizing the data.
*/

// do #defines BEFORE #includes
#define LOG_OUT 1 // use the log output function
#define FFT_N 128 // set to 256 point fft
#include <FFT2.h>


void setup() {
  Serial.begin(1200); // use the serial port
  TIMSK0 = 0; // turn off timer0 for lower jitter - delay() and millis() killed
  ADCSRA = 0xe5; // set the adc to free running mode
  ADMUX = 0x40; // use adc0
  DIDR0 = 0x01; // turn off the digital input for adc0
}

void loop() {
  while(1) { // reduces jitter
    cli();  // UDRE interrupt slows this way down on arduino1.0
    for (int i = 0 ; i < 512 ; i += 2) { // save 256 samples
      while(!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      byte m = ADCL; // fetch adc data
      byte j = ADCH;
      int k = (j << 8) | m; // form into an int
      k -= 0x0200; // form into a signed int
      k <<= 6; // form into a 16b signed int
      fft_input[i] = k; // put real data into even bins
      fft_input[i+1] = 0; // set odd bins to 0
    }
    // window data, then reorder, then run, then take output
    fft_window(); // window the data for better frequency response
    fft_reorder(); // reorder the data before doing the fft
    fft_run(); // process the data in the fft
    fft_mag_log(); // take the output of the fft
    sei(); // turn interrupts back on
     for (uint8_t j = 0; j < FFT_N/2; j++) {
      Serial.print(j);
      Serial.print(" ");
      Serial.println(fft_log_out[j]);
    }
  }
}

=======================================================

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

FFT 사용에 가장 중요한 내용들이 아래 링크에 있네요
http://wiki.openmusiclabs.com/wiki/FFTFunctions
http://wiki.openmusiclabs.com/wiki/Defines
FFT는 일정 시간동안 파동(음파)의 세기를 측정한 값을 넣으면, 해당 시간동안 파동을 구성한 주파수들을 분석해서 줍니다. 이때 입력한 측정값(Hz 단위, 초당 측정 횟수)의 절반에 해당하는 주파수까지 찾아줍니다. 예를 들어 128Hz 로 측정해서 입력하면 0~64Hz까지 각 주파수별 크기가 나올겁니다. 따라서 원하는 입력값을 적당히 입력해야 주파수 범위도 제대로 찾습니다. 라이브러리에서는 이게 FFT_N 로 표기되는거 같네요. 근데 아두이노 메모리 한계상 256이 한계인듯. 측정 간격을 조절해서 입력값의 주파수를 조절해보세요. 아래의 샘플 코드를 이용해서 여러가지 실험을 해보셔야 할 것 같습니다.
http://wiki.openmusiclabs.com/wiki/Example