C# 从频率响应计算FIR系数

C# 从频率响应计算FIR系数,c#,c++,signal-processing,fft,C#,C++,Signal Processing,Fft,我有一个幅频响应点列表。振幅以分贝为单位 任务是将此AFR列表导出为某些硬件DSP设备的一组系数。我知道这个设备的文件格式。该设备的规格说明需要12288个系数,DSP有2个FIR滤波器块(每个滤波器块有6144个抽头)。其思想是,在加载这些系数后,该设备应作为一个均衡器,根据初始振幅频率点列表变换信号 我发现FIR滤波器的系数可以通过对期望的频率响应进行傅里叶逆变换并使用一些加窗函数(最好不是矩形)来计算 问题是我不擅长信号处理,我对FIRs不太了解,我用FFT从音频数据中获得频率响应,但我对

我有一个幅频响应点列表。振幅以分贝为单位

任务是将此AFR列表导出为某些硬件DSP设备的一组系数。我知道这个设备的文件格式。该设备的规格说明需要12288个系数,DSP有2个FIR滤波器块(每个滤波器块有6144个抽头)。其思想是,在加载这些系数后,该设备应作为一个均衡器,根据初始振幅频率点列表变换信号

我发现FIR滤波器的系数可以通过对期望的频率响应进行傅里叶逆变换并使用一些加窗函数(最好不是矩形)来计算

问题是我不擅长信号处理,我对FIRs不太了解,我用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
       }
float x;

对于(int i=0;i查找好的FIR系数的标准方法是使用“Remez交换”算法。我找到了一些代码的链接(我自己没有尝试过),您可能会发现这些代码很有用:。另一个要搜索的关键字是“Parks McClellan”


算法的输入是振幅对频率的描述,以及一组权重因子对频率的描述,这些权重因子描述了在该频率下满足振幅要求的相对重要性。然后,算法在最小-最大意义上(最小化最大误差)找到最佳滤波器.

找到好的FIR系数的标准方法是使用“Remez交换”算法。我找到了一些代码的链接(我自己没有尝试过),您可能会发现这些代码很有用:。另一个要搜索的关键字是“Parks McClellan”


算法的输入是振幅对频率的描述,以及一组权重因子对频率的描述,这些权重因子描述了在该频率下满足振幅要求的相对重要性。然后,算法在最小-最大意义上(最小化最大误差)找到最佳滤波器.

不确定在没有频率响应相位的情况下这是否可能。可能可以近似,例如,通过假设滤波器具有线性相位。给定频率点之间的距离有多近,相邻振幅之间的最大差值有多大,合成FIR滤波器响应中的允许误差有多大,以及采样率?这些答案与FIR所需的近似长度之间存在关系。@hotpaw2我添加了更多信息,不确定在没有频率响应相位的情况下这是否可行。也许可以近似,例如,通过假设滤波器具有线性相位。给定频率po的距离有多近ints,相邻振幅之间的最大差值是多少,合成FIR滤波器响应中允许的误差是多少,采样率是多少?这些答案和FIR的近似所需长度之间有关系。@hotpaw2我添加了更多信息Parks-McLellan设计的有用介绍nd页面也很好!请注意,Parks-McClellen过滤器设计工具最常用于频带(通过和停止)可以表示为一系列矩形而不是(非矩形)的情况连续函数的近似值。对Parks-McLellan设计有一个有用的介绍,这一页也很好!请注意,Parks-McLellen滤波器设计工具最常用于频带(通过和停止)可以表示为一系列矩形,而不是连续函数的(非矩形)近似值。