2012-10-18 90 views
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情況?

感謝advace 安德魯

回答

0

你的代碼是一個有點難以遵循 - 例如,我不清楚爲什麼你還需要浮點數改變爲整數,什麼樣的變量,如初始值len是循環發生的地方。我甚至不知道它是什麼語言(python?),也許這些事情對於懂語言的人是顯而易見的,在這種情況下,我爲我的無知道歉。

但是,我可以推測,它對65536有效的事實可能與65536是兩個冪有關,不知何故該屬性可以解決其他任何錯誤。

我不會嘗試修復您的代碼,因爲正如我所說的,我無法遵循它 - 再次,對不起。相反,在這裏看到我的答案,它告訴你如何寫延遲和回聲。這是在C類僞代碼,應該很容易端口,它的代碼非常幾行:

how to add echo effect on audio file using objective-c

+0

而不是Python - C++實際。浮點數被轉換爲一個整數以獲得一個合理的延遲長度 - 然後被用來內插延遲線 - 上面的代碼用於線性插值btw。對不起,如果代碼有點不可讀 - 代碼的「工作版本」不是我寫的 - 它實際上來自一個教程 - 但他們沒有說明如何改變最大數組長度。我嘗試了2的其他權力 - 沒有工作。使用此代碼編碼一個相當大的混響。多麼痛苦 - 我想我需要以不同的方式包裝變量。感謝您試圖幫助! –

+1

這是C++?那麼,一些代碼丟失了。例如,len如何初始化?什麼是輸入?什麼是類功能,什麼是本地功能等等。另外,「炸彈」的含義是什麼?噪聲?崩潰?如果它崩潰,如何/在哪裏?無論哪種方式,你應該確定跟蹤,以確保r0和r1始終處於綁定狀態,因爲它們對我來說看起來非常可疑。 –

+0

對不起,我忽略了所有課程的要求。該代碼適用於另一個SDK(Steinberg VST)中的SDK(synthedit) - 因此,如果我發佈了所有內容 - 這將是至少兩個分頁器。緩衝區b [],寫入指針'p'和兩個讀取指針'r0'和'r1'在類別decleration中。我認爲你對r0和r1的權利 - 另一個實現 - 這看起來很像我的 - 只是包裝其中一個指針。將調查。炸彈爆炸後 - 它不會崩潰 - 它會在陣列的一個週期後在奈奎斯特地區引起嚴重的噪音。仍然很奇怪,65536完美的作品 - 但沒有別的。 –