Java FFTW FFT maginute frequency example real imaginary 예제 정리
테스트로 만든 sin데이터를 FFT한결과
아래처럼 4Hz에 2의 데이터가 있는 계산을 하였습니다
이렇게 정리하는데 꼬박 1주일이 걸렸는데요
나중에 다시볼때 이 자료를 참고하기 위해 정리해서 올립니다
혹시나 FFT 계산을 하려는 분들에게도 도움이 되었으면 하는 바람도 있습니다
FFT에대한 수학적인 이해보다는 프로그래밍 적으로 결과값을 만드는데 치중했습니다
약간의 수학적인 이해가 필요하긴 했지만 결과를 맞춰가며 따라한 예제다보니
혹여나 맞지 않을 수 있으니.. 개발하실때 참고해주세요
첫번째 자료 정리 : FFT DFT java example 이론 정리와 java 예제 코드 구성
http://paranwater.tistory.com/487
참고한 자료
FFT 사용에 대해 전체적인 이론을 파악할수 있는 정말 좋은 자료입니다
FFT계산하는데 필요한 파라메터들에대한 상세한 설명이 있습니다
해당 자료는 sti.or.kr 라는 사이트에 2014년 정리된 자료로 상당히 최근 자료입니다
그리고 한글!로 작성된 자료입니다
위 자료를 참고로 예제를 아래처럼 정의할 수 있습니다
샘플링 주파수 Hz (Sample Rate) : 128 FFT 사이즈 (Sample) : 128 상한 주파수 대역 : 64Hz 주파수 해상도 : 1Hz |
FFT 이론에 관한 두번째 좋은 자료
신호에 관한 개괄적인 내요을 정리한 자료입니다
www.hanbit.co.kr
FFT한 결과로 나온 real, imaginary 데이터로 maginute 값 계산할때 참고한 자료 입니다
위 강의에서는 Matlab예제로 maginute를 계산하고있는데요
이를 java코드로 그대로 따라 만드니 같은 값이 도출되었습니다
이 자료에서는 대칭되는 값을 처리하는 내용도 포함하고 있습니다
matlab는 아니지만 FreeMat라는 비슷한 프로그램을 사용하여 데이터 검증을 했습니다
http://freemat.sourceforge.net/
frequency 계산할때 참고한 자료입니다
stackoverflow - My app “find frequency of audio input from microphone” always crashs. But why?
이자료에서는 frequency값을 계산하는 방법을 참고했습니다
위 질문에 있는 코드는 그대로 java에서 실행 할 수 있습니다
노트북에 마이크가 있어서 실제 소리로 해당 Hz를 검출하는 내용을 확인했습니다
아래 코드는 위에서 확인된 내용을 모두 포함한 코드입니다
전체 코드
package fft0.example; /* Start reading here */ import org.apache.commons.math.complex.Complex; import org.apache.commons.math.transform.FastFourierTransformer; import static java.lang.Math.*;
public class JavaFastFourierTransformer_matlabexample_음향측정2 { public static void main(String args[]) { JavaFastFourierTransformer_matlabexample_음향측정2 a = new JavaFastFourierTransformer_matlabexample_음향측정2();
double[] conversionValue = a.transform(); for(int i = 0; i < conversionValue.length; i++){ // System.out.println(conversionValue[i]); }
}
private double[] transform() {
int sampleSize= 128; //power ^ 2 float sampleRate= 128.0f; double Fs = sampleSize; double frequency = 0;
// sin 샘플 데이터를 위한 변수 double Ts = 1/Fs; double [] t = new double[sampleSize] ; double [] input = new double[sampleSize];
for(int i = 0; i < sampleSize; i++){ t[i] = Ts * i; }
for (int i = 0; i < sampleSize; i++) { input[i] = 2 * sin( 2 * PI * 4 * t[i]); // System.out.println(input[i]); } System.out.println("-------------------------------");
double[] tempConversion = new double[input.length/2]; //100 is not a power of 2, consider padding for fix | 2의 거듭제곱의 개수로 해야함 FastFourierTransformer fft = new FastFourierTransformer(); try {
Complex[] complx = fft.transform (input);
for (int i = 0; i < (complx.length / 2); i++) { // 대칭되는 값을 제외하기위해 절반만을 사용 double rr = (complx[i].getReal()) / sampleSize * 2; // maginute값 계산을 위한 마사지 double ri = (complx[i].getImaginary()) / sampleSize * 2; // maginute값 계산을 위한 마사지 tempConversion[i] = Math.sqrt((rr * rr) + (ri * ri)); // maginute계산 double mag = tempConversion[i];
frequency = (sampleRate * i) / sampleSize; // frequency계산
System.out.println(frequency+"\t"+mag); } } catch (IllegalArgumentException e) { System.out.println(e); } return tempConversion; } } |
'보물창고 > Programming' 카테고리의 다른 글
Centos sudo 권한 설정 방법 (0) | 2017.04.05 |
---|---|
해결 GPIO.setmode(GPIO.BOARD) AttributeError: 'module' object has no attribute 'setmode' (0) | 2015.11.11 |
정규식 공백 두개 하나로 바꾸기 치환 변경 수정 (1) | 2015.08.17 |
elasticsearch index client java api example mavne 프로젝트 기본 구조 (0) | 2015.07.20 |
FFT DFT java example 이론 정리와 java 예제 코드 구성 (4) | 2015.07.15 |
라즈베리파이 아두이노 무선 통신 rf315/433 사용하기 arduino raspberry pi (2) | 2015.04.29 |
라즈베리파이와 아두이노 RF315/433 송수신 코드 정리 raspberry arduino (0) | 2015.04.24 |
aliexpress 아두이노 라즈베리파이 무선 통신 부품 구입 릴레이 RF315/433 (0) | 2015.04.13 |