2016-12-25 20 views
0

嗨,我正在嘗試從電路板進行記錄,並且我已成功記錄4秒。 問題是當我嘗試記錄更多時間時,我得到一個錯誤,告訴我沒有足夠的內存。我的目標是記錄一個5分鐘的文件。 直到現在我已經創建了一個名爲snIn [256]的緩衝區,其中是樣本。 我把它發送到[16K * 4sec]的大緩衝區,當它已滿時,我創建wav文件。創建wav文件,而不會用完ram

#define WAVFILE_SAMPLES_PER_SECOND 16000 
#define REC_TIME 4 

const int NUM_SAMPLES = WAVFILE_SAMPLES_PER_SECOND * REC_TIME; 
Array<int16_t> my_buffer(NUM_SAMPLES); 

int rec(const char *filename, Array<int16_t> my_buffer) { 

    WavFileResult result; 
    wavfile_info_t info; 
    wavfile_data_t data; 

    // code for filling the info of the wav file: sample rate, byte rate , channels etc.. 

    WAVFILE *wf = wavfile_open(filename, WavFileModeWrite, &result); 
    WAVFILE_DATA_NUM_CHANNELS(&data) = 1; rp = 0; 
    wavfile_write_info(wf, &info); 


    while (rp < NUM_SAMPLES) { 
     WAVFILE_DATA_CHANNEL_DATA(&data, 0) = my_buffer[rp];//fill the data of the wav file  
     wavfile_write_data(wf, &data); 
     rp += 1; 
    } 
    wavfile_close(wf); 
    return 0; 
} 

void fill_buffer (Array<int16_t> snIn , int &j) { 

     for (int i=0 ; i < SEG_SIZE ; i++) { 
      my_buffer[j] = snIn[i]; //puts all the 256 values in my_buffer 
      j++; } 

      if (sent_array == ((int)NUM_SAMPLES/SEG_SIZE)){ // if my_buffer is full, go to rec and make a wav file 
       rec (target_filename , my_buffer); } 
} 

int main() 
{ 
     Array<int16_t> snIn(256); 

      for (int n=0; n<256 ; n++) 
      { //snIn gets new 256 values } 
     sent_array ++; 
     fill_buffer (snIn , j); 
} 

我連連想過一個可能的解決方案,以直接填寫與SnIn系[256]緩衝液(而不是使用my_buffer)的wavefile的「數據區」,並在端部關閉wavfile。 請讓我知道您對此和其他解決方案的看法。

+0

歡迎堆棧溢出。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

+0

解決這些問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

問題是,我無法找到我使用的編譯器中的任何調試器。就像我寫的,我編程mbed.org在線編譯器,這是非常簡單的... – gab55

回答

0

您的字節速率計算不正確。您需要按照公式

num_channels * sample_rate * (bits_per_sample/8) 

而且你已經不叫wavfile_write_info寫的元數據。順便說一句,你應該讓自己習慣於檢查返回值。即像

result = wavfile_write_data(wf, &data); 
if (result != WavFileResultOK) { 
    wavfile_result_string(result, res_buf, RES_STR_SIZE); 
    printf("%s", res_buf); 
    return result; 
} 

其中res_buf之前分配。你應該把它歸因於一個函數。

下面是完整的代碼(我扯下了嵌入特定代碼在我的計算機上運行它):

rp = 0; 
    WAVFILE_DATA_NUM_CHANNELS(&data) = 1; 
    while (rp<100) { 
     WAVFILE_DATA_CHANNEL_DATA(&data, 0) = buffer[rp]; 
     result = wavfile_write_data(wf, &data); 
     if (result != WavFileResultOK) { 
      wavfile_result_string(result, res_buf, RES_STR_SIZE); 
      printf("%s", res_buf); 
      return result; 
     } 
     rp += 1; 
    } 
    result = wavfile_close(wf); 
    if (result != WavFileResultOK) { 
     wavfile_result_string(result, res_buf, RES_STR_SIZE); 
     printf("%s", res_buf); 
     return result; 
    } 
    printf("Success rec !\r\n"); 
    return 0; 

} 

int main(void) 
{ 
    static const char *target_filename = "rectest.wav"; 
    for (int t=0 ; t<100 ; t++){ 
     buffer[t]= sin(2*3.14*t); 
    } 

    int res = rec(target_filename); 
    if (res != 0) { 
     return 1; 
    } 

    printf("success program!\r\n"); 
    return 0; 
}