我正在研究Novocaine的DSP类(obj-c ++),但我的滤镜似乎只会对信号造成噪音/失真。
我在这里发布了我的完整代码和系数:https://gist.github.com/2702844 但它基本归结为:
// Deinterleaving...
// DSP'ing one channel:
NVDSP *handleDSP = [[NVDSP alloc] init];
[handleDSP setSamplingRate:audioManager.samplingRate];
float cornerFrequency = 6000.0f;
float Q = 0.5f;
[handleDSP setHPF:cornerFrequency Q:Q];
[handleDSP applyFilter:audioData length:numFrames];
// DSP other channel in the same way
// Interleaving and sending to audio output (Novocaine block)
请参阅要点以获取完整的代码/上下文。
系数:
2012-05-15 17:54:18.858 nvdsp[700:16703] b0: 0.472029
2012-05-15 17:54:18.859 nvdsp[700:16703] b1: -0.944059
2012-05-15 17:54:18.860 nvdsp[700:16703] b2: 0.472029
2012-05-15 17:54:18.861 nvdsp[700:16703] a1: -0.748175
2012-05-15 17:54:18.861 nvdsp[700:16703] a2: 0.139942
(全部除以a0
)
由于我假设系数大约为:{ b0/a0, b1/a0, b2/a0, a1/a0, a2/a0 }
(参见:IIR coefficients for peaking EQ, how to pass them to vDSP_deq22?)
导致失真/噪音的原因(滤波器不起作用)?
答案 0 :(得分:10)
更新:我建议每个人都使用我在github上发布的DSP类:https://github.com/bartolsthoorn/NVDSP这可能会为你节省很多工作。
搞定了,哇!日本人万岁:http://objective-audio.jp/2008/02/biquad-filter.html
applyFilter方法必须是:
- (void) applyFilter: (float *)data frames:(NSUInteger)frames {
/*
The first two samples of data being passed to vDSP_deq22 have to be initialized from the previous call. So, you'd want to hold onto a float buffer and feed the tailing two samples after a vDSP_deq22 call back to the front of that array for the next time you call. (Alex Wiltschko)
*/
// Thanks a lot to: http://objective-audio.jp/2008/02/biquad-filter.html
// Provide buffer for processing
float *tInputBuffer = (float*) malloc((frames + 2) * sizeof(float));
float *tOutputBuffer = (float*) malloc((frames + 2) * sizeof(float));
// Copy the data
memcpy(tInputBuffer, gInputKeepBuffer, 2 * sizeof(float));
memcpy(tOutputBuffer, gOutputKeepBuffer, 2 * sizeof(float));
memcpy(&(tInputBuffer[2]), data, frames * sizeof(float));
// Do the processing
vDSP_deq22(tInputBuffer, 1, coefficients, tOutputBuffer, 1, frames);
// Copy the data
memcpy(data, tOutputBuffer, frames * sizeof(float));
memcpy(gInputKeepBuffer, &(tInputBuffer[frames]), 2 * sizeof(float));
memcpy(gOutputKeepBuffer, &(tOutputBuffer[frames]), 2 * sizeof(float));
free(tInputBuffer);
free(tOutputBuffer);
}
答案 1 :(得分:0)
使用以下内容复制数据:
memcpy(data, tOutputBuffer+2, frames * sizeof(float));
它会起作用