在python中减少嘈杂的图形和额外的驼峰

时间:2016-05-08 12:01:09

标签: python matplotlib noise

这是数据文件:

https://jsfiddle.net/83ygso6u/

很抱歉在jsfiddle发布它...我不知道还有什么东西可以托管它。

无论如何,应该忽略第二列。

以下是代码和图表:

import pylab as plb
import math
from pylab import *
import matplotlib.pyplot as plt

data = plb.loadtxt('title_of_datafile.txt')  
x = data[:,0]*1000
y= data[:,2]

plt.figure()

plt.title('Some_Title',fontsize=35, y=1.05)
plt.xlabel('Frequency (Hz)',fontsize=30)
plt.ylabel('dBu',fontsize=30)

plt.plot(x,y,'k-', label='Data')

plt.xticks(fontsize = 25, y=-0.008)
plt.yticks(fontsize = 25, x=-0.008)
plt.show()

enter image description here

所以你可以看到这个信号非常嘈杂,但它在4500 Hz和5500 Hz附近有两个明显的峰值。

我一直在网上搜索,并且真的遇到过任何可以帮助我的事情。

如何在python中提取这些峰值和/或清除信号?

1 个答案:

答案 0 :(得分:0)

我设法找到了解决方案。这是带有结果图的脚本。

脚本:

import pylab as plb
import math
from pylab import *
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy import signal
import peakutils
from peakutils.plot import plot as pplot

data = plb.loadtxt('data_file_name')  
x = data[:,0]*1000
y= data[:,2]

y1 = sp.signal.medfilt(y,431) # remove noise to the signal

indexes = peakutils.indexes(y1, thres=0.00005, min_dist=1400) #determine peaks
x_new = x[indexes]

plt.figure()
plt.subplot(1,2,1)

plt.title('some_title_1',fontsize=35, y=1.05)
plt.xlabel('Frequency (Hz)',fontsize=30)
plt.ylabel('Signal (dBu)',fontsize=30)
plt.plot(x,y,'r-', label='Raw Data')
plt.plot(x,y1,'b-', label='Cleaned up Signal')
plt.plot(x_new[3:6],y1[indexes][3:6],'k^',markersize=10, label='Peaks')
plt.xticks(fontsize = 25, y=-0.008)
plt.yticks(fontsize = 25, x=-0.008)
plt.legend(loc=1,prop={'size':30})

plt.subplot(1,2,2)
for i,j in zip(x_new[3:6], y1[indexes][3:6]):
    plt.annotate(str(i)+ " Hz",xy=(i,j+0.5),fontsize=15)
plt.title('some_title_2',fontsize=35, y=1.05)
plt.xlabel('Frequency (Hz)',fontsize=30)
plt.ylabel('Signal (dBu)',fontsize=30)
plt.plot(x,y,'r-', label='Data')
plt.plot(x,y1,'b-')
plt.plot(x_new[3:6],y1[indexes][3:6],'k^',markersize=10)
plt.xticks(fontsize = 25, y=-0.008)
plt.yticks(fontsize = 25, x=-0.008)
plt.xlim([3000, 6000])
plt.ylim([-90, -75])
plt.subplots_adjust(hspace = 0.6)
plt.show()

enter image description here