用矩形窗设计一个FIR线性相位数字低通滤波器,已知Wc=0.5pi,N=21
时间: 2024-02-01 22:13:14 浏览: 136
基于矩形窗设计FIR数字滤波器.pdf
首先,根据FIR线性相位数字低通滤波器的特性,其频率响应为:
H(e^jω) = A(e^jω)e^-jNω/2
其中,A(e^jω)为低通滤波器的振幅响应。在本题中,我们需要设计一个截止频率为0.5π,即归一化频率为0.5的低通滤波器。因此,其振幅响应为:
A(e^jω) = 1,当|ω| <= 0.5π
A(e^jω) = 0,当|ω| > 0.5π
接下来,我们需要确定滤波器的冲激响应h(n),根据FIR滤波器的性质,冲激响应可以通过反向傅里叶变换得到:
h(n) = (1/2π)∫H(e^jω)e^jωn dω,从-π到π
由于振幅响应为一个矩形函数,因此上式可以简化为:
h(n) = (1/2π)∫e^-jNω/2e^jωn dω,从-0.5π到0.5π
将e^-jNω/2展开,得到:
h(n) = (1/2π)∫e^jω(n-N/2) -jω(N/2) dω,从-0.5π到0.5π
再次利用欧拉公式,将上式转化为:
h(n) = (1/2π)∫[cos(ω(n-N/2)) + jsin(ω(n-N/2))]e^-jω(N/2) dω,从-0.5π到0.5π
由于sin函数为奇函数,cos函数为偶函数,因此当积分区间为[-0.5π,0.5π]时,sin函数的积分为0,cos函数的积分为2π或0。因此,上式可以进一步简化为:
h(n) = (1/π)cos(ωc(n-N/2)),当n为偶数时
h(n) = 0,当n为奇数时
其中,ωc为归一化的截止频率,即0.5π。
根据上面的式子,我们可以得到滤波器的冲激响应h(n),如下所示(代码实现):
```python
import numpy as np
# 滤波器参数
N = 21
wc = 0.5 * np.pi
# 计算冲激响应
h = np.zeros(N)
for n in range(N):
if n % 2 == 0:
h[n] = np.cos(wc * (n - N / 2)) / np.pi
```
最后,我们可以使用计算得到的冲激响应h(n)来实现FIR低通滤波器。具体来说,我们可以将输入信号与冲激响应进行卷积,得到滤波后的输出信号。如下所示(代码实现):
```python
def fir_lowpass_filter(x, h):
# 对输入信号进行填充,使得卷积后的长度等于原始信号长度
N = len(h)
x_padded = np.pad(x, (0, N - 1), mode='constant')
# 对输入信号和冲激响应进行卷积
y = np.convolve(x_padded, h)
# 截取卷积结果的有效部分,并返回
y = y[N//2:N//2+len(x)]
return y
```
使用上述代码,我们可以对任意长度的输入信号进行FIR低通滤波。例如,下面是对一个长度为1000的随机信号进行FIR低通滤波的示例代码:
```python
import matplotlib.pyplot as plt
# 生成随机信号
x = np.random.randn(1000)
# 计算滤波器冲激响应
N = 21
wc = 0.5 * np.pi
h = np.zeros(N)
for n in range(N):
if n % 2 == 0:
h[n] = np.cos(wc * (n - N / 2)) / np.pi
# 进行滤波
y = fir_lowpass_filter(x, h)
# 绘制结果
plt.figure()
plt.plot(x, label='input signal')
plt.plot(y, label='filtered signal')
plt.legend()
plt.show()
```
阅读全文