2011-10-20 7 views
1

오늘 (Oura FFT 라이브러리를 사용하여) C++ 코드를 작성하여 Matlab과 동일한 결과를 얻으려고 애 쓰면서 마침내 문제와 해결책을 발견했습니다.Ooura 반대 FFT 차이점 Matlab ifft

진폭 - 주파수 응답의 격자 역 계수를 산출 매트랩

은 (matlab에 내부 fir2() 함수의 코드 단편)는 다음과 같은 방식으로 수행된다 : 결과

%H contains 8192 points of AFR data 
Hconj = [H conj(H(npt-1:-1:2))]; % Fourier transform of real series 
ht = real(ifft(Hconj));   % Symmetric real series 

우리는 다시 16,384 빈들 얻을 , 후반은 버려 질 수 있지만, 전반은 나중에 FIR 계수로 사용될 수 있습니다. 내가 진짜 DFT의 rdft() 함수를 사용 Ooura에서 동일한 작업을 수행하는 경우

는하지만,이 결과 AFR의 거울 효과를 만들 계수를 얻을 수는 AFR 플롯의 모든 주파수는 그래서 2

로 분할된다 아이디어가 나에게 와서 : 내 C + + 코드에서 나는 두 번 큰 (16384 점)을 만들어 미러링없이 주파수 데이터로 채웠다. 그리고 짜잔! 이제는 16384 포인트를 얻었습니다. 8192 포인트 이후에 모든 것을 버리고 결과 AFR이 Matlab과 일치합니다.

모든 표준 FFT 구현에이 미러링이 필요하다고 확신했습니다. 오우 라 (Ooura)의 단점은 입력에서 데이터를 미러링 할 필요가 없거나 다른 일이 발생했을 가능성이 있습니까?

답변

1

"실제"FFT는 종종 미러 된 값에 대한 입력의 복소 공액을 자동으로 사용하여 내부적으로 미러링을 수행합니다. 표준 FFT/IFFT는 실수만을 갖는 출력으로 제한된 FFT/IFFT 구현의 2 배의 자유도 (예를 들어, 복잡한 출력 또는 IFFT로부터의 복잡한 도메인 필터를 생성하기 위해)를 갖기 때문에이를 행하지 않는다.

FFT의 주파수 bin 단계 크기는 길이에 의해 제어됩니다. 길이의 절반은 원래 시험판에서와 같이 주파수 스텝 크기의 절반을 생성합니다.