首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用vDSP_deq22进行滤波后的噪声/失真(双二阶IIR滤波器)

使用vDSP_deq22进行滤波后的噪声/失真(双二阶IIR滤波器)
EN

Stack Overflow用户
提问于 2012-05-16 00:07:08
回答 2查看 2K关注 0票数 3

我正在为Novocaine开发一个DSP类(obj-c++),但我的滤波器似乎只对信号造成噪声/失真。

我已经在这里发布了我的完整代码和系数:https://gist.github.com/2702844,但它基本上归结为:

代码语言:javascript
复制
// 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)

有关完整的代码/上下文,请参阅要点。

系数:

代码语言:javascript
复制
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?)

是什么导致失真/噪声(滤波器不工作)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-16 04:43:42

我建议大家使用我在github:https://github.com/bartolsthoorn/NVDSP上发布的类,它可能会帮你节省很多工作。

让它工作了,呼!日本万岁:http://objective-audio.jp/2008/02/biquad-filter.html

applyFilter方法必须是:

代码语言:javascript
复制
- (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);
}

完整类:https://github.com/bartolsthoorn/NVDSP

票数 10
EN

Stack Overflow用户

发布于 2013-07-28 19:49:07

使用以下命令复制数据:

代码语言:javascript
复制
memcpy(data, tOutputBuffer+2, frames * sizeof(float));

它会起作用的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10604690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档