Java FFTPack의 기본 사용
문제
Android 응용 프로그램에 사용할 MATLAB에 간단한 오디오 처리 알고리즘을 작성했습니다. FFT 구현을 Java로 번역하는 데 어려움이 있습니다.
Java 버전의 FFTPack 의 Java 버전을 사용하려고합니다. 또한 저에게 약간의 암호화, 아마도 FFT에 대한 단단한 파손이 일반적으로 파악하기 때문일 것입니다.
나는 FFT를 나타내는 복소수의 해당 배열을 생성하고자하는 이중 배열을 단순히 갖게됩니다. FFT에서 수행 할 수있는 유일한 계산은 요소의 절대 값을 취하고 있습니다.
명확성을 위해 자바 FFTPack을 사용하여 복제하려는 필수적인 MATLAB 코드가 있습니다.
X = fft(myDoubleArray);
abs(X[i]);
.
이것은 오히려 단순하지만, 진입 점을 fftpack으로 식별 할 수는 없습니다.
해결 :
Lutzl Works에서 아래의 답변이 작지만 FFTPACK이 입력으로 이중 배열을 지원하는 경우는 실제로 불필요합니다.
RealDoubleFFT rdfft = new RealDoubleFFT(myArray.length);
rdfft.ft(myArray);
. 해결책
를 통해 새로운 FFT 객체를 초기화합니다.
fft = new ComplexDoubleFFT(N);
.
다음 FFT 객체의 순방향 변환을
로 사용합니다.Complex1D X;
X.x=new double[N];
X.y=new double[N];
for(k=0;k<N;k++) X.x[k]=x[k];
fft.ft(X);
.
및 절대 값을
로 액세스 할 수 있습니다.x=X.x[k]; y=X.y[k]; a=Math.sqrt(x*x+y*y);
.
선택적으로 N
로 나누기 FFT를 정상화하십시오.
적절한 변수 선언을 추가합니다.
일반적인 규칙이 적용되며, 신호가 샘플링 주파수 FS로 샘플링되면, Entry X. (XY) [K]는 K= N / 2 ~ N-1에 대한 K * FS / N의 주파수 성분을 나타냅니다. < / P>
순수한 Java에서 수행되는 다른보다 나은 지원 FFT 구현을 찾고 싶을 수 있습니다. 이는 Dyadic Length에 대한 FFT를 구현하는 것은 복잡하지 않습니다. 유일한 합병증은 최종 속도 업 요인을 얻기 위해 변환을 구현할 때 유일한 합병증이옵니다.