1. 滤波器设计窗口
本程序提供特定的FIR、IIR滤波器设计，设计过程可实时显示滤波效果。点击程序主窗口的【滤波器设计】按钮，界面的一些参数解释如下：

【设计类型】：FIR、IIR模型可供选择。
【目标滤波】：设定通带类型。如果有特殊滤波需求，可参下面第2点内容。
【滤波序列】：为矩阵变量，即输入的待滤波序列，通过此参数的设置，可实时显示设计的滤波器对此序列的滤波效果。
【相位间隔】：主要针对【滤波序列】滤波后的序列与原序列相位间隔差，这个参数主要方便对比滤波效果。
【归化系数】：这个参数主要影响FIR的增益。
【加窗设计】：这个面板主要针对FIR，面板的【窗口函数】可以实现不同类型的加窗设计。
【优化设计】：主要采用线性最小二乘来求解系数。
【设计方式】：这个面板主要针对IIR，不同的滤波函数会设计不同的IIR模型。
【计算】：此按钮主要其单独计算功能。
【导出】：可以将设计好的滤波器系数导出为矩阵变量。

2. 代码化滤波器
对于一些特定的滤波器类型, 比如要求在多个段进行带通, 或者针对特定滤波器, 希望通过优化方式求得系数。这时可以通过程序代码的OptFilter类进行处理。下面的代码为这个类的常见函数, 利用下面的代码,很容易在【启发式优化】中进行使用

'1 新建滤波优化器
Dim filter As New OptFilter

If True Then
    '2.1 特定滤波器类型

    '2.1.1 设定采样频率
    filter.SetSamplingFrequency(420000)

    '2.1.2 设定为低通滤波器,截止频率为6500
    filter.SetLowPassLimitFrequency(6500)

    '2.1.2 设定为高通滤波器,截止频率为6500
    'filter.SetHighPassLimitFrequency(6500)

    '2.1.2 设定为带通滤波器,带通内的频率范围为[2000, 8500]
    'filter.SetBandPassLimitFrequency(2000, 8500)

    '2.1.2 设定为带阻滤波器,带阻内的频率范围为[2000, 8500]
    'filter.SetBandStopLimitFrequency(2000, 8500)

    '2.1.3 数据等间隔划分数.里面实际的样本数大于 1024 且小于1024 * 7
    filter.SetSampleSize(1024)
Else
    '2.2 指定滤波器类型
    Dim w(1024) As Double
    Dim h(1024) As Double

    'w:表示一个取值在[0,pi]之间的数组
    'h:表示对应频率w时,理想脉冲值
    filter.SetSampleData(w, h)
End If

'3. 设置模型为IIR模型, 分子系数3个,分母系数6个
filter.SetIIROptVarNum(3, 6)

'设定为FIR模型,系数为20
'filter.SetFIROptVarNum(20)

'4 设置虚轴误差权重,
filter.SetImagWeight(100)

'5 计算误差,下面var的个数必须和模型中的未知数一致
Dim var(8) As Double = {1, 1, 1, 1, 1, 1, 1, 1, 1}
Dim er As Double = filter.CalcError(var)

'6 设置变量,并滤波x为原始序列,y为滤波后输出的序列
filter.SetIIROptVarNum(3, 6)
filter.SetParam(var) 'var必须为3+6个元素
filter.Filter(x, y)

3、另一种误差函数构建
在启发式优化代码窗口里,除了第2点的方式外, 提供一个如下形式IIR滤波器系数目标函数CalcErrorByIIR
Dim var(7) As Double = {1, 1, 1, 1, 1, 1, 1, 1}
Dim data(,) As Double'这里假如data每一列为对应采样数据
Dim error As Double = CalcErrorByIIR(data, var, 3, 4) '这里IIR中a的系数个数为3, b的系数个数为4, var最后一个参数为相位拟合参数, 拟合时其值介于[0, 7]之间,其中7 = 3 + 4