尝试使用portaudio记录一些数据,然后使用算法过滤器更改录制的语音,然后播放。我已经验证了很多(来自示例),但我对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
当录制的信号试图通过这些过滤器时,我得到以下错误:
*** 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)
我真的不确定这里发生了什么。有什么想法吗? 在脚本终止时从脚本末尾调用Free:
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 :(得分:2)
问题是data.recordedSamples现在(在free()
时)指向堆栈上分配的结构,而不是堆上的结构!
因为你有这个指示:
data.recordedSamples = filteredArray;
在
if( data.recordedSamples )
是没用的,因为地址id有效但不一致:它永远不会与malloc()
一起分配,它不在堆上,而是在堆栈上!
在您致电free()
时,该地址很可能指向另一个功能的堆栈。
如果需要,将过滤后的数据复制回原始recordedSamples
,只是不要重新分配该指针。
编辑:
使用它:
for(i = 0; i<numSamples; i++) {
data.recordedSamples[i] = filteredArray[i];
}
答案 1 :(得分:0)
看起来你正在尝试释放堆栈变量。您必须致电free
的唯一时间是之前您曾致电malloc
(或其中一位朋友,如calloc
)或您正在致电的图书馆功能的文档说你需要释放它返回的指针。
顺便提一下,每次释放指针时,最好立即将其设置为NULL。
堆栈变量一旦超出范围就会消失。 This可能会帮助您更好地理解。