라즈베리파이 파이썬3 FFT연산을 활용한 주파수 분석 소스 수정 도와주세요ㅠㅠ
글쓴이: matty10 / 작성시간: 토, 2016/12/03 - 10:15오후
안녕하세요 고2 초보 개발자 입니다! 궁금 한게 있을때 마다 들린 KLDP인데 도저히 문제가 해결되지 않아 질문 드립니다...
임베디드 관련 개발을 하다 주파수를 분석해서 자동으로 주보를 생성해 내는 게임기를 만들어 보고싶은데 C언어만을 사용하다 보니 Python을 활용한 FFT에서부터 막혀 버리고 말았습니다ㅠㅠFFT나 Python을 전혀 사용할 줄 몰라서 FFT를 활용해 그래픽으로 주파수의 분석 결과를 보여주는 소스를 정말 많이 찾아봤는데 제가 원하는 방식으로 그 주파수의 raw데이터를 출력하는 소스는 찾을 수 없더라고요...
import wave import struct import numpy as np import wave import contextlib import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(6, GPIO.OUT) GPIO.setup(17, GPIO.OUT) GPIO.setup(27, GPIO.OUT) GPIO.setup(21, GPIO.IN) if __name__ == '__main__': fname = "test.wav" frate = 0 data_size = 0 with contextlib.closing(wave.open(fname,'r')) as f: frate = f.getframerate() data_size = f.getnframes() wav_file = wave.open(fname, 'r') data = wav_file.readframes(data_size) data_size = data_size * wav_file.getnchannels() print wav_file.getparams() wav_file.close() data = struct.unpack('{n}h'.format(n=data_size), data) data = np.array(data) w = np.fft.fft(data) freqs = np.fft.fftfreq(len(w)) print(freqs.min(), freqs.max()) # Find the peak in the coefficients idx = np.argmax(np.abs(w)) freq = freqs[idx] freq_in_hertz = abs(freq * frate) print(freq_in_hertz) #1 옥타브 대역 주파수 if 16 <=freq_in_hertz and freq_in_hertz<=17 : GPIO.output(6, HIGH) time.sleep(1) if GPIO.input(21) : GPIO.output(17, HIGH) GPIO.output(27, LOW) else : GPIO.output(17, LOW) GPIO.output(27, HIGH)
이런 소스 코드도 찾아 봤는데 제가 원하는 방향으로 어떻게 수정해야 할지 모르겠네요...
1초 간격으로 음원 파일의 주파수 값을 배열에 저장하고 싶은데 어떻게 해야 할까요ㅠㅠ 역시 블럭단위로 분석하는 거라 포기해야 하나요?ㅠㅠ
Forums:
소스 변경하고 나니 조금 더 낫네요. 하지만 아직도
소스 변경하고 나니 조금 더 낫네요. 하지만 아직도 1초간격의 분석방법을 모르겠습니다...ㅠ
댓글 달기