2

したがって、私の質問は Infinity を返すことから NaN を返すことに変わりました。FFT が常に Infinity を返す場合、これが役立つ場合があります ( http://gerrybeauregard.wordpress.com/2011/04/01/an-fft-in-c/#comment-196)。したがって、C#は負の数の平方根を取得しようとしているため、NaNを返していると思いますが、以下のコードに基づいて数値を負にするべきではありません.ポジティブ)。ただし、返される数値は負です。複数の変数を使用して re * re と im * im を取得し、2 つの結果を加算するという非効率的な方法を試してみましたが、結果も負です。Math.Abs​​も駄目でした。FFT クラスの作成者 (上記のリンクを参照) に連絡し、次の返信を待っています。以下のコードの一部は、以前に行った AS3 バージョンから取得しました。ここで回答を得る前にクラスの作成者から回答を得た場合は、それを投稿します。どんな洞察も最も役に立ちます。これまで私を助けてくれたすべての人に感謝します. 私は C# を使用する AS3 プログラマーです (C# の方がはるかに優れているため)。私はユニティを使用しています。

 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

…</p>

// 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

ありがとうございました!!

4

3 に答える 3

1

を定義MIN_VALUEしましたSystem.Double.MinValue。これは、可能な最小の倍精度数です。または正の無限大以外のものを追加するSystem.Double.MaxValueと、負の結果になります。負の数の対数を取ると、が返されますNaN

私はあなたMIN_VALUEが最小の正の数になりたいと思っていると思います。C#では、System.Double.Epsilonそのために使用します。(私は知っています...それはそれと呼ばれるべきではありません...)

のような他の小さな値1e-100も同様に機能します。

于 2012-01-03T19:34:39.810 に答える
0

for (int i = 0; i < tempRe.Length; i++) tempRe[i] = m_win[i];

乗算では、それが必要でない限り、常にゼロになります。

于 2012-01-02T06:47:30.600 に答える
0

答えが見つかりました!したがって、C++、AS3、および他のいくつかの言語とは異なり、C# には負の最小 double 値があることがわかります。

System.Double.MIN_VALUE = -1.7976931348623157E+308;

負の平方根を取得すると NaN エラーが発生します。詳細については、( http://www.codeproject.com/KB/cs/numprogrammingcs.aspx ) を参照してください。現在、正確なdBの読み取り値を取得するのに問題がありますが、調査して見つけられるものを確認しています.

于 2012-01-03T21:05:52.543 に答える