你的delay()
函數似乎工作正常,所以錯誤必須在你如何調用它。請看下面的例子程序:
#include <stdio.h>
float delay(float *sig, float dtime, float *del, int *p, int vecsize, float sr)
{
int dt;
float out;
dt = (int) (dtime*sr);// dtime = 3secs, sr=44100.0
for(int i=0; i<vecsize; i++){
out = del[*p];
del[*p] = sig[i];
sig[i] = out;
*p = (*p != dt-1 ? *p+1 : 0);
}
return *sig;
}
#define DTIME 3
#define SAMPLERATE 44100
#define VECSIZE (10 * SAMPLERATE)
int main()
{
float del[DTIME * SAMPLERATE] = { 0.0 };
int del_p = 0;
float sig[VECSIZE] = { -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
int i, j;
delay(sig, DTIME, del, &del_p, VECSIZE, SAMPLERATE);
for (i = 0; i < VECSIZE && sig[i] == 0.0; i++)
;
for (j = i; j < VECSIZE && j < i + 10; j++)
printf("sig[%d] = %f\n", j, sig[j]);
return 0;
}
的output produced不出所料:
sig[132300] = -5.000000
sig[132301] = -4.000000
sig[132302] = -3.000000
sig[132303] = -2.000000
sig[132304] = -1.000000
sig[132305] = 0.000000
sig[132306] = 1.000000
sig[132307] = 2.000000
sig[132308] = 3.000000
sig[132309] = 4.000000
注意,你真的應該直接傳遞dt
到delay()
功能,而不是從sr
和dtime
計算它 - 作爲就delay()
函數而言,這是樣本數量的延遲(因此延遲線陣列的假定大小)是重要的。無論如何,您必須在調用者中計算出該值,才能適當調整del[]
陣列的大小。
來源
2011-05-19 02:25:22
caf
其實我相信你正在返回'del [* p]'。 'del'和'p'都不在我們的範圍之內,所以您可能需要發佈更多的代碼/解釋您要實現的目標。 – cnicutar 2011-05-19 01:53:58
我正試圖在* sig上創建延遲音頻效果。是的,兩者都是外部分配的。 – Cocell 2011-05-19 01:59:58
很酷,但這並沒有什麼幫助。你能在循環之前打印del [* p]嗎? – cnicutar 2011-05-19 02:01:47