我想从信号中删除一个频率(一个峰值)并在没有它的情况下绘制我的函数。在fft之后我发现频率和振幅,我不知道我现在需要做什么。例如,我想删除我的最高峰(在图上用红点标记)。
file.edit("~/.Rprofile")
答案 0 :(得分:5)
您可以设计一个带阻滤波器:
wc = freq[np.argmax(amplitude)] / (0.5 / dt)
wp = [wc * 0.9, wc / 0.9]
ws = [wc * 0.95, wc / 0.95]
b, a = signal.iirdesign(wp, ws, 1, 40)
f = signal.filtfilt(b, a, f)
答案 1 :(得分:2)
我想要这样的东西。我知道有更好的解决方案,但我的黑客工作。 :)第二个峰被删除。
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import rfft, irfft, fftfreq, fft
import scipy.fftpack
# Number of samplepoints
N = 500
# sample spacing
T = 0.1
x = np.linspace(0.0, N*T, N)
y = 5*np.sin(x) + np.cos(2*np.pi*x)
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
#fft end
f_signal = rfft(y)
W = fftfreq(y.size, d=x[1]-x[0])
cut_f_signal = f_signal.copy()
cut_f_signal[(W>0.6)] = 0
cut_signal = irfft(cut_f_signal)
# plot results
f, axarr = plt.subplots(1, 3)
axarr[0].plot(x, y)
axarr[0].plot(x,5*np.sin(x),'g')
axarr[1].plot(xf, 2.0/N * np.abs(yf[:N//2]))
axarr[1].legend(('numpy fft * dt'), loc='upper right')
axarr[1].set_xlabel("f")
axarr[1].set_ylabel("amplitude")
axarr[2].plot(x,cut_signal)
axarr[2].plot(x,5*np.sin(x),'g')
plt.show()