※ solution에 대한 코드는 절대 제공되지 않으며, 수업진행에 필요한 모든 도움은 최영규 교수님의 자료 및 이메일을 참고하길 바랍니다.
드디어 cordic의 마지막입니다. 가봅시다.
앞선 강의들에서 시행착오가 발생하였는데, 이를 해결하고 최적화 목표를 이루어봅시다.
1. 오차 없애기
2. 가장 적은 자원 소비
를 기준으로 하겠습니다.
동적범위 측정법인데
사실 보편적으로 알고 있는 저희들의 지식을 바로 사용해도 됩니다.
저희가 사용할 초기값(소수)의 사용 범위를 정합니다.
1bit에 따라 6dB의 SQNR(Signal to Quantization Noise power Ratio)의 변화가 발생합니다.
사용하는 비트수가 증가할 수록 오차가 줄어든다는 걸 생각해봅시다.
쉬프팅& 사인 확장입니다.
사인비트가 있는 것을 고려해 shifting(x2 or /2 하는 것)으로 자리수를 맞추고,
다른 FWL, IWL을 가진 수끼리의 연산입니다.
결과값의 동적 범위는 simulation을 통해서 측정된 값을 통해 변수 C의 값을 정합니다.
정확한 과정은 위에 step1로 명시되어있지만, 우리는 대충 몇비트인지 예상이 가능합니다.
반 내림을 해줍니다.
주의 : C언어에서 shifting연산이 +연산보다 연산우선순위가 낮기 때문에 괄호로 영역표시 잘해줍시다.
역시나 결과 범위 측정입니다. (정규 과정 or 대충 예상)
0 7 6 bit 순으로 13bit라 가정, sign 확장해주고 반올림(반내림)해주는 과정....
사진이 상단과 같을 때,
C = A+B를 소수레벨이 아닌 정수레벨에서 연산하는 방법은 그래서 어떻게 되는가?
주의 : 직접 해보고 확인하시길 바랍니다.
출력 에러(&오차) 측정을 하는 시퀀스를 겪어서 제대로 동작하는지 확인
FWL 길이 줄여서 수행해보기
FWL의 길이를 줄여서 정확도와 시간의 trade-off 관계를 확인해봅시다.
최적화에 성공하면, 변수type에 의한 성능 개선의 목표였던 자원줄이기가 성공한 것을 확인할 수 있습니다.
다만 Error 수치가 약간 증가한 것을 볼 수 있는데(오차)
이는 위에서 말한 trade-off입니다
다음은 제가 실제로 성공한 예시의 결과물입니다.
error : 0.62749
Latency = 36(28)
에서 비트수를 더 줄여봅니다.
error : 0.62871
Latency : = 28(20)
퍼센트로 표현하면 매우 작지만, 값은 항상 상대적인 것이기에...
이상으로 마치겠습니다. 감사합니다.