使用Python对信号频率进行滤波

8

我尝试使用FFT过滤一些信号。 我正在处理的信号非常复杂,而我在这个领域并不是很有经验。 因此,我创建了一个简单的3Hz正弦波,并尝试切掉3Hz。

到目前为止,一切都很顺利。

import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fftfreq, irfft, rfft

t = np.linspace(0, 2*np.pi, 1000, endpoint=True)
f = 3.0 # Frequency in Hz
A = 100.0 # Amplitude in Unit
s = A * np.sin(2*np.pi*f*t) # Signal
dt = t[1] - t[0] # Sample Time

W = fftfreq(s.size, d=dt)
f_signal = rfft(s)

cut_f_signal = f_signal.copy()
cut_f_signal[(np.abs(W)>3)] = 0 # cut signal above 3Hz

cs = irfft(cut_f_signal)

fig = plt.figure(figsize=(10,5))
plt.plot(s)
plt.plot(cs)

我期望的结果 expected output 我得到的结果 Result 我不知道噪音来自哪里。 我认为这是一些基本的东西,但我不理解。 有人可以向我解释吗?
编辑
进一步信息
频率
yf = fft(s)
N = s.size
xf = np.linspace(0, fa/2, N/2, endpoint=True)
fig, ax = plt.subplots()
ax.plot(xf,(2.0/N * np.abs(yf[:N//2])))
plt.xlabel('Frequency ($Hz$)')
plt.ylabel('Amplitude ($Unit$)')
plt.show()

enter image description here

2个回答

6

您可以更改信号创建方式并使用采样频率:

fs = 1000
t = np.linspace(0, 1000 / fs, 1000, endpoint=False) # 1000 samples
f = 3.0 # Frequency in Hz
A = 100.0 # Amplitude in Unit
s = A * np.sin(2*np.pi*f*t) # Signal
dt = 1/fs

以下是完整代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fftfreq, irfft, rfft

fs = 1000
t = np.linspace(0, 1000 / fs, 1000, endpoint=False)
f = 3.0 # Frequency in Hz
A = 100.0 # Amplitude in Unit
s = A * np.sin(2*np.pi*f*t) # Signal
dt = 1/fs

W = fftfreq(s.size, d=dt)
f_signal = rfft(s)

cut_f_signal = f_signal.copy()
cut_f_signal[(np.abs(W)>3)] = 0 # cut signal above 3Hz

cs = irfft(cut_f_signal)

fig = plt.figure(figsize=(10,5))
plt.plot(s)
plt.plot(cs)

f = 3.0 Hz 且 (np.abs(W) >= 3) 时:

enter image description here

f = 1.0 Hz 时:

enter image description here

谢谢,那个很好用。我本来想改变信号,但频率(最后的图)看起来很好,所以我就保持原样了。 - Kev

3

关于为什么A方案比你的方案更好,以下是一些额外信息:

A方案的模型不包括任何非整数频率,过滤掉高频率后的结果如下:

1.8691714842589136e-12 * exp(2*pi*n*t*0.0)
1.033507502555532e-12 * exp(2*pi*n*t*1.0)
2.439774536202658e-12 * exp(2*pi*n*t*2.0)
-8.346741339115191e-13 * exp(2*pi*n*t*3.0)
-5.817427588021649e-15 * exp(2*pi*n*t*-3.0)
4.476938066992472e-14 * exp(2*pi*n*t*-2.0)
-3.8680170177940454e-13 * exp(2*pi*n*t*-1.0)

您的解决方案包括以下组件:

...

177.05936105690256 * exp(2*pi*n*t*1.5899578814880346)
339.28717376420747 * exp(2*pi*n*t*1.7489536696368382)
219.76658524130005 * exp(2*pi*n*t*1.9079494577856417)
352.1094590251063 * exp(2*pi*n*t*2.0669452459344453)
267.23939871205346 * exp(2*pi*n*t*2.2259410340832484)
368.3230130593005 * exp(2*pi*n*t*2.384936822232052)
321.0888818355804 * exp(2*pi*n*t*2.5439326103808555)

...

请参考这个问题,了解清零FFT频率分量可能带来的副作用。

同意将FFT的归零处理视为不良做法。 - Mihayl
谢谢,我会看一下的。我绘制了ifft信号的频率图,看起来相当奇怪,现在我知道原因了 :) - Kev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接