Jus*_*tin 1 c# c++ signal-processing fft
我有一个振幅频率响应点列表.幅度以分贝给出.
任务是将此AFR列表导出为某些硬件DSP设备的一组系数.我知道这个设备的文件格式.该器件的规格表明它需要12288个系数,DSP有2个FIR滤波器模块(每个6144个抽头).这个想法是在加载那些系数之后,该设备应该作为均衡器工作,它根据初始的放大频率点列表转换信号.
我已经发现FIR滤波器的系数可以通过采用所需频率响应的逆傅里叶变换并且还使用一些窗口函数(优选地不是矩形)来计算.
问题是我不擅长信号处理,我不太了解FIR,我使用FFT来获取音频数据的频率响应,但我仍然对FFT和相关的东西如何工作有一个非常模糊的想法.
点的计算应该用C#或C++完成(我擅长创建C++/CLI包装器),所以我可以将它集成到现有的应用程序中.导出过程不是时间关键,因此我可以使用简单和慢速算法,但无论如何,它不应该在中档计算机上花费超过一分钟.
是否有任何免费的库或代码可以从幅频响应数据中获取FIR系数?
最好的解决方案就像是一个"黑盒子",所以我可以只输入AFR点列表并输出12288个系数,但我还要感谢多个库/代码片段,只要它们可以轻松组合在一起.
附加信息:
将通过该FIR传输的音频的采样频率为44100 Hz
信号的整体特性可以宽松地定义为"音乐",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
}
Run Code Online (Sandbox Code Playgroud)
小智 5
寻找良好FIR系数的标准方法是使用"Remez交换"算法.我找到了一些代码的链接(我自己没试过)你可能会觉得有用:http://www.janovetz.com/jake/remez/remez-19980711.zip.另一个要搜索的关键词是"Parks-McClellan".
算法的输入是幅度与频率的描述以及一组权重因子与频率的关系,其描述了满足该频率处的幅度要求的相对重要性.然后,算法在mini-max意义上找到最佳滤波器(最小化最大误差).