用Python中的双线性插值实现连续到离散

2024-04-29 06:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个一阶低通滤波器(LPF)在频域,我想数字化它。我比较了测试的频率响应图,但是我得到了奇怪的结果。。。你知道吗

虽然非常基本,但我无法通过阅读^{}帮助页或网络获得正确的信息。你知道吗

  • numden:S平面上的分子和分母
  • ba:我希望它是ba数字差分方程滤波器(IIR)的系数,形状:Y[n]=a0*X[n]+a1*X[n-1]+。。。-b1*Y[n-1]。。。你知道吗

下面是一个代码示例:

Fs = 48000.0
f = 2 * np.logspace(1,4,1024)

num =  [0 , 1]
den = [0.001 , 1]

tmp, H = sig.freqs(num, den, worN=1024)
b, a = sig.bilinear(num, den, 1.0)
tmp, Hd = sig.freqz(b,a, worN=1024)

plt.semilogx(f, 20*np.log10(np.abs(H)))
plt.semilogx(f, 20*np.log10(np.abs(Hd)))

我做错什么了?你知道吗


Tags: nppltabsnumtmpsig数字化hd
2条回答

是的,这很有帮助。然后我进入下一步,使两个“w”向量的长度相同,并覆盖所有有趣的采样点,如下所示:

Fs = 48000.0
f = 2 * np.logspace(1,4,1024)
w = 2 * np.pi * f

Snum =  [0 , 1]
Sden = [0.001 , 1]

w1, H = sig.freqs(Snum, Sden, worN=w)
b, a = sig.bilinear(Snum, Sden, Fs)
w2, Hd = sig.freqz(b,a, worN=w1/Fs)

此外,如果曲线图的单位为Hz(不是Rad/Sec0),则w应除以2*PI:

plt.semilogx(w1/np.pi/2, 20*np.log10(np.abs(H)), 'r')

问题是打印时没有在x轴上使用tmp,而且freqz以弧度/采样为单位给出了规格化的tmp向量:

import numpy as np
import scipy.signal as sig
import matplotlib.pyplot as plt

Fs = 48000
num =  [0 , 1000]
den = [1 , 1000]

w1, H = sig.freqs(num, den, worN=1024)
b, a = sig.bilinear(num, den, Fs)
w2, Hd = sig.freqz(b, a, worN=1024)

fig = plt.figure()
plt.title('Filter frequency response')
plt.semilogx(w1, 20*np.log10(np.abs(H)),'b')
plt.semilogx(w2*Fs, 20*np.log10(np.abs(Hd)),'k')
plt.ylabel('magnitude [dB]')
plt.xlabel('frequency [Hz]')
plt.grid()
plt.axis('tight')
plt.xlim([0.001, Fs/2])
plt.show()

这个代码运行得非常好。希望有帮助。你知道吗

相关问题 更多 >