2013-08-21 41 views
-1

我試着去數據的磁盤陣列上執行的功能,但我不是很清楚如何去了解它,如何在C數據的磁盤陣列上執行的功能

這裏是我的代碼

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

#define BUFFER_LEN 10 
#define SAMPLE_RATE 48000 
#define MAX_DELAY 0.25 


int buffer_in[]= {0,1,2,3,4,5,6,7,8,9}; 
int buffer_out[10]; 

short int flanger(float , float , int , short int); 

int main(void) 
{ 
int j,k,l; 

    for (j = 0; j <=BUFFER_LEN; j++){ 
     buffer_out[j] = flanger(buffer_in[j]); //this is causing the error 
     printf("buffer out value = %d",buffer_out[j]); 
     } 

return 0; 
} 
// Flanger function 

short int flanger(float range, float delay, int rate, short int inData){ 

    float flangerDelay; /* stores current delay required for flange effect */ 
    static int i=0;  /* keeps track of time for creating sweep waveform */ 
    static float sweepValue=0; /* keeps track of current sweep delay in ms */ 
    static int sweepFlag=1; /* keeps track of waveform movement   */ 
    static int writePtr=0;  /* pointer to newest audio sample in buffer */ 
    static int readPtr=0;  /* pointer to oldest audio sample in buffer */ 
    float tmp; /* tmp value to see if dly will point to a position in buff */ 
    float delayArray[50]; 

    /* convert rate from Hz to Hz according to current sample rate */ 
    /* NOTE: If it does not divise exact, take the integer part only! */ 

    /* is it time to change waveform? if not, increment counter */ 
    if (i >= rate) { 
    /* has the maximum possible delay for sweep been reached? */ 
    if (sweepValue >= range) 
     sweepFlag = 0; /* start the \ of triangular waveform */ 
    else if (sweepValue <= 0) 
     sweepFlag = 1; /* start the/of triangular waveform */ 

    /* Is the waveform rising or falling? */ 
    if (sweepFlag==1) 
     sweepValue += 0.001; /* increase sweep delay by .001 ms */ 
    else 
     sweepValue -= 0.001; /* decrease sweep delay by .001 ms */ 

    /* reset i, to start count before waveform changes shape again */ 
    i=0; 
    } 
    else i++; 

    /* Calculate the total current to delay (in ms, not samples!) */ 
    flangerDelay = sweepValue + delay; 

    /* calculate delay in samples rather than in time */ 
    tmp = flangerDelay * 22.4f; //(float)(SAMPLE_RATE/1000); 

    //printf("flangerDelay: %f samples: %d\n", flangerDelay, tmp); 

    /* Calculate position of the read & write pointers */ 
    if (writePtr < (int)tmp) 
    readPtr = (((SAMPLE_RATE/1000)*MAX_DELAY) - ((int)tmp - writePtr)); 
    else 
    readPtr = writePtr - (int)tmp; 

    /* has the write pointer reached end of delay buffer? */ 
    if (writePtr > ((SAMPLE_RATE/1000)*MAX_DELAY)) 
    writePtr=0; 
    else 
    writePtr++; 

    /* now add current audio sample to array and return oldest sample */ 
    delayArray[writePtr] = inData; 

    /* is tmp a whole value? i.e. will it point to a sample in the buffer? */ 
    if (tmp > (int)tmp){ 
    /* not a whole number! therefore, interpolation is required! */ 
    if (readPtr == ((SAMPLE_RATE/1000) * MAX_DELAY)) 
     return((delayArray[readPtr] + delayArray[0])/2); 
    else 
     return((delayArray[readPtr] + delayArray[readPtr+1])/2); 
    } 
    else { 
    /* is a whole number! therefore, can take straight from buffer! */ 
    return delayArray[readPtr]; 
    } 

} 

我得到的錯誤,在這部分

for (j = 0; j <=BUFFER_LEN; j++){ 
     buffer_out[j] = flanger(buffer_in[j]); //this is causing the error 
     printf("buffer out value = %d",buffer_out[j]); 
     } 

基本上我想在buffer_in對數據執行的功能,並把這一結果爲buffer_out 有我讓它設置錯了? 非常感謝您的幫助!

+0

