단순히 데이터를 스케일링하여 진폭 (및 아마도 FFT 품질)을 높이는 것이 유효합니까?


10

Mark Borgerding의 "KISS FFT"버전을 사용하고 있습니다. 16 비트 고정 소수점 입력 값의 배열을 허용하고 32 비트 부동 소수점 결과 배열을 생성합니다.

입력 진폭이 낮 으면 많은 플로트 결과 값이 0으로 나오지만 입력을 단순히 스케일링하면 (예를 들어, 요소 16) 출력 값이 더 적으므로 출력에 포함되는 것으로 보입니다 자세한 세부 사항. (내 목적에는 중요하지 않지만 일관성을 위해 결과 float 값을 동일한 배율로 나눕니다.)

어쨌든, 이것은 이전에 거의 모든 0의 버퍼를 얻었을 때 결과를 생성하는 관점에서 작동하는 것처럼 보이지만 유효한 접근법이 아닐 수있는 이유가 있는지 궁금합니다.

(이 접근 방식은 데이터에 대한 "거칠음"/ 과립 성이 훨씬 더 높으며, 특히 일반적으로 존재하는 낮은 수준의 노이즈가 아니라는 것을 의미합니다. 입력의 0 값을 대체하는 저수준 노이즈.)


"입력의 0 값을 대체하기 위해 저수준 노이즈를 주입하는 것이 현명한 지 거의 궁금하다." = en.wikipedia.org/wiki/Dither
endolith

답변:


7

이것은 유효한 접근 방법이 될 수 있습니다. 고정 소수점 (예 : 정수) 산술을 사용할 때 종종 발생하는 매우 실용적인 문제가 관찰되고 있습니다 (물론 부동 소수점에서도 발생할 수 있음). 계산을 수행하는 데 사용하는 숫자 형식이 계산에서 발생할 수있는 전체 범위의 값을 표현하기에 충분한 정밀도를 가지고 있지 않은 경우 일부 형태의 반올림이 필요합니다 (예 : 잘림, 반올림 등). 의 위에). 이것은 종종 신호에 대한 추가 양자화 오류 로 모델링됩니다 .

그러나 알고리즘과 반올림 방식의 일부 조합의 경우 입력 신호의 크기가 매우 낮은 경우 관찰 한 것을 얻을 수 있습니다. 많은 수의 제로 출력. 기본적으로 작업 순서 어딘가에서 중간 결과는 0이 아닌 수준으로 양자화하는 데 필요한 임계 값을 위반하지 않을 정도로 작아지고 있습니다. 그런 다음 값은 0으로 반올림되어 출력으로 전달 될 수 있습니다. 결과에서 알 수 있듯이 많은 출력 제로를 생성하는 알고리즘입니다.

데이터를 확장하여이 문제를 해결할 수 있습니까? 때때로 (항상 작동하는 기술은 거의 없습니다!). 입력 신호가 숫자 형식 (-32768에서 +32767까지 실행되는 16 비트 부호있는 정수)의 풀 스케일보다 작은 값으로 제한되는 경우 입력 신호를 스케일링하여 그것. 이것은 라운드 오프 에러의 크기가 관심 신호에 비해 작아짐에 따라 라운드 오프 에러의 영향을 완화하는 데 도움이 될 수 있습니다. 따라서 모든 출력이 알고리즘 내부에서 0으로 반올림되는 경우 도움이 될 수 있습니다.

그러한 기술이 언제 당신을 해칠 수 있습니까? 알고리즘 계산 ​​구조에 따라 입력 신호를 스케일 업하면 숫자 오버플로가 발생할 수 있습니다. 또한 신호에 알고리즘의 반올림 오류보다 크기가 큰 배경 잡음이나 간섭이 포함 된 경우 출력에서 ​​얻는 것의 품질은 일반적으로 계산에 도입 된 오류가 아니라 환경에 의해 제한됩니다.


나는 꽤 잘 작동하는 것으로 보이는 스케일링을 위해 동적 기술을 사용하고 있습니다. 운 좋게도 극단적 인 과도 현상은 노이즈로 처리되어 어쨌든 잘 리므로 가끔 클리핑이 문제가되지 않습니다. 입력의 스케일 팩터로 나누어 출력을 "스케일 제거"하는 것이 타당하다고 생각하십니까?
Daniel R은

1

이것을 처리하는 가장 쉽고 가장 확실한 방법은 FFT 전에 데이터를 부동 소수점으로 변환하고 부동 소수점 FFT를 사용하는 것입니다. 이 방법의 유일한 단점은 더 많은 프로세서와 메모리를 소비 할 수 있다는 것입니다. 어쨌든 출력이 부동 소수점이므로 실제 차이는 거의 없습니다.


현재 FFT 알고리즘을 사용 하여이 프로젝트를 진행 했으며이 시점에서 그것을 다루기를 꺼려합니다. 그리고 이것은 전화로 실시간으로 진행되므로 성능은 분명히 문제입니다.
Daniel R은

이해했다. FFT 내부가 고정 또는 부동 소수점인지 알고 있습니까? 고정 된 경우 클리핑, 오버플로 및 언더 플로에 대해 걱정해야합니다
Hilmar

문서와 주석은 그 부재에서 예외적이지만 코드에 많은 정수가 있고 귀중한 수레와 복식이 있습니다. 16 비트에서 32 비트로 또는 플로트로 전환하기위한 조잡한 #ifdef 프레임 워크를 포함하는 것으로 보이지만 프레임 워크는 오랫동안 비활성화되어있었습니다.
Daniel R은

iPhone (ARM + NEON CPU)은 C의 정수 FFT보다 (가속 프레임 워크를 통해) 플로트 FFT를 더 빠르게 수행 할 수 있습니다.
hotpaw2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.