github主页:https://github.com/Taot-chen
给定均值滤波窗口长度,对窗口内数据求均值,作为窗口中心点的数据的值,之后窗口向后滑动1,相邻窗口之间有重叠;边界值不做处理,即两端wid_length//2长度的数据使用原始数据。
'''
均值滤波降噪:
函数ava_filter用于单次计算给定窗口长度的均值滤波
函数denoise用于指定次数调用ava_filter函数,进行降噪处理
'''
def ava_filter(x, filt_length):
N = len(x)
res = []
for i in range(N):
if i <= filt_length // 2 or i >= N - (filt_length // 2):
temp = x[i]
else:
sum = 0
for j in range(filt_length):
sum += x[i - filt_length // 2 + j]
temp = sum * 1.0 / filt_length
res.append(temp)
return res
def denoise(t, x, n, filt_length):
for i in range(n):
res = ava_filter(x, filt_length)
x = res
return (t, res)
任意m ∗ n 的矩阵A可以分解为如下形式:
A=U·sigema·V(T)
其中U、V分别是左右奇异矩阵,sigema是对角矩阵,对角线上的元素是A的奇异值从大到小的排列。
奇异值表示的是原矩阵在其对应特征向量分量上的权重,奇异值越大,对应的特征向量在原矩阵中的权重越大。
如果前k(k<r,r是原矩阵的秩)个奇异值数值较大,说明前k个奇异值对应的信息是原矩阵的主成分。那么可以使前k个奇异值不变,其余奇异值设置成0,再重构原矩阵,实现降噪。
import numpy as np
# import random
import matplotlib.pyplot as plt
import sys
import os
def denoise(t, x):
# 1、数据预处理
res = int(np.sqrt(len(x)))
xr = x[:res * res]
delay = t[:res * res]
# 2、一维数组转换为二维矩阵
x2list = []
for i in range(res):
x2list.append(xr[i * res:i * res + res])
x2array = np.array(x2list)
# 3、奇异值分解
U, S, V = np.linalg.svd(x2array)
S_list = list(S)
## 奇异值求和
S_sum = sum(S)
##奇异值序列归一化
S_normalization_list = [x / S_sum for x in S_list]
# 4、画图
X = []
for i in range(len(S_normalization_list)):
X.append(i + 1)
fig1 = plt.figure().add_subplot(111)
fig1.plot(X, S_normalization_list)
fig1.set_xticks(X)
fig1.set_xlabel('Rank', size=15)
fig1.set_ylabel('Normalize singular values', size=15)
plt.show()
# 5、数据重构
K = 2 ## 保留的奇异值阶数
for i in range(len(S_list) - K):
S_list[i + K] = 0.0
S_new = np.mat(np.diag(S_list))
reduceNoiseMat = np.array(U * S_new * V)
reduceNoiseList = []
for i in range(len(x2array)):
for j in range(len(x2array)):
reduceNoiseList.append(reduceNoiseMat[i][j])
# 6、返回结果
return (delay, reduceNoiseList)
将信号通过小波变换后,信号产生的小波系数含有信号的重要信息,将信号经小波分解后小波系数较大,噪声的小波系数较小,并且噪声的小波系数要小于信号的小波系数,通过选取一个合适的阀值,大于阀值的小波系数被认为是有信号产生的,应予以保留,小于阀值的则认为是噪声产生的,置为零从而达到去噪的目的。
#模块调用
import numpy as np
import math
import pywt
#封装成函数
def sgn(num):
if (num > 0):
return 1.0
elif (num == 0):
return 0.0
else:
return -1.0
def wavelet_noising(new_df):
data = new_df
data = data.values.T.tolist() # 将np.ndarray()转为列表
w = pywt.Wavelet('sym8')
# [ca3, cd3, cd2, cd1] = pywt.wavedec(data, w, level=3) # 分解波
[ca5, cd5, cd4, cd3, cd2, cd1] = pywt.wavedec(data, w, level=5) # 分解波
length1 = len(cd1)
length0 = len(data)
Cd1 = np.array(cd1)
abs_cd1 = np.abs(Cd1)
median_cd1 = np.median(abs_cd1)
sigma = (1.0 / 0.6745) * median_cd1
lamda = sigma * math.sqrt(2.0 * math.log(float(length0), math.e))
usecoeffs = []
usecoeffs.append(ca5) # 向列表末尾添加对象
#软硬阈值折中的方法
a = 0.5
for k in range(length1):
if (abs(cd1[k]) >= lamda):
cd1[k] = sgn(cd1[k]) * (abs(cd1[k]) - a * lamda)
else:
cd1[k] = 0.0
length2 = len(cd2)
for k in range(length2):
if (abs(cd2[k]) >= lamda):
cd2[k] = sgn(cd2[k]) * (abs(cd2[k]) - a * lamda)
else:
cd2[k] = 0.0
length3 = len(cd3)
for k in range(length3):
if (abs(cd3[k]) >= lamda):
cd3[k] = sgn(cd3[k]) * (abs(cd3[k]) - a * lamda)
else:
cd3[k] = 0.0
length4 = len(cd4)
for k in range(length4):
if (abs(cd4[k]) >= lamda):
cd4[k] = sgn(cd4[k]) * (abs(cd4[k]) - a * lamda)
else:
cd4[k] = 0.0
length5 = len(cd5)
for k in range(length5):
if (abs(cd5[k]) >= lamda):
cd5[k] = sgn(cd5[k]) * (abs(cd5[k]) - a * lamda)
else:
cd5[k] = 0.0
usecoeffs.append(cd5)
usecoeffs.append(cd4)
usecoeffs.append(cd3)
usecoeffs.append(cd2)
usecoeffs.append(cd1)
recoeffs = pywt.waverec(usecoeffs, w)
return recoeffs
def denoise(x, data):
data_denoising = wavelet_noising(data) #调用小波去噪函数
return (x, data_denoising)
通过改变数据的 bin size,来达到降低噪声的目的。
改变 bin size 的时候,会导致数据长度减小,降低数据的分辨率。为了最大限度的较少原数据的有效信息的损失,在改变 bin size 的过程中,被抛弃的数据的信息也会保留在保留下来的数据中,具体实现思路是:在给定 bin size = n 的情况下,将 n 长度的数据取平均值作为该区域中心点的数据的值。之后窗口向后滑动 n ,相邻两个窗口之间不重叠。
# 修改现有数据的bin:
# 即bin=3时:每三个数据,只取中间的一个数据,且这个数据的值为三个数据的平均值
# 在对纵轴进行如上处理的时候,横轴也进行相应的抽值处理:
# 第一个数据不要,第二个数据开始,每隔两个数据quyige
# 进行上述处理之前对数据进行截断处理,使数据长度为3的倍数+1,横轴数据和纵轴数据都进行截断处理
# bin=n的时候,前n//2个数据不要,后面每隔n-1个数据取一个数据,数据长度截断为n的倍数+n//2
def ch_bin(x, y, bin):
N = len(x)
relen = N // bin * bin
re_x = x[:relen]
re_y = y[:relen]
res_x = []
res_y = []
i = 0
while (True):
if i <= bin // 2:
i += 1
continue
else:
res_x.append(re_x[i])
i += bin
if i >= relen - 1:
break
num = relen // bin
for i in range(num):
sum = 0
for j in range(bin):
sum += re_y[j + i * bin]
res_y.append(sum * 1.0 / bin)
if bin == 3:
return (res_x, res_y[1:])
else:
return (res_x, res_y)
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案