从滤波器系数计算频率响应

4
我找不到任何易懂的关于这个主题的信息。在荷兰维基百科上,我发现可以应用z变换,其产生的公式如下:
www.music.mcgill.ca/~gary/618/week1/img15.gif 这个FIR滤波器是一个例子:
upload.wikimedia.org/math/b/9/e/b9e2ed5184f98621922f716e5216f33d.png 使用z变换:
upload.wikimedia.org/math/4/d/6/4d6621be8fabf4db8816c12f34ed9877.png 在这个例子中,e^it(自然对数乘以虚数单位,t = theta)被代替为z:upload.wikimedia.org/math/0/6/e/06eada8fedfb492bd63bb50491b042aa.png 然后,该函数的图形被用作频率响应。我认为这种方法是计算滤波器频率响应的简单方法。但是,这种方法是否有效?当我考虑到小延迟(“阻止”原始信号)时,我想到频率响应应该对于每个频率都是1,因为信号没有改变,只是延迟了,但是使用这种方法,我计算出的频率响应将是:
y(n) = 0*x(n) + 1*x(n-1)  

Z变换

H(z) = 0 + 1z^-1

将 e^it (其中 t=theta) 替换为:

H(e^it) = 0 + 1 * e^-it

由于这样产生的频率响应是正弦波,我肯定做错了什么或者误解了某些东西。如果有人能帮助我,我会非常感激!


1
这不是“正弦波”。它是一个具有单位的复数(re ^ 2 + im ^ 2 == 1),其相位变化取决于(与)频率成比例。也就是说,每个频率都有一个纯相位变化。 - rwong
这类问题也可以在http://mathoverflow.net/上提问。 - codekaizen
4个回答

5
根据rwong的评论,系统函数H可以给出在特定频率下系统的相位和幅度响应。这意味着如果输入信号是cos[ωn] = cos[2πfn],输出将是a(f)cos[2πfn + Φ(f)],其中a(f)=|H(f)|且Φ(f)=phase(H(f))。在你的情况下,由于信号没有被缩放,只是时间上发生了偏移,所以幅度为1。相位偏移为-ω,其中ω是正弦输入信号的角频率。
我希望以下内容不会对Stack Overflow来说太基础,但是对minibear和其他人来说,回顾时间序列分析的基本知识可能会有所帮助。
如果你有一个脉冲响应为h[n]=δ[n-1](其中δ[n]是一个delta函数)的系统,就像你的例子一样,这意味着你将输入信号延迟了1个时间步长。想想这在正弦波的相位方面意味着什么。最快变化的正弦波的数字频率为0.5(即2个样本的周期)--例如cos[πn]。这是系列[1,-1,...]。如果你将这个信号延迟1个时间步长,你将得到系列[-1,1,...],即cos[πn - π] = cos[π(n - 1)],即输入信号相位向负π弧度(-180度)偏移。看一个数字频率为0.25(即4个样本的周期)的更长周期信号--例如cos[0.5πn]。这是系列[1,0,-1,0,...]。单位延迟会产生系列[0,1,0,-1,...],即cos[0.5πn - 0.5π] = cos[0.5π(n - 1)],即输入信号相位向负π/2弧度(-90度)偏移。类似地,你可以计算出输入cos[0.25πn]将产生输出cos[0.25πn - 0.25π] = cos[0.25π(n - 1)],即输入相位向负π/4弧度(-45度)偏移等等。
很明显,如果输入的角频率是ω(例如0.5π),输出将被相位偏移Φ=-ω。把信号想象成在逆时针方向上绕着单位圆运行的火车,其时间序列值对应于沿途停靠的位置。角频率为0.5π意味着它在以下弧度值处停靠4次:0、0.5π、π、1.5π。然后它返回0并一遍又一遍地重复这个周期。如果这辆火车被延迟了一站,那么这对应于在预定路线上向-0.5π弧度移动。
回到H(f),我希望你能理解它等于exp(-i2πf) = exp(-iω)的原因。同样地,如果你的系统有2个单位的延迟,则h[n] = δ[n-2],而H(f) = exp(-i4πf) = exp(-2iω)——这是在单位圆上延迟了2个单位。这就是系统/滤波器的频率响应所告诉你的全部内容,即系统如何根据频率缩放和延迟每个输入正弦波。
FIR系统(即有限脉冲响应,对应于移动平均模型[MA])是最简单的,因为它们只是在前向路径上的delta函数(即缩放和延迟)的总和。IIR系统(即无限脉冲响应,对应于自回归模型[AR])更有趣,因为它们有一个反馈路径。

1

作弊并使用Matlab :)

对于

y(n) = 0*x(n) + 1*x(n-1)  

b=[ 0 1 ];
a = 1;
freqz(b,a)

1
一个简单的方法是基于图形的:你可以将其作为算法的基础,也可以手动使用它来绘制频率响应曲线,并且通过直观的方式快速了解响应。这适用于FIR和IIR滤波器。
首先,在图上绘制极点和零点,以及单位圆。 然后,对于任何你想计算频率响应幅值的给定频率:
  • 从所有的零点画线到单位圆上相应的点,并计算它们的长度。
  • 对于极点也做同样的操作。
  • 将所有零线长度相乘得到一个乘积N。
  • 对于极线长度也进行同样的操作,记为D。
  • 幅值将会是N/D。
显然,你需要在单位圆上的多个点上重复上述操作。

0

这里没有问题,你做得很对。这不是正弦函数。根据欧拉方程,正弦函数定义如下: (e^jw - e^-jw)/ j2

换句话说,你最终得到的是一个复数。 假设你的输入是x[n] = cos( pi/3 * n )。那么系统的输出是 y[n] = H(e^jw)*x[n]

因此,你需要用数字频率pi/3来乘以频率响应来处理输入信号。 cos( pi/3 * n ) = ( e^pi/3*n + e^-pi/3*n)/2。将你的输入视为两个不同的信号,一个频率为pi/3,另一个频率为-pi/3。你最终得到的输出是e^-j(pi/3) * e^(pi/3*n) + e^j(pi/3) * e^(-pi/3*n),这相当于2*cos( -pi/3*n - pi/3 )。这是预期的,因为信号被延迟了。

此外,把正弦波作为你的频率响应也没有任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接