2011-05-19 53 views
0

有人可以告訴我這裏有什麼問題。延遲有一個帶指針* p的緩衝區(del),但每個採樣都輸出零(0)。延時輸出0's

(固定延遲3秒)

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; 
} 
+0

其實我相信你正在返回'del [* p]'。 'del'和'p'都不在我們的範圍之內,所以您可能需要發佈更多的代碼/解釋您要實現的目標。 – cnicutar 2011-05-19 01:53:58

+0

我正試圖在* sig上創建延遲音頻效果。是的,兩者都是外部分配的。 – Cocell 2011-05-19 01:59:58

+0

很酷,但這並沒有什麼幫助。你能在循環之前打印del [* p]嗎? – cnicutar 2011-05-19 02:01:47

回答

1

你的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 

注意,你真的應該直接傳遞dtdelay()功能,而不是從srdtime計算它 - 作爲就delay()函數而言,這是樣本數量的延遲(因此延遲線陣列的假定大小)是重要的。無論如何,您必須在調用者中計算出該值,才能適當調整del[]陣列的大小。

+0

謝謝大家。 @caf好的,我會嘗試直接傳遞dt。我認爲這是我怎麼稱呼它導致問題。我只是想確保delay()函數正常工作,謝謝你。 – Cocell 2011-05-19 02:56:18

0

你返回*sig始終。這總是將成爲sig陣列的第一個元素。

out = del[*p]; 
del[*p] = sig[0]; // doesn't affect sig 
sig[0] = out; 

這是唯一的一次sig[0]受到影響:因爲你通過循環(當i=0)你正在做的是在第一時間sig[0]將等於del[*p]。然後當您返回*sig時,您將返回sig[0]

所以我期望這個功能將永遠返回什麼del[*p]是。