我应该使用scipy.signal.firwin进行放大吗?

我应该使用scipy.signal.firwin进行放大吗?,scipy,signal-processing,Scipy,Signal Processing,Scipy的firwin2函数接受大于1.0的增益值,这将导致相应频率的放大。我已经测试过了,它看起来像预期的那样工作。然而,我在网上找到的所有示例都只使用了介于0.0和1.0之间的增益值。这让我怀疑:用firwin2函数制作和放大滤波器是不是一个坏主意?不接受增益因子,只接受numtaps和 firwin(numtaps, cutoff, width=None, window='hamming', pass_zero=True, scale=True, nyq=None,

Scipy的firwin2函数接受大于1.0的增益值,这将导致相应频率的放大。我已经测试过了,它看起来像预期的那样工作。然而,我在网上找到的所有示例都只使用了介于0.0和1.0之间的增益值。这让我怀疑:用firwin2函数制作和放大滤波器是不是一个坏主意?

不接受增益因子,只接受numtaps和

firwin(numtaps, cutoff, width=None, window='hamming', pass_zero=True,
           scale=True, nyq=None, fs=None)
要么我没有正确理解你的问题,要么你把
切断
和增益混淆了。 截止值表示已关闭

如果要应用增益,请将返回的滤波器乘以增益

from scipy import signal
numtaps = 3
f = 0.1
gain = 5;
h = gain * signal.firwin(numtaps, f)
您可以按如下方式绘制过滤器的响应

import numpy as np;
import matplotlib.pyplot as plt;

h1 = signal.firwin(256, 0.1)
h2 = signal.firwin(256, 0.3)

plt.plot(np.fft.rfftfreq(len(h1)), abs(np.fft.rfft(h1)))
plt.plot(np.fft.rfftfreq(len(h2)), abs(np.fft.rfft(h2)))
plt.xlabel('F / Fs')
plt.ylabel('Filter gain')

编辑:关于firwin2的问题

函数(freq,gain)返回一个滤波器,该滤波器由频域内的插值和窗口(标量乘法)构成。此操作在增益阵列上是线性的。i、 e.
firwin2(频率,A*增益)=A*firwin2(频率,增益)
。因此存在类似于
增益<1
的限制

您可以通过以下方式确认这一点:

来自scipy导入信号的

将numpy作为np导入
taps1=信号firwin2(150,[0.0,0.5,1.0],[1.0,1.0,0.0])*2
taps2=信号firwin2(150,[0.0,0.5,1.0],[2.0,2.0,0.0])
断言(np.allclose(taps1,taps2))
不接受增益因子,仅接受numtaps和

firwin(numtaps, cutoff, width=None, window='hamming', pass_zero=True,
           scale=True, nyq=None, fs=None)
要么我没有正确理解你的问题,要么你把
切断
和增益混淆了。 截止值表示已关闭

如果要应用增益,请将返回的滤波器乘以增益

from scipy import signal
numtaps = 3
f = 0.1
gain = 5;
h = gain * signal.firwin(numtaps, f)
您可以按如下方式绘制过滤器的响应

import numpy as np;
import matplotlib.pyplot as plt;

h1 = signal.firwin(256, 0.1)
h2 = signal.firwin(256, 0.3)

plt.plot(np.fft.rfftfreq(len(h1)), abs(np.fft.rfft(h1)))
plt.plot(np.fft.rfftfreq(len(h2)), abs(np.fft.rfft(h2)))
plt.xlabel('F / Fs')
plt.ylabel('Filter gain')

编辑:关于firwin2的问题

函数(freq,gain)返回一个滤波器,该滤波器由频域内的插值和窗口(标量乘法)构成。此操作在增益阵列上是线性的。i、 e.
firwin2(频率,A*增益)=A*firwin2(频率,增益)
。因此存在类似于
增益<1
的限制

您可以通过以下方式确认这一点:

来自scipy导入信号的

将numpy作为np导入
taps1=信号firwin2(150,[0.0,0.5,1.0],[1.0,1.0,0.0])*2
taps2=信号firwin2(150,[0.0,0.5,1.0],[2.0,2.0,0.0])
断言(np.allclose(taps1,taps2))

这绝对不是个坏主意!与其他基于窗口的设计一样,您需要确保NUMTAP(也称为过滤器的顺序)足以表示所需的频率响应

您看到的增益=[0,1]的伪标准是因为,在大多数情况下,相对于不使用放大,过单位放大并不能提高信噪比(相反,放大可能会引入削波)。要提高信噪比和信噪比,您需要消除噪声或干扰。如果噪声和干扰的频率与您想要的信号不同,您可以通过过滤来衰减它们。在这种情况下,信号的频率将保持1.0的增益,而不需要的部分将保持0.0的增益

然而,有时你会想放大一些频率,而不去理会其他频率或是衰减它们。音频均衡器就是一个例子。假设你有一个基于计算机的音频均衡器。用户将看到一系列不同频率的滑块,并根据需要上下调整。你的车里可能有一个这样的。您可以通过简单地传入频率向量和相应的增益向量,轻松地使用firwin2创建相应的FIR系数。如果用户将低音调高,同时将所有其他频率保持在0 dB(即单位增益),则在您设计的低音频率下增益为1.0,在所有其他频率下增益为1.0


下面是一个使用增益实现音频均衡器的示例。我找到了以下图片:

为了使用firwin2实现这一点,我可以使用以下脚本:

来自scipy导入信号的

将numpy作为np导入
导入matplotlib.pyplot作为plt;
Fs=44100
订单=4096+1
频率=[0,32,64,125,250,500,1000,2000,4000,8000,16000,Fs/2]
增益_dB=[4.0,4.0,2.3,1.0,0.3,-0.3,-1.2,0.1,1.6,3.1,3.3,3.3]
增益=10.*(np.asarray(增益/10.)
h=信号。firwin2(阶数、频率、增益,fs=fs)
plt.semilogx(np.fft.rfftfreq(len(h))*Fs,10*np.log10(abs(np.fft.rfft(h)))
plt.title(“均衡器示例”)
plt.xlabel('频率,Hz')
plt.ylabel('滤波器幅度响应,dB')
plt.grid(True,其中='tware')
plt.show()

请注意:

  • 通常在半对数图上绘制过滤器,因为每个倍频程都会发生衰减
  • 您通常以分贝为单位绘制增益图
  • firwin2
    接受线性单位的增益,而不是分贝,因此需要进行转换
  • firwin2
    要求频率表示为0和Fs/2,因此我将它们添加到中,并使它们与它们的邻居相等

这绝对不是个坏主意!与其他基于窗口的设计一样,您需要确保NUMTAP(也称为过滤器的顺序)足以表示所需的频率响应

您看到的增益=[0,1]的伪标准是因为,在大多数情况下,相对于不使用放大,过单位放大并不能提高信噪比(相反,放大可能会引入削波)。要提高信噪比和信噪比,您需要消除噪声或干扰。如果噪声和干扰的频率与您想要的信号不同,您可以通过过滤来衰减它们。在这种情况下,信号的频率将保持1.0的增益,而不需要的部分将保持0.0的增益

然而,有时你会想放大一些频率,而不去理会其他频率或衰减其他频率