如何从信号中删除频率

时间:2016-09-30 20:46:00

标签: python numpy math fft

我想从信号中删除一个频率(一个峰值)并在没有它的情况下绘制我的函数。在fft之后我发现频率和振幅,我不知道我现在需要做什么。例如,我想删除我的最高峰(​​在图上用红点标记)。

file.edit("~/.Rprofile")

2 个答案:

答案 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()

enter image description here

enter image description here