시그마델타 펄스제어기,
임의의 시간동안의 On 비율을 원하는 비율에 맞게 조정할수있는 펄스제어기
분명 강력했지만 1.5조합기가 필요하여
이미 존재하던 조합기1개짜리 펄스제어기에 비해 크다는 단점이 있었다.
조합기 하나로는 1/2, 1/3, 1/4 등 분자가 1인 비율의 펄스밖에 다루지 못했지만
팩토리오내에선 그것만으로 충분히 강력하여 굳이 0.5조합기를 더 사용해야할 이유를 찾지못해
잘 사용되지 않았지만...
1조합기로도 가능했다.
위 사진은 이 펄스제어기로 851 : 1200 비율을 입력한 펌프의 속도측정.
(사실 851일때를 갭쳐하긴 했지만 849~853 정도를 오락가락 하긴 한다.)
당연히 1/2,1/3 등의 비율도 가능하며 모든주기의 펄스를 표현할 수 있다.
어떻게?
이게 전부다.
그리고 펌프는 시계신호가 898,363,992 보다 작을때 가동하도록 되어있다.
원리는
-1,640,531,535 라는 상수의 특별함에 있다.
이 값을 16진수로 표현하면 0x9E3779B1
2^32를 황금비율로 나눈 값이며
'가장 유리수로 근사화하기 어려운 실수', '마법의 해싱상수' 등의 이름으로 불리는 특별한 수이다.
어떠한 분수와도 잘 맞지않는 그 특성덕에
이렇게 계속 더해가며 2^32 모듈러연산을 수행할경우
값이 32비트 전 영역에 매우 고르게 퍼지는 수열형태를 띄게된다.
그 특성덕에 실제로 해싱함수에서 자주 보이며, 난수발생기에 쓰이는경우도 있다.
그리고 898,363,992 라는값은 원하는 펄스비율 p 에 대해
(p-0.5) * 2^32
1200의 최대속도를 가지는 펌프로 851의 속도를 내고자하니 p = 851/1200
결과는 898,363,992
같은방식으로 초당 450의 속도를 가진 펌프를 원한다면
p 값에 450/1200를 대입.
(450/1200-0.5) * 2^32 = -536,870,912
-536,870,912 를 입력하면 되겠다.
매번 계산기를 두드리기 귀찮다면 청사진 매개변수에 이 식을 등록해두면 사용할때마다 비율만 입력하면 알아서 계산해준다.
한가지더
이것이 제대로 동작하는지 확인하기위해 한가지 실험을 해보았다.
실험구성은 이렇게,
왼쪽에있는 비교조합기가 펄스제어기이며
가운데있는 조합기들은 각각 10%, 20%, 30%... 90%까지의 가동률을 가진 구동부
가장 오른쪽의 비교조합기는 각 구동부가 가동할때마다 그 횟수를 누적한다.
일정신호조합기는 1의 시계신호를 계속 출력하여 경과된 틱수를 기록.
그리고 100틱 경과후,
한틱씩 모자른경우가 보이지만 대체적으로 정확한 비율을 보여준다.
1000틱 경과시점,
여전히 약간의 차이가 있지만 모두 1틱이내의 오차.
1만틱 경과 시점.
이제 1단위의 정확한값이 나오지않지만 하나하나 확인해본결과
80% 비율의 구동부가 7999, 이론보다 1회 모자랐으며
20% 비율의 구동부가 2001, 1회가 더 많았다.
그외는 전부 깔끔하게 이론과 동일.
이정도면 충분히 정확하다고 말해도 될 수준이 아닌가 싶다.
이로써 마지막남은 단점인 크기문제도 해결되어
이제는 기존의 펄스제어기를 사용할 이유가 사라졌다고 해도 좋을것 같다.
1줄 요약좀
조합기 하나로 피크 안 튀는 펄스 제어기 만들수 있음
rand()<p
@이파 와... 완벽한 한줄요약. 박수
아예 난수발생기를 조건으로 쓴다는건 또 못해본 발상이긴하네 ㅋㅋ
얼탱
네??
잘 이해가 안가는게 본문에서 예시로 든 898,363,992를 어디에다 넣어야 하는거야?
@말랑별 펌프의 가동조건을 시계신호가 898,363,992 이하일때로 했음. 본문에 사진하나 추가해두는게 좋겠군요.
@글쓴 팩붕이(123.199) 아 그걸 제어하려는 기계에 바로 넣어야하는구나
모듈러 연산을 반복하면 32비트 난수가 되는 상수가 있다는걸 모르면 상상조차 할 수 없는 발상 ㄷㄷ
제발 게임을 해주세요
샌드박스모드도 게임이라네 친구.
이쯤되면 무. 섭. 다..............
와씨 진짜 이 게이는 미친게이 같아요....... 난수발생기를 만든건데 심지어 출력값도 고르게 나온다고?? 엄마 이 아저씨 무서워 도망갈래
@안전조아 저 상수값 자체는 이름이 있을정도로 유명한 값이라 여기저기서 많이 쓰이는거긴함.. 근데 사실 이렇게까지 고르게 나올줄은 예상못하긴했음.
@글쓴 팩붕이(123.199) 배워갑니다... ㄷㄷㄷ.....