제 질문은 무한대 반환에서 NaN 반환으로 변경되었습니다. FFT가 항상 Infinity를 반환하면 (http://gerrybeauregard.wordpress.com/2011/04/01/an-fft-in-c/#comment-196) 도움이 될 수 있습니다. 그래서 C#은 네거티브 숫자의 제곱근을 얻으려고하기 때문에 NaN을 반환한다고 생각합니다. 제곱근을 얻기 전에 두 숫자를 모두 제곱하고 있기 때문에 숫자가 음수가 아니어야합니다. 양). 그러나 반환 된 숫자는 음수입니다. re * re와 im * im을 얻기 위해 여러 변수를 사용하는 것이 비효율적이며 두 결과가 합쳐지기 때문에 비효율적 이었지만 결과는 부정적인 결과를 낳았습니다. 수학 .Abs도 좋지 않았습니다. FFT 클래스 작성자 (위의 링크 참조)에 연락하여 다음 답장을 기다리고 있습니다. 나는 전에 내가했던 AS3 버전에서 아래의 코드 중 일부를 사용했다. 만약 내가 여기에 하나를 얻으려면 내가 클래스 창조자에게서 대답을 얻으면, 나는 그것을 게시 할 것이다. 어떤 통찰력이 가장 도움이되며 지금까지 나를 도왔던 모든 사람들에게 감사드립니다. 나는 AS3 프로그래머가 C#으로 가고있다. (훨씬 더 유능하기 때문이다.) 그래서 나는 내 초능력에서 단순한 것을 놓친 것이 가능하다. 나는 Unity를 사용하고 있습니다.Decibel 대 진폭은 항상 C에서 NaN을 반환합니다. #
private const uint LOGN = 11; // Log2 FFT Length
private const uint N = 1 << (int)LOGN; // FFT Length
private const uint BUF_LEN = N; // Audio buffer length
public FFT2 fft; // FFT Object
private double[] tempIm = new double[N]; // Temporary Imaginary Number array
private double[] m_mag = new double[N/2]; // Magnitude array
private double[] m_win = new double[N]; // Hanning Window
private int fftCount = 0; // How many times the FFT has been performed
private double SCALE = (double)20/System.Math.Log(10); // used to convert magnitude from FFT to usable dB
private double MIN_VALUE = (double)System.Double.MinValue;
...
// Hanning analysis window
for (int i = 0; i < N; i++) // for i < 2048
m_win[i] = (4.0/N) * 0.5*(1-Mathf.Cos(2*Mathf.PI*i/N)); // Hanning Vector [1] = 1/4595889085.750801
...
// Perform FFT
fft.run(tempRe, tempIm);
fftCount++;
// Convert from Decibel to Magnitude
for (int i = 0; i < N/2; i++) {
double re = tempRe[i]; // get the Real FFT Number at position i
double im = tempIm[i]; // get the Imaginary FFT Number at position i
m_mag[i] = Math.Sqrt(re * re + im * im); // Convert magnitude to decibels
m_mag[i] = SCALE * Math.Log(m_mag[i] + MIN_VALUE);
if (fftCount == 50 && i == 400) print ("dB @ 399: " + m_mag[399]);
}
선행 코드 인쇄 :
dB @ 400: NaN
-5.56725062513722E+33
감사합니다!
[this sample] (http://accord-net.origo.ethz.ch/wiki/sample_applications#Fourier) – oleksii
디버거에서 다음 줄을 확인하십시오.'m_mag [i] = 10 * Mathf.Log10 ((float) ((re * re) + (im * im)))));) 실제와 가상의 값은 무엇입니까? – oleksii
고마워요! 나는 지금 그 틀을보고있다. 실제 Fourier 소스에 대한 링크는 없으며 응용 프로그램의 사진 만 있습니다. 어떠한 이유로 든 사이트의 다운로드 섹션에 행운이 없거나, 다른 것들이 호스팅되는 CodeProject에 없습니다. 디버깅 후 re 및 im은 각 인덱스의 두 배열에 대해 사용 가능한 숫자를 반환합니다. 이 수학을 계속 확인하지만 기본적으로 정확히 내가 AS3 버전에서 사용했던 것입니다. 수식을 decibel하는 정도는 내가 확인하는 모든 소스가 권장하는 것입니다. –