1

実行ごとに異なる結果が得られる単体テスト コードに問題があります。libsoxr (0.1.3)までさかのぼって追跡したところ、ディザリング オプションが原因であることがわかりました。

つまり、次のようsoxr_create()に呼び出された場合:

 soxr_io_spec_t soxIoSpec = soxr_io_spec(SOXR_INT16_I, SOXR_INT16_I);
 sxIoSpec.flags |= SOXR_NO_DITHER;

soxr_process() の出力は確定的です。ただし、SOXR_NO_DITHERフラグを追加しないと、出力は実行ごとにわずかに異なります。

ここで私を驚かせる図書館についての別のことがあります。 soxr_oneshot()この問題 (非決定性) には悩まされません。

ここで何が起こっているのですか?

4

1 に答える 1

0

コードを調べるとsoxr.c、ディザで疑似乱数ジェネレーターが使用されていることがわかりますが、シードは時間から生成された実装の詳細です。

 p->seed = (unsigned long)time(0) ^ (unsigned long)(size_t)p;

ライブラリによって公開されているようには見えないため、テストを実行するたびに同じ結果を得るために特定のシードを設定することはできません。

これを容易にするために、以下のような API のマイナーな拡張を提案しましたが、ライブラリの知識が豊富な人はより良い方法を提案できるかもしれません。

加えSoxr.hて:

typedef unsigned long soxr_seed_t;

// set or retrieve the random seed used by the dithering function
void soxr_setseed(soxr_t resampler, soxr_seed_t new_seed);
soxr_seed_t soxr_getseed(soxr_t* resampler);

加えSoxr.cて:

void soxr_setseed(soxr_t resampler, soxr_seed_t new_seed)
{  
    resampler->seed = new_seed;
}

soxr_seed_t soxr_getseed(soxr_t resampler)
{  
    return resampler->seed;
}

ここでまだ私を驚かせているライブラリーの 1 つのことは soxr_oneshot()、この問題 (非決定性) に悩まされていないことです。SOXR_NO_DITHERへの内部呼び出しによってシードがどのように固定または設定されるのかわかりませんsoxr_create()

ライブラリの知識が豊富な人が説明できるかもしれない何かをここで明らかに見逃しています。

于 2020-09-14T23:38:42.957 に答える