阶巴特沃斯滤波器的平方传递函数应该是
其中是截止频率。(这是许多可能的参考之一。)
我无法使用 Python 或 Matlab 正确重现这一点。 = 20 Hz 截止频率的三阶滤波器 ( ), = 100 Hz 处采样的信号。
在 Python 中,我将其实现为
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, sosfreqz
fc = 20 # Hz, Cut-off frequency
fs = 100 # Hz, sampling frequency
order = 3 # Filter order
nyq = 0.5*fs # Nyquist frequency
sos = butter(order, fc/nyq, analog=False, btype='low', output='sos')
w, h = sosfreqz(sos, worN=2000)
f = nyq*w/np.pi # Convert to Hz
Hf2_scipy = np.abs(h)**2
Hf2_theory = 1/(1+(f/fc)**(2*order))
绘制结果会给出不匹配的曲线
fig, ax = plt.subplots()
ax.plot(f, Hf2_scipy, label='Scipy')
ax.plot(f, Hf2_theory, label='Theory')
ax.set(xlabel='f (Hz)', ylabel='|H(f)|^2', xlim=[0, nyq], ylim=[0, 1])
ax.axhline(0.5, color='0.5')
ax.axvline(fc, color='0.5')
ax.legend()
我错过了什么?
这是 Matlab 中的等效尝试,它产生相同的结果
fc = 20; % Cut-off frequency
fs = 100; % Sample frequency
order = 3; % Filter order
[z, p, k] = butter(order, fc/(fs/2), 'low');
sos = zp2sos(z, p, k);
[h, w] = freqz(sos, 2000);
f = w*fs/(2*pi); % Convert to Hz
Hf2_matlab = abs(h).^2;
Hf2_theory = 1./(1+(f/fc).^(2*order));
plot(f, Hf2_matlab, 'k')
plot(f, Hf2_theory)
plot([fc, fc], [0, 1], 'color', 0.5*[1, 1, 1])
plot([0, fs/2], [0.5, 0.5], 'color', 0.5*[1, 1, 1])
legend('Matlab', 'Theory')
xlabel('f (Hz)')
ylabel('|H(f)|^2')



