본문 바로가기

보물창고/Programming

Java FFTW FFT maginute frequency example real imaginary 예제 정리

반응형

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 사용에 대해 전체적인 이론을 파악할수 있는 정말 좋은 자료입니다

음향측정2.PDF

FFT계산하는데 필요한 파라메터들에대한 상세한 설명이 있습니다

해당 자료는 sti.or.kr 라는 사이트에 2014년 정리된 자료로 상당히 최근 자료입니다

그리고 한글!로 작성된 자료입니다


위 자료를 참고로 예제를 아래처럼 정의할 수 있습니다

샘플링 주파수 Hz (Sample Rate) : 128

FFT 사이즈 (Sample) : 128

상한 주파수 대역 : 64Hz

주파수 해상도 : 1Hz


FFT 이론에 관한 두번째 좋은 자료

신호에 관한 개괄적인 내요을 정리한 자료입니다

디지털 신호 처리의 개요

www.hanbit.co.kr



FFT한 결과로 나온 real, imaginary 데이터로 maginute 값 계산할때 참고한 자료 입니다

13강 - MATLAB 때려잡기 - FFT 2부

위 강의에서는 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;

    }


반응형