0

おそらく単純なものが欠けていますが、これを機能させることができないようです。[65536] の固定配列サイズを使用した単純なオーディオ遅延がありますが、完全に機能します。

作業コードは次のとおりです。

    float b[65536]; // initialisation
    int p, r0, r1;
    float len, d, feedback; // d = decimal part of length
    int leni; // integer value of length

    if (len > 65534) len = 65534; 
    else if (len < 1) len = 1;
    leni = (int) len; // float to INT conversions are cpu intensive. 

    d = len - leni;
    r0 = p - leni; // loop
    r1 = r0 - 1;
    if (r0 < 0) r0 += 65536;
    if (r1 < 0) r1 += 65536;

 output = b[r0] + d * (b[r1] - b[r0]);
    b[p] = input + output * feedback;
    p++;
    if (p > 65535) p = 0;

ここで、動作しないコードを示します。

    float b[16384]; // initialisation
    int p, r0, r1;
    float len, d, feedback; // d = decimal part of length
    int leni; // integer value of length

    if (len > 16382) len = 16382;
    else if (len < 1) len = 1;
    leni = (int) len; // float to INT conversions are cpu intensive. 

    d = len - leni;
    r0 = p - leni; // loop
    r1 = r0 - 1;
    if (r0 < 0) r0 += 16384;
    if (r1 < 0) r1 += 16384;

 output = b[r0] + d * (b[r1] - b[r0]);
    b[p] = input + output * feedback;
    p++;
    if (p > 16383) p = 0;

何をすべきかわかりません。ラップが間違っていますか?それとも 65536 は特別な int ケースですか?

アンドリューに感謝します

4

1 に答える 1

0

コードを理解するのは少し難しいです。たとえば、浮動小数点数を整数に変更する必要がある理由、len などの変数の初期値、またはループが発生する場所がわかりません。私はそれが何の言語なのかわからない (python?) かもしれませんし、その言語を知っている人にはそれらのことは明白かもしれません。

ただし、65536 で機能するという事実は、おそらく 65536 が 2 の累乗であることと関係があると推測できます。また、そのプロパティは、他のバグを回避して機能します。

私があなたのコードを修正しようとするつもりはありません。代わりに、こちらの回答を参照してください。遅延とエコーの書き方が説明されています。これは、移植が容易な C ライクな疑似コードであり、非常に数行のコードです。

Objective-Cを使用してオーディオファイルにエコー効果を追加する方法

于 2012-10-19T15:40:42.877 に答える