在C中实现简单的高通和低通滤波器

尝试使用portaudio记录一些数据,然后使用算法filter更改录制的语音,然后播放。 我已经validation了很多(来自示例),但我对C很新,我认为在我的filter实现中我做了一些愚蠢的事情。

#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 

当录制的信号试图通过这些filter时,我得到以下错误:

 *** 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; 

问题是data.recordedSamples现在(在free() )指向堆栈上分配的结构,而不是堆上!

既然你有这个指示:

 data.recordedSamples = filteredArray; 

 if( data.recordedSamples ) 

是没用的,因为地址id有效,但不一致:它永远不会分配malloc()而且它不在堆上,而是在堆栈上!

在你调用free() ,该地址很可能指向另一个函数的堆栈。

如果需要,将过滤后的数据复制回原始的recordedSamples ,只是不要重新分配该指针。

编辑:

用这个:

 for(i = 0; i 

看起来你正在尝试释放堆栈变量。 你必须free调用的唯一一次是当你以前调用malloc (或其中一个像calloc这样的朋友)或者当你调用的库函数的文档说你需要释放它返回的指针时。

顺便提一下,每当你释放一个指针时,一个好的做法是立即将它设置为NULL。

堆栈变量一旦超出范围就会消失。 这可能有助于您更好地理解。