import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import firwin2, cheby2, freqz, group_delay
# 设计参数
wp = 0.1 * np.pi
ws = 0.15 * np.pi
dp = 0.05
ds = 73
# 归一化频率
wp_n = wp / np.pi
ws_n = ws / np.pi
# 最小二乘FIR滤波器设计
numtaps = 301
bands = [0, wp_n, ws_n, 1]
desired = [1, 1, 0, 0]
fir_coeff = firwin2(numtaps, bands, desired)
# 12阶切比雪夫2型滤波器设计
N = 12
rs = ds # 阻带衰减
b_cheby2, a_cheby2 = cheby2(N, rs, ws_n, btype='low', analog=False)
# 计算频率响应和群延迟
w, h_fir = freqz(fir_coeff, worN=300)
w, h_cheby2 = freqz(b_cheby2, a_cheby2, worN=300)
# 计算群延迟
_, gd_fir = group_delay((fir_coeff, 1), w=w)
_, gd_cheby2 = group_delay((b_cheby2, a_cheby2), w=w)
# 转换频率轴为归一化频率
w = w / np.pi
# 绘制幅频响应
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(w, 20 * np.log10(np.abs(h_fir)), 'b', label='FIR')
plt.plot(w, 20 * np.log10(np.abs(h_cheby2)), 'r', label='Chebyshev II')
plt.title('Magnitude Response')
plt.xlabel('Normalized Frequency (π rad/sample)')
plt.ylabel('Magnitude (dB)')
plt.grid()
plt.ylim([-100, 5])
plt.legend()
# 绘制群延迟
plt.subplot(1, 2, 2)
plt.plot(w, gd_fir, 'b', label='FIR')
plt.plot(w, gd_cheby2, 'r', label='Chebyshev II')
plt.title('Group Delay')
plt.xlabel('Normalized Frequency (π rad/sample)')
plt.ylabel('Group Delay (samples)')
plt.grid()
plt.legend()
plt.tight_layout()
plt.show()

import numpy as np
import matplotlib.pyplot as plt
# 参数定义
L = 100 # Hamming窗长度,L+1个点
n = np.arange(0, 3*L) # 定义信号长度
omega1 = 0.07 * np.pi
omega2 = 0.02 * np.pi
omega3 = 0.4 * np.pi
# 定义Hamming窗函数
def hamming_window(n, L):
if n > L:
return 0
return 0.54 - 0.46 * np.cos(2 * np.pi * n / L)
# 生成Hamming窗
w = np.array([hamming_window(i, L) for i in range(3*L)])
# 定义三个窄带脉冲信号
x1 = w * np.cos(omega1 * n)
x2 = w * np.cos(omega2 * n - np.pi / 2)
x3 = w * np.cos(omega3 * n + np.pi / 5)
# 组合信号
x = x1 + np.roll(x2, L) + np.roll(x3, 2*L)
# 绘图
plt.figure(figsize=(12, 6))
plt.plot(n, x, label='x(n)')
plt.title('Generated Signal x(n)')
plt.xlabel('n')
plt.ylabel('Am