2014-03-05 4 views
5

오디오 신디사이저에서 호출 비싼 sin 함수를 사용하고 모든 샘플이 순차적이며 이전에 계산되어 정수 (PCM)로 반올림된다는 사실을 이용하지 못합니다. 그렇다면 대안은 무엇입니까?방지 죄()는 순 정현파 발생기는 N 개의 값들의 세트를 취하고 그들 각각에 죄 함수를 호출

Bresenham's circle algorithm의 라인을 따라 상상해 보거나 고해상도 샘플을 사전 계산 한 다음 매 n 번째 항목을 취하여 크기를 줄이지 만이 문제에 대한 '산업적 강점'해결책이있는 경우, 듣고 싶어.

+0

sin() 값이 가장 가까운 정수로 반올림됨을 언급 한 것 같습니다. 사실입니까? – user2566092

+0

아, 분명히해야합니다. 이것은 wav 인코더로 들어가므로 PCM입니다. 따라서 모든 부동 소수점 값은 부호있는 16 비트 int로 처리됩니다. –

+0

얼마나 정밀한 주파수 해상도가 필요합니까? – jaket

답변

4

(0, 0)에 추가 할 때 (cosθ, sinθ)를 제공하는 벡터 z를 계산할 수 있습니다. 여기서 θ = 2 * pi/step입니다. 그런 다음이 벡터를 (1,0)에 더하고 다음 sin 값을 합계의 y 좌표로 가져옵니다. 그런 다음 각도 theta를 통해 회전 행렬을 곱하여 z를 회전하고 이전 벡터 (cosθ, sinθ)에이를 추가하여 다음 sin 값을 결과 합계 벡터의 y 좌표로 가져옵니다. 기타 등등. 이를 위해서는 cos θ와 sin θ를 한 번만 계산해야합니다. 그런 다음 각 업데이트는 2x2 행렬과 2-d 벡터의 행렬 곱셈에 의해 주어진 다음 간단한 가산으로 주어지며 멱급수를 사용하여 sin()을 계산하는 것보다 빠릅니다 확장.

+0

좋은 기법. 아마 roundoff 오류의 축적을 피하기 위해 double precison에서 이것을 수행하는 것이 현명 할 것입니다. –

+0

정밀도 문제에 동의하면 라운드 오프 문제에 대한 미묘한 해결책이 생길 수 없다는 결론을 내 렸습니다. 따라서 라운드 오류는 현재 불가피합니다. 단 단계가 너무 작지 않고 배정도가 정확하지 않으면 무시할 수 있습니다. 익숙한. – user2566092

+0

죄송합니다. 내 의견이 질식어하는 것처럼 들린다면 캐주얼 리더에게 '단 하나의 정밀도'를 '최적화'로 사용하지 않아야하는 예제를 지적했습니다. –