我可能錯過了一些簡單的事情 - 但我無法想象得到這個工作。我有一個簡單的音頻延遲 - 一個固定的數組大小[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 安德魯
而不是Python - C++實際。浮點數被轉換爲一個整數以獲得一個合理的延遲長度 - 然後被用來內插延遲線 - 上面的代碼用於線性插值btw。對不起,如果代碼有點不可讀 - 代碼的「工作版本」不是我寫的 - 它實際上來自一個教程 - 但他們沒有說明如何改變最大數組長度。我嘗試了2的其他權力 - 沒有工作。使用此代碼編碼一個相當大的混響。多麼痛苦 - 我想我需要以不同的方式包裝變量。感謝您試圖幫助! –
這是C++?那麼,一些代碼丟失了。例如,len如何初始化?什麼是輸入?什麼是類功能,什麼是本地功能等等。另外,「炸彈」的含義是什麼?噪聲?崩潰?如果它崩潰,如何/在哪裏?無論哪種方式,你應該確定跟蹤,以確保r0和r1始終處於綁定狀態,因爲它們對我來說看起來非常可疑。 –
對不起,我忽略了所有課程的要求。該代碼適用於另一個SDK(Steinberg VST)中的SDK(synthedit) - 因此,如果我發佈了所有內容 - 這將是至少兩個分頁器。緩衝區b [],寫入指針'p'和兩個讀取指針'r0'和'r1'在類別decleration中。我認爲你對r0和r1的權利 - 另一個實現 - 這看起來很像我的 - 只是包裝其中一個指針。將調查。炸彈爆炸後 - 它不會崩潰 - 它會在陣列的一個週期後在奈奎斯特地區引起嚴重的噪音。仍然很奇怪,65536完美的作品 - 但沒有別的。 –