首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFT:在信号中查找和处理含噪声的50 in信号

FFT:在信号中查找和处理含噪声的50 in信号
EN

Stack Overflow用户
提问于 2015-06-15 15:30:56
回答 1查看 1.2K关注 0票数 2

我有噪声的数据 (峰值周期1.8s,2048桶每周期),我想计算频率和删除50赫兹。我很确定我要找的频率是50赫兹,因为我用originlab找到它。

当我尝试在python中做同样的事情时,平均峰值是~47 is。我正在看教程和例子,但是结果还是一样的。

代码语言:javascript
复制
import numpy as np
from scipy.fftpack import fft
from scipy.fftpack import fftfreq
import matplotlib.pyplot as plt
data = np.loadtxt('3.dat', comments="#")
t = data[:, 0]
y = data[:, 2]
len_data = len(data)
bins = 2048
plt.figure(figsize=(7, 9))
plt.subplot(211)
plt.plot(t, y, 'b-')
plt.xlabel("time[sec]")
plt.ylabel("original signal")
plt.subplot(212)
F = fft(y)
freq = fftfreq(len(t), (t[1] - t[0]))
ipos = np.where(freq > 0)
freqs = freq[ipos]
mags = np.abs(F[ipos])
plt.plot(freqs, mags, 'b-')
plt.xlabel("freq")
plt.ylabel("POWER")
plt.savefig('stoc.png')
plt.show()

有人能帮我修一下吗?

我必须重新回答关于切断噪音的问题。当我减去频率时,信号幅值会明显降低。这是正确的吗?

代码语言:javascript
复制
data = np.loadtxt('3.dat', comments="#")
t = data[:, 0]
phase = data[:, 1]
y = data[:, 2]
pulse_no = data[:, 3]
len_data = len(data)
bins = 2048
ti = np.linspace(t[0], t[-1], len_data)
yi = np.interp(ti, t, y)
t, y = ti, yi

plt.figure(figsize=(10, 10))
plt.subplot(511)
plt.plot(t, y, 'b-')
plt.xlabel("time[sec]")
plt.ylabel("original signal")
plt.subplot(512)
F = fft(y)
N = len(t)
w = fftfreq(N, (t[1] - t[0]))
ipos = np.where(w > 0)
freq = w[ipos]
mags = abs(F[ipos])
plt.plot(freq, mags)
ip = np.where(F > 0)[0]
Fs = np.copy(F)
yf = ifft(Fs)
ip = np.where(F > 0)[0]
Ff = np.copy(F)
Ff[ip > ip[[(181)]]] = 0
Ff[ip < ip[[(175)]]] = 0
magsf = abs(Ff[ipos])
plt.plot(freq, magsf, 'r-')
plt.subplot(513)
Fr = mags - magsf
plt.plot(freq, Fr)
plt.subplot(514)
yf = ifft(Ff)
yr = ifft(Fr)
plt.plot(t, yf)
plt.subplot(515)
flux = y - np.real(yf)
plt.plot(t, flux)
plt.plot(t, y)
plt.show()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-15 16:33:07

你的问题似乎是你的时间网格不均匀-间隔:

代码语言:javascript
复制
In [83]: d = np.diff(data[:,0])

In [84]: d
Out[84]: 
array([ 0.0006144 ,  0.0006144 ,  0.00049152, ...,  0.0006144 ,
        0.0006144 ,  0.00049152])

如果我在时间上将这些值内插到一个常数间距:

代码语言:javascript
复制
data = np.loadtxt('3.dat', comments="#")
t = data[:, 0]
y = data[:, 2]
len_data = len(data)

ti = np.linspace(t[0], t[-1], len_data)
yi = np.interp(ti, t, y)
t, y = ti, yi

峰值为50赫兹:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30849134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档