2016-12-25 3 views
0

안녕하세요 보드에서 녹화하려고하는데 4 초가 성공적으로 녹화되었습니다. 문제는 내가 더 많은 시간을 기록하려고 할 때 메모리가 충분하지 않다는 오류가 발생했습니다. 제 목표는 5 분짜리 파일을 녹음하는 것입니다. 지금까지는 샘플 인 snIn [256]이라는 버퍼를 만들었습니다. [16K * 4sec]의 큰 버퍼로 보내면 꽉 차면 wav 파일을 만듭니다. RAM이 부족한 상태에서 wav 파일을 생성하십시오.

#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); 
} 

가 다시 다시 직접 (대신 my_buffer를 사용)를 snIn [256] 버퍼와 wavefile의 "데이터 영역"을 채우기 위해, 가능한 해결책을 생각하고 끝에 wavfile를 닫는다. 저와 다른 해결책에 대해 어떻게 생각하는지 알려주세요.

+0

에 오신 것을 환영합니다 :

이 여기에 전체 코드입니다 (내 컴퓨터에서 실행하는 임베디드 특정 코드를 제거). [The Tour] (http://stackoverflow.com/tour)를 읽으신 후 [Help Center] (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이라고하지를 따라야합니다. BTW, 반환 값을 확인하는 습관을 만들어야합니다. 나는. res_buf가 이전에 할당

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 = 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; 
}