알고리즘의 수치 요구 사항을 알고 그에 따라 정밀도를 선택해야합니다.
32 비트 부동 소수점은 24 비트 가수와 8 비트 지수를 갖습니다. 이는 약 1540dB의 동적 범위에서 약 150dB의 신호 대 잡음비를 제공합니다. 대부분의 오디오에는 충분합니다. 배정 밀도는 대략 두 배나됩니다.
각 알고리즘에는 수치 정밀도에 대한 특정 요구 사항이 있습니다. 내가 알고있는 모든 오디오 알고리즘을 올바르게 설계하면 32 비트 부동 소수점으로 잘 작동합니다. "올바로 디자인되었습니다"는 키워드입니다. 예를 들어 II IIR bi-quad 필터에서 직접 구현 된 44.1kHz에서 샘플링 된 40-200Hz의 6 차 대역 통과는 실제로 32 비트에서 약간의 노이즈 문제가 있습니다. 그러나 전치 형태 II 또는 직접 형태 I 필터로 완벽하게 작동합니다.
예를 들어 Matlab의 residuez () 함수를 사용하여 동일한 대역 통과 필터의 부분 분수 확장을 시도하면 배정 밀도로도 나쁜 결과를 얻을 수 있습니다. 이 특정 입력 데이터에 대한 알고리즘의 수치 요구 사항은 배정 밀도가 제공하는 것을 초과합니다. 이 문제를 해결하는 열쇠는 정밀도를 맹목적으로 높이는 것이 아니라 더 나은 알고리즘을 사용하는 것입니다.
마지막으로 플로팅 (32 비트 또는 64 비트)을 취약하게 만드는 요소를 살펴 보겠습니다. 다이나믹 레인지가 넓습니다. 즉, 신호를 200dB로 축소하고, 500dB로 증폭하고, 다시 300dB로 축소하고, 시작한 위치를 정확하게 종료 할 수 있습니다 정밀도의 손실이 거의 없습니다. 그래서 그렇지 않습니다. 부동 소수점은 크기가 크게 다른 숫자를 추가하는 데 문제가 있습니다. 작은 숫자를 추가해도 아무런 차이가 없습니다. 즉, 1 + dx = 1이됩니다. 이 숫자 "dx"는 32 비트 부동 소수점의 경우 약 1.2e-7이고 64 비트의 경우 2.2e-16입니다. 알고리즘에 크기가 큰 숫자를 더하거나 빼는 것이 포함되면 문제가 발생할 수 있습니다.
이에 대한 좋은 예는 앞에서 언급 한 Direct Form II 필터입니다. Direct From II 필터 (예 : https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html 참조 )는 기본적으로 입력을 필터링하여 상태 변수를 계산합니다. 극 전용 전송 기능을 먼저 사용한 다음 0으로 필터링하여 출력을 만듭니다. 이제 극점이 단위 원에 가까워지면 극 전용 전달 함수가 매우 커집니다. 따라서 상태 변수는 입력보다 훨씬 클 수 있으며 (80db ~ 100dB 더 커짐) 입력과 상태 변수를 합하면 많은 노이즈가 발생합니다.
여기서 해결책은 전치 된 Form II 또는 Direct Form I 필터로 이동하는 것입니다. 분석에 따르면 상태 변수는 입 / 출력보다 12dB 또는 그 이상의 값보다 클 수 없으므로 문제 크기 불일치가 처음에 발생하지 않습니다.