我正在创建一个由复数混频器、CIC抽取器和 FIR 补偿/抽取滤波器组成的通道器。如果重要的话,最终的 FIR 滤波器可以实现为多个滤波器。
我的问题是,如何设计一个滤波器以补偿 CIC 滤波器非常不平坦的频率响应?您是否通过计算 CIC 响应的倒数来创建所需的频率响应,然后通过逆 FFT 运行它以获得脉冲响应?
如您所见,虽然我的特殊问题与 CIC 滤波器有关,但我的问题实际上是关于如何创建任何类型的失真补偿滤波器。
谢谢你的时间。
我正在创建一个由复数混频器、CIC抽取器和 FIR 补偿/抽取滤波器组成的通道器。如果重要的话,最终的 FIR 滤波器可以实现为多个滤波器。
我的问题是,如何设计一个滤波器以补偿 CIC 滤波器非常不平坦的频率响应?您是否通过计算 CIC 响应的倒数来创建所需的频率响应,然后通过逆 FFT 运行它以获得脉冲响应?
如您所见,虽然我的特殊问题与 CIC 滤波器有关,但我的问题实际上是关于如何创建任何类型的失真补偿滤波器。
谢谢你的时间。
以下解决了 CIC 补偿,而不是一般的“失真”技术。但这是一种直接“补偿”不变“失真”的方法。如果频率响应已知,则可以使用频率的倒数进行补偿。像 CIC 滤波器这样的示例,由于降低了复杂性,可能会使用较差的滤波器,稍后会在信号链中进行补偿。在这个例子中,频率响应是已知的,并且可以使用倒数。请注意,对于多速率滤波器,您只想在抽取后使用“可用”频谱。
通常,为了补偿 CIC 滤波器,可以使用 CIC 滤波器响应的倒数来生成补偿滤波器。CIC 的响应为(参见参考文献 [r2] 或 [r3])
其中 D 是微分延迟,M 是抽取率,N 是滤波器阶数(级联滤波器的数量)。逆可以指定为
一旦我们有了补偿滤波器的频率响应,我们就可以简单地选择我们想要的 FIR 滤波器的长度。FIR 的长度是特定于应用程序的。显然,FIR 滤波器越长补偿越好。
以下是这种直接补偿的图表。
以下是用于创建频率响应和绘图的 Python 代码。
import numpy as np
from numpy import sin, abs, pi
import pylab
D = 1; M = 7; N = 3
Hfunc = lambda w : abs( (sin((w*M)/2)) / (sin((w*D)/2.)) )**N
HfuncC = lambda w : abs( (sin((w*D)/2.)) / (sin((w*M)/2.)) )**N
w = np.arange(1024) * pi/1024
G = (M*D)**N
H = np.array(map(Hfunc, w))
Hc = np.array(map(HfuncC, w))
# only use the inverse (compensation) roughly to the first null.
Hc[int(1024*pi/M/2):] = 1e-8
plot(w, 20*log10(H/G))
plot(w, 20*log10(Hc*G))
grid('on')
有关其他方法和近似值,请参见 [r1]。
[r2] R. Lyons,“理解数字信号处理”,第 2 版,Prentice Hall,上马鞍河,新泽西州,2004 年
[r3] R. Lyons,“理解级联积分梳状滤波器”
我认为克里斯托弗的回答很好。我想我会为我们懒惰/作弊的类型添加一个。
在挖掘 Matlab 的 fdatool(滤波器设计和分析工具)时,我发现它可以设计和建模 CIC 和反 sinc 滤波器,其中反 sinc 滤波器是 CIC 的失真补偿滤波器。
您可以通过直接转到“创建多速率过滤器”页面(版本 R2011b 中左侧的按钮)并指定 CIC 过滤器来生成 CIC 过滤器。然后你可以设置你想要的所有参数,例如插值/抽取率、级联数(Matlab 称之为“部分”)等。
您可以通过转到“设计滤波器”页面(工具启动时默认进入的页面)并从“低通”下拉菜单中指定“反 Sinc 低通”来创建反正弦滤波器。然后,您可以为其设置各种参数。它在对话框的“选项”部分有几个独特的参数,包括“p”,它对应于级联数(sinc 指数)。
然而,反 sinc 滤波器设计并不完全令人满意,因为正确地设计它似乎不是做数学的一个例子,而是弄清楚我的通带在哪里,当时的 CIC 下降是多少,然后设计一个大致取消的滤波器出那个下垂。由于我的 CIC 过滤器有四个级联,我会认为我需要将“p”设置为四个,但是当我这样做时它过度补偿了。我最终将“p”保留为默认值 1。
当我在会话中保存两个滤波器时,该工具真的很出色,然后进入滤波器管理器并级联它们以查看整体频率响应。这非常有帮助,而且很容易做到。
此处不重复回复,请参阅
它显示了一个非常简单的 CIC 补偿 3 抽头解决方案。
这是特定于 CIC 或需要任何反 Sinc 应用程序(例如在 D/A 转换之前)。
为了补偿任何一般的横向失真(可以用横向滤波器复制而不是动态噪声失真),我会采用使用 Wiener Hopf 方程的方法来提出使用最小二乘误差方法的补偿滤波器,理想情况下使用训练序列(如果可用)将期望响应与实际响应进行比较并训练均衡器。有关使用源代码显示此内容的应用程序,请参见: