根据频率响应计算FIR系数
我有一个幅度频率响应点列表。 振幅以分贝为单位给出。
其任务是将此AFR列表导出为某些硬件DSP设备的一组系数。 我知道这个设备的文件格式。 该器件的规格说明它需要12288个系数,DSP有2个FIR滤波器模块(每个6144个抽头)。 这个想法是,在加载这些系数后,这个设备应该作为一个均衡器,根据初始的频率点列表对信号进行变换。
我发现FIR滤波器的系数可以通过对所需频率响应进行傅立叶逆变换并使用一些窗函数(最好不是矩形)来计算。
问题在于我不擅长信号处理,对FIR不太了解,我使用FFT来获取音频数据的频率响应,但我仍然对FFT和相关内容的工作原理非常模糊。
点的计算应该用C#或C ++(我擅长创建C ++ / CLI包装)完成,这样我就可以将它集成到现有的应用程序中。 导出过程不是时间关键的,所以我可以使用简单和慢速的算法,但无论如何,在中档计算机上不应超过一分钟。
是否有免费的库或代码从幅频响应数据获取FIR系数?
最好的解决方案就像是一个“黑盒子”,所以我可以提供AFR点列表并获得12288个系数,但如果只能将它们放在一起,我也会很感激多个库/代码片断。
附加信息:
将通过该FIR的音频采样频率为44100Hz
信号的整体特征可以松散地定义为“音乐性”,FIR将用于均衡高质量音频,因此如果高端音频系统中的训练有素的耳朵听不到任何错误和信号失真,
理论上在初始AFR点相邻振幅之间的差异可能在[0 dB ... 80 dB]的范围内,但在实际测试中,它们通常在[0 dB ... 2 dB]
AFR点之间的距离越来越大,第一点是20.17246114 20.68984457和最后两点21632.14039 21754.41533
使用以下公式计算积分:
float x;
for(int i = 0; i<bandPoints; i++){
x = (((float)i + 1) / ((float)(bandPoints + 2)));
bandsHz[i] = ((x*x)*(22000-20))+20; // 20...22000
}
寻找好的FIR系数的标准方法是使用“Remez交换”算法。 我找到了一些代码链接(没有亲自尝试过),您可能会发现它很有用:http://www.janovetz.com/jake/remez/remez-19980711.zip。 另一个要搜索的关键词是“Parks-McClellan”。
该算法的输入是幅度与频率的描述以及一组权重因子与频率的关系,描述了在该频率下满足幅度要求的相对重要性。 该算法然后在迷你最大意义上找到最佳滤波器(最小化最大误差)。
链接地址: http://www.djcxy.com/p/33831.html