2009-11-13 6 views
2

uint8 데이터 형식에서 fft2 연산을 실행하는 MATLAB Embedded Coder를 사용하여 일부 코드를 생성하고 싶습니다. 최종 응용 프로그램은 최대 4096 x 4096 이미지에서 작동하므로 double (~ 16MB 대 최대 16MB) 입력을 사용하여 emlc을 사용하여 코드를 컴파일 할 필요가 없습니다.MATLAB Embedded Coder : uint8에 대한 fft2 연산?

%#eml 
function bar = emlc_test(foo) 
    bar = fft2(foo); 
end 

컴파일러 명령 :

??? Function 'fft' is not defined for values of class 'uint8'. 

동일한 코드/컴파일 명령이 작동 :이 오류가 발생

emlc -T rtw emlc_test -c -report -v -eg { zeros(32,32,'uint8') } 

여기

내가 실행하고있는 무슨의 샘플입니다 변경시 미세 조정합니다. 'uint8' ~ 'double'

하지만 생성 된 코드를 보면 처리가 uint8 공간에서 실행 가능해야합니다. fft2 작업이 double 데이터가 아닌 uint8 데이터에서 작동하도록 허용하지 않는 플래그가 있습니까?

답변

4

MATLAB fft2 reference documentation은 이중 또는 단일 유형 요구 사항을 명시 적으로 나타냅니다.

입력시에도 싱글을 기반으로하는 "괴물"(*) 매트릭스를 사용해야 할 수도 있습니다. 이 이유는 MATLAB이 출력에서 ​​원하는 유형을 결정할 수있는 방법이 없다는 것입니다. 다른 점은 MATLAB이 입력과 동일하다는 것입니다.
(**) 실제로 그렇게 크지는 않습니다 : 단일 유형은 의도 한 것의 4 배에 불과합니다.

+0

@Peter Mortensen, 'MatLab'이 아닌 'MATLAB'에 대한 맞춤법 수정에 감사드립니다. 내 코딩 습관 (낙타 - 케이스 포함)은 영어 문법이나이 경우에는 등록 된 이름에 대한 나의 존경심을 더욱 약화 시켰습니다 ... – mjv

2

아니요, 불가능합니다. fft 및 fft2는 단일 및 이중 플로트 만 지원합니다. 그것에 대해 할 수있는 일이별로 없습니다. 메모리 공간을 절약하려면 싱글 플로트를 사용해보십시오.

2

정말로에 최적화가 필요한 경우, 내가 할 수있는 유일한 방법은 바퀴를 재발 명하는 것입니다. 처음부터 FFT 기능을 구현하십시오 (많은 작업).

+0

심지어 그는 ... uint8 벡터에서 어떻게해야합니까? DFT는 복소 벡터 집합에 대한 단일 선형 맵에 해당합니다. FFT 알고리즘은 대개 "적절한 위치에서"작동하고 데이터를 회전 및 셔플합니다. 라운딩 오류 및 오버플로 및 언더 플로우가 * 많이 * 도입되지 않으면 uint8 배열에서이를 수행 할 수 없습니다. – sellibitze

+0

Matlab의 C 출력이 Matlab에서보다 느리게 실행 되었기 때문에 궁극적으로 Klass FFT를 사용하여 Matlab이 생성 한 코드를 대체하게되었습니다. 내 의도는 C 응용 프로그램의 Matlab 외부에서 코드를 사용하는 것이 었습니다. –