2012-12-14 28 views
5

Đang cố gắng sử dụng portaudio để ghi lại một số dữ liệu, sau đó sử dụng bộ lọc thuật toán để thay đổi giọng nói đã ghi và sau đó phát lại. Tôi đã xác minh rất nhiều của nó (đến từ ví dụ) nhưng tôi khá mới với C và tôi nghĩ rằng trong việc thực hiện bộ lọc của tôi, tôi đã làm điều gì đó ngớ ngẩn.Thực hiện các bộ lọc thông cao và thấp đơn giản trong C

#if LOW_PASS 
{ 
    float RC = 1.0/(CUTOFF*2*3.14); 
    float dt = 1.0/SAMPLE_RATE; 
    float alpha = dt/(RC+dt); 
    float filteredArray[numSamples]; 
    filteredArray[0] = data.recordedSamples[0]; 
    for(i=1; i<numSamples; i++){ 
     filteredArray[i] = filteredArray[i-1] + (alpha*(data.recordedSamples[i] - filteredArray[i-1])); 
    } 
    data.recordedSamples = filteredArray; 
} 
#endif 
#if HIGH_PASS 
{ 
    float RC = 1.0/(CUTOFF*2*3.14); 
    float dt = 1.0/SAMPLE_RATE; 
    float alpha = RC/(RC + dt); 
    float filteredArray[numSamples]; 
    filteredArray[0] = data.recordedSamples[0]; 
    for (i = 1; i<numSamples; i++){ 
     filteredArray[i] = alpha * (filteredArray[i-1] + data.recordedSamples[i] - data.recordedSamples[i-1]); 
    } 
    data.recordedSamples = filteredArray; 
} 
#endif 

Khi tín hiệu ghi nhận cố gắng đi qua các bộ lọc này tôi nhận được một cái gì đó được lỗi sau:

*** glibc detected *** ./paex_record: free(): invalid pointer: 0xbfd68600 *** 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb75e2ee2] 
./paex_record[0x8048fe5] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75864d3] 
./paex_record[0x80487f1] 
======= Memory map: ======== 
08048000-0804a000 r-xp 00000000 08:05 2363767 /home/svictoroff/Documents/CompArch/portaudio/examples/paex_record 
... 
bfd68000-bff1a000 rw-p 00000000 00:00 0   [stack] 
Aborted (core dumped) 

Tôi chỉ thực sự không chắc chắn những gì đang xảy ra ở đây. Có suy nghĩ gì không? miễn phí được gọi là từ ngày kết thúc của kịch bản ở chấm dứt ở đây:

Pa_Terminate(); 
    if(data.recordedSamples)  /* Sure it is NULL or valid. */ 
     free(data.recordedSamples); 
    if(err != paNoError) 
    { 
     fprintf(stderr, "An error occured while using the portaudio stream\n"); 
     fprintf(stderr, "Error number: %d\n", err); 
     fprintf(stderr, "Error message: %s\n", Pa_GetErrorText(err)); 
     err = 1;   /* Always return 0 or 1, but no other return codes. */ 
    } 
    return err; 
+0

Kích thước của * được ghi là gì * mẫu *? – user1284631

+2

Lỗi xuất hiện bên trong cuộc gọi đến 'miễn phí'. Bạn có thể hiển thị mã gọi 'miễn phí' không? – simonc

+0

RecordedSamples là khoảng 200k –

Trả lời

1

Vấn đề là data.recordedSamples bây giờ (tại thời điểm free()) chỉ hướng tới một cấu trúc cấp phát trên stack, không phải trên đống!

Vì bạn đã hướng dẫn này:

data.recordedSamples = filteredArray; 

Các

if(data.recordedSamples) 

là không sử dụng, kể từ khi địa chỉ id hợp lệ, nhưng không phù hợp: nó không bao giờ được phân bổ với malloc() và nó không phải là trên đống, nhưng trên ngăn xếp!

Hiện tại khi bạn đang gọi free(), địa chỉ đó cũng có thể trỏ tới ngăn xếp của một hàm khác.

Sao chép dữ liệu đã lọc của bạn trở lại trên recordedSamples gốc nếu bạn muốn, chỉ cần không gán lại con trỏ đó.

chỉnh sửa:

sử dụng này:

for(i = 0; i<numSamples; i++) { 
    data.recordedSamples[i] = filteredArray[i]; 
} 
+0

Cảm ơn bạn đã trả lời và xin lỗi nếu tôi dày đặc, nhưng chính xác thì tôi sẽ làm như thế nào? –

+0

@SlaterTyranus: để thay thế dữ liệu, sử dụng vòng lặp for() và phao bản sao bằng phao; hoặc sử dụng memcpy() (bạn cần phải bao gồm ); cho (i = 0; i user1284631

+0

@SlaterTyranus: xem câu trả lời cập nhật của tôi – user1284631

0

Dường như bạn đang cố gắng để giải phóng một biến stack. Lần duy nhất bạn phải gọi free là khi trước đây bạn đã gọi malloc (hoặc một trong những người bạn của nó như calloc) hoặc khi tài liệu về chức năng thư viện bạn đang gọi cho biết bạn cần giải phóng con trỏ mà nó trả về.

Ngẫu nhiên, bất cứ khi nào bạn làm miễn phí một con trỏ, thực hành tốt là đặt nó thành NULL ngay sau đó.

Biến ngăn xếp biến mất ngay khi chúng nằm ngoài phạm vi. This có thể giúp bạn hiểu rõ hơn.

Các vấn đề liên quan