【发布时间】:2021-06-12 12:41:29
【问题描述】:
在设计低/高/带通滤波器时,我遇到了它们无法按预期工作的问题(请参阅代码和输出)。 我想隔离三个频率峰值之一(具有最低频率的低通滤波器等)。但是,错误的峰被隔离了...有谁知道我的错误是什么?
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
def create_single_freq_state(N, w):
"""
Creates a state that only contains the frequencies in w. Outputs array with N entries.
"""
res = np.exp(2.0*np.pi*w[:,np.newaxis]*np.arange(N)/N*1j)
return np.sum(res, axis=0)
def band_pass_filter(f1, f2, numtaps, window="hamming"):
fil = signal.firwin(numtaps, [f1, f2], pass_zero=False, fs=2*numtaps, window=window, scale=False)
return fil
def high_pass_filter(f, numtaps, window="hamming"):
fil = signal.firwin(numtaps, f, pass_zero=False, fs=2*numtaps, window=window, scale=False)
return fil
def low_pass_filter(f, numtaps, window="hamming"):
fil = signal.firwin(numtaps, f, pass_zero=True, fs=2*numtaps, window=window, scale=False)
return fil
def plot_freq_response(fil):
fs = 2*len(fil)
w, h = signal.freqz(fil, 1, worN=2000)
plt.plot((fs * 0.5 / np.pi) * w, abs(h), label="Hamming window")
plt.show()
def plot_func(f):
x = np.arange(1, len(f)+1)
plt.plot(x, f, color ="red")
plt.show()
#create state with several frequencies (those contained in the variable ws)
N = 60
ws = np.array([15, 30, 50])
f = create_single_freq_state(N, ws)
numtaps = 60-1
freq1 = 19.9
freq2 = 40.0
#choose filter
fil = low_pass_filter(freq1, numtaps)
#fil = band_pass_filter(freq1, freq2, numtaps)
#fil = high_pass_filter(freq2, numtaps)
#plot signal in fourierspace
plot_func(np.fft.fft(f))
#plot frequency response
plot_freq_response(fil)
#plot result of the application of the filter
plot_func(np.absolute(np.fft.fft(np.convolve(fil, f, mode="same"))))
【问题讨论】:
-
*1j位于create_single_freq_state函数的分母中。这是故意的吗?另外,我建议不要在卷积中使用mode="same",因为当信号和滤波器的长度大致相同时,边缘效应很重要。 -
哦,我以为这样写就意味着它在分子中...我将行更改为 res = np.exp(2.0*np.pi*1j*w[:,np. newaxis]*np.arange(N)/N),但没有任何改变。关于卷积中的模式,如果我改变模式,结果只会变得更糟......
-
你是正确的
1j在分子中,对不起。无论如何,让f成为真正唯一的信号的意义在于。然后,您可以使用np.fft.rfft,这样就无需考虑双面变换。还可以尝试使您的信号f比您的过滤器fil长得多,至少要长10 倍。这将消除开始和结束瞬态的影响,并使滤波器输出达到稳定状态。
标签: python scipy filtering signal-processing lowpass-filter