Đ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;
Kích thước của * được ghi là gì * mẫu *? – user1284631
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
RecordedSamples là khoảng 200k –