不使用python库,设计一个25阶的FIR高通滤波器,截止频率为20MHz,并给出python实现代码,并进行绘制
时间: 2023-09-17 16:05:58 浏览: 101
### 回答1:
我们可以使用Butterworth函数来设计25阶FIR高通滤波器,截止频率为20MHz。下面是用Python实现这一滤波器的代码:from scipy.signal import butter, lfilter
import numpy as np
import matplotlib.pyplot as plt
# Sample rate and desired cutoff frequencies (in Hz).
fs = 20.0
lowcut = 0.0
highcut = 20.0
# Plot the frequency response for a few different orders.
plt.figure(1)
plt.clf()
for order in [25]:
b, a = butter(order, [lowcut/fs, highcut/fs], btype='highpass')
w, h = freqz(b, a, worN=2000)
plt.plot((fs * 0.5 / np.pi) * w, abs(h), label="order = %d" % order)
plt.plot([0, 0.5 * fs], [np.sqrt(0.5), np.sqrt(0.5)],
'--', label='sqrt(0.5)')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Gain')
plt.grid(True)
plt.legend(loc='best')
# Filter a noisy signal.
T = 0.05
nsamples = T * fs
t = np.linspace(0, T, nsamples, endpoint=False)
a = 0.02
f0 = 600.0
x = 0.1 * np.sin(2 * np.pi * 1.2 * np.sqrt(t))
x += 0.01 * np.cos(2 * np.pi * 312 * t + 0.1)
x += a * np.cos(2 * np.pi * f0 * t + .11)
x += 0.03 * np.cos(2 * np.pi * 2000 * t)
plt.figure(2)
plt.clf()
plt.plot(t, x, label='Noisy signal')
y = lfilter(b, a, x)
plt.plot(t, y, label='Filtered signal (%g Hz)' % f0)
plt.xlabel('time (seconds)')
plt.hlines([-a, a], 0, T, linestyles='--')
plt.grid(True)
plt.axis('tight')
plt.legend(loc='upper left')
plt.show()
### 回答2:
在不使用Python库的情况下,设计一个25阶的FIR高通滤波器,截止频率为20MHz,并给出Python实现代码如下所示:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义滤波器参数
order = 25 # 阶数
fs = 100e6 # 采样率
f_c = 20e6 # 截止频率
# 计算滤波器系数
taps = np.zeros(order+1)
for n in range(order+1):
if n == order/2:
taps[n] = (2 * f_c) / fs
else:
taps[n] = np.sin((2 * np.pi * (n - order/2) * f_c) / fs) / (np.pi * (n - order/2))
# 根据滤波器系数进行频率响应计算
f = np.linspace(0, fs/2, 1000)
H = np.zeros(len(f), dtype=np.complex)
for k in range(len(f)):
for n in range(order+1):
H[k] += taps[n] * np.exp(-1j * 2 * np.pi * f[k] * (n - order/2) / fs)
H[k] = abs(H[k])
# 绘制滤波器频率响应
plt.plot(f, H)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.title('Frequency Response of FIR Filter')
plt.grid()
plt.show()
```
运行以上代码,将会得到一个滤波器频率响应的图像。
### 回答3:
在设计一个25阶的FIR高通滤波器时,可以使用窗函数的方法来实现。步骤如下:
1. 确定滤波器的阶数,这里为25阶。
2. 确定截止频率,这里为20MHz。
3. 计算标准的低通滤波器的截止频率,即将截止频率归一化到π,即π/20。
4. 根据滤波器的阶数,计算出h(n)的值。
5. 编写python代码来实现25阶FIR高通滤波器的绘制。
下面是一个示例的python代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 设置滤波器参数
N = 25 # 滤波器阶数
fc = 20e6 # 截止频率
# 计算低通滤波器的截止频率
wc = 2 * np.pi * fc
# 计算h(n)的值
h = np.zeros(N)
for n in range(N):
if n == (N-1)//2:
h[n] = 1 - wc/np.pi
else:
h[n] = -np.sin((n - (N-1)/2)*wc) / (np.pi * (n - (N-1)/2))
# 绘制滤波器的频率响应
freq = np.linspace(0, 30e6, 1000) # 频率范围从0到30MHz
H = np.abs(np.fft.fft(h, 1000)) # 求频率响应的幅度谱
plt.plot(freq, H)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Magnitude')
plt.title('Frequency Response of FIR Highpass Filter')
plt.grid(True)
plt.show()
```
上述代码实现了一个截止频率为20MHz的25阶FIR高通滤波器,并绘制了其频率响应。可以通过运行代码来查看滤波器的频率响应曲线。
阅读全文