*「這是導致錯誤」* ...和錯誤是什麼***確切***? – abelenky

+0

您需要將範圍,延遲和速率傳遞給調用以及數組條目。它根本沒有任何關係。看到我的答案(第二)。 – Jiminion

回答

6

您聲明flanger函數有四個參數,但在調用它時只傳遞一個參數。您必須使用正確數量的參數調用它,或者更改函數以僅使用一個參數。

1

如果你想傳遞一個數組鑲邊,你必須聲明它接受一個數組:

short int flanger(int aBuffer[]){ 

相反,你宣佈它採取4個不同的參數。

0

你需要這樣的東西。但是很難指定更進一步的代碼,因爲你的代碼距離你所期望的太遠。

void flanger(int buf_out[], int buf_in[], float range, float delay, int rate, short int inData) 

也許你只需要:

buffer_out[j] = flanger(range_val, delay_val, rate_val,buffer_in[j]) 
0

可能使用結構數組會爲您提供更好?喜歡的東西:(應該建立如在ANSI C)

#include <windows.h> 
#include <ansi_c.h> 

    typedef struct { 
     float range; 
     float delay; 
     int rate; 
     short inData; 
    } PARAMS; 

    PARAMS params[10], *pParams; 

    void flanger(PARAMS *p); 

    void main(void) 
    { 
     int i; 
     pParams = &params[0]; 

     for(i=0;i<10;i++) 
     { 
      pParams[i].range = 45.0 + (float)i; 
      pParams[i].delay = .003 + (float)i; 
      pParams[i].rate = 23 + i; 
      pParams[i].inData = 1 + i; 
     } 


     flanger(pParams); 

    } 

    void flanger(PARAMS *p) 
    { 
     //do something with params  
    } 

[編輯顯示兩個結構*參數]
這應該建立在ANSI C編譯器運行,只需複製和粘貼:

#include <windows.h> 
#include <ansi_c.h> 

typedef struct { 
    float range; 
    float delay; 
    int rate; 
    short inData; 
} PARAMS; 

#define DATESIZE 10 

void flanger(PARAMS *o, PARAMS *i); 

void main(void) 
{ 
    int i; 
    PARAMS out[DATESIZE], *pOut, in[DATESIZE], *pIn; 

    pOut = &out[0]; 
    pIn = &in[0]; 


    printf("Out Data\n"); 
    printf("Range Delay Rate InData\n"); 
    for(i=0;i<DATESIZE;i++) 
    { 
     pOut[i].range = 45.0 + (float)i; 
     pOut[i].delay = .003 + (float)i; 
     pOut[i].rate = 23 + i; 
     pOut[i].inData = 1 + i; 
     printf("%4.2f %5.3f %d %d\n", 
       pOut[i].range, 
       pOut[i].delay, 
       pOut[i].rate, 
       pOut[i].inData); 
    } 


    flanger(pOut, pIn); 

    printf("In Data\n"); 
    printf("Range Delay Rate InData\n"); 
    for(i=0;i<DATESIZE;i++) 
    { 
     printf("%4.2f %5.3f %d %d\n", 
       pIn[i].range, 
       pIn[i].delay, 
       pIn[i].rate, 
       pIn[i].inData); 
    } 
    getchar(); 
} 

void flanger(PARAMS *out, PARAMS *in) 
{ 
    int i; 
    //process "out", pass back "in" 
    for(i=0;i<DATESIZE;i++) 
    { 
     in[i].range = pow(out[i].range, 2.0); 
     in[i].delay = pow(out[i].delay, 2.0); 
     in[i].rate = pow(out[i].rate, 2.0); 
     in[i].inData = pow(out[i].inData, 2.0); 
    } 


} 
+0

謝謝,但結構現在waaaaay在我的頭上! – user2459764

+0

好的 - 我曾經在那裏,沒問題。但是如果你改變了主意,我留下的示例代碼是完整的,並將在ANSI C編譯器中生成和運行。您可以使用斷點查看循環中的值。使用常規(非結構)數組需要所有元素具有相同類型,結構允許多種類型。 :) – ryyker

+0

謝謝,我明白你的意思。是否有可能通過上述代碼傳遞一組樣本並獲得一組有效樣本作爲結果? – user2459764