当前位置: 首页 > 知识库问答 >
问题:

如何对保留尖峰的信号进行降采样?

邢弘业
2023-03-14

我正在分析一个在200Hz采样6-8秒的信号,重要的部分是尖峰,最大持续1秒。比如地震...

我必须将信号的采样率降低2倍。我试过:

from scipy import signal

signal.decimate(mysignal, 2, ftype="fir")
signal.resample_poly(mysignal, 1, 2)

我得到了相同的结果与这两个函数:信号被重新采样,但尖峰,积极和消极的,是减少。

我搞错了函数,或者我必须通过一个定制的FIR滤波器?

共有3个答案

濮金鑫
2023-03-14

如果你对混淆现象不太在意,你可以只取每秒钟(第N次)样本的最大值。

def take(N, samples):
    it = iter(samples)
    for _ in range(len(samples)/N):
        yield max(it.next() for _ in range(N))

加强这一点:

import random
random.seed(1)

a = [random.gauss(10,3) for _ in range(100)]

for c in take(5, a):
    print c
牟稳
2023-03-14

如果您的硬件支持,您可以以尽可能高的频率采样,但只能在达到最小振幅差或时间差时保存一个点。这样,您的实际数据点将在任一标准上过滤。当信号没有任何变化时,你就有了你想要的采样率,峰值也仍然被记录。

假设数据包含恒定采样率的采样点。在该算法结束时,保存的列表将包含数据的所有重要[时间戳,sample_point]条目:

DIVIDER = 5
THRESHOLD = 1000

saved = [ [0, data[0]] ]

for i in range(1, len(data)):
    if( (i % DIVIDER == 0) || (abs(data[i] - data[i - 1]) > THRESHOLD) ):
        saved.append([ i, data[i] ])

除了查看两个采样点之间的振幅差异之外,您还可以保存位于某个振幅之上或之下的所有数据点,并在这段简单的代码中进行微小更改。

杜凯
2023-03-14

笔记

如果信号的频率达到采样频率的极限,则下采样将始终损坏信号(奈奎斯特-香农采样定理)。在您的情况下,您的尖峰类似于非常高的频率信号,因此您还需要非常高的采样频率。

(例子:你有3个点,中间一个有尖峰。你想把它向下采样到2点。钉子放哪里?没有地方,因为你用完了样品。)

然而,如果你真的想要下采样信号,并且仍然想要保留(或多或少准确地)特定点(在你的情况下尖峰),你可以尝试下面的态度,它“保存”你的尖峰,下采样信号,然后才应用“保存”尖峰对应的下采样信号位置。

采取的步骤:

1) 获得峰值,或者换句话说,局部最大值(或最小值)。

例如:熊猫找到本地最大值和最小值

2) 对信号进行下采样

3)与这些尖峰你从1),替换相应的下采样值

(计算信号将被破坏的事实。如果不丢失由一个或两个点表示的尖峰,则无法减少采样)

编辑

例证

这是如何保持尖峰的例子。这只是一个例子,因为它现在对负值不起作用

import numpy as np
import matplotlib.pyplot as plt
from collections import deque


t = np.arange(1000)/100
y = np.sin(t*2*3.14)
y[150]=5
y[655]=5
y[333]=5
y[250]=5

def downsample(factor,values):
    buffer_ = deque([],maxlen=factor)
    downsampled_values = []
    for i,value in enumerate(values):
        buffer_.appendleft(value)
        if (i-1)%factor==0:
            #Take max value out of buffer
            # or you can take higher value if their difference is too big, otherwise just average
            downsampled_values.append(max(buffer_))
    return np.array(downsampled_values)

plt.plot(downsample(10,y))
plt.show()
 类似资料:
  • 问题内容: 在类声明中,<>尖括号和在swift内部声明的参数有什么用?像这样: 问题答案: 它使类通用。Swift标准库没有很多泛型类的示例,但是它具有一些非常著名的泛型结构和枚举: 在 Swift编程语言的 “泛型” 下阅读有关泛型的更多信息。

  • 问题内容: 给定一个记录某些书籍使用情况的数据框,如下所示: 我需要获取所有书籍的数量,保留其他列并获取以下内容: 如何才能做到这一点? 谢谢! 问题答案: 您需要以下内容: 在您的情况下,“名称”,“类型”和“ ID”列的值匹配,因此我们可以对它们进行调用,然后单击。 另一种方法是使用添加“ Count”列,然后调用:

  • 问题内容: 我正在尝试在Python中以10Khz采样信号。尝试运行此代码(1KHz)时没有问题: 当我尝试减少时间时,它开始超过一秒(在我的计算机中,在10e-6时为1.66s)。是否可以在Python中以特定频率运行采样函数? 问题答案: 您没有考虑代码的开销。每次迭代,此错误加起来并歪曲“时钟”。 我建议改为使用一个循环),并计算从下一个_参考_ 时刻开始的睡眠时间,这样就不会出现不可避免的

  • 问题内容: 我有一些代码示例要在HTML文档中发布。我是用,标记包装它们,但是我希望它们的样式是这样的保留换行符。我也可以用标签,但我更喜欢使用CSS。 我已经在IE7中尝试了以下内容 这可能吗? 问题答案: 检查doctype是否有效并在第一行。也许它滑进了quirks mode??

  • 数据采集也即埋点,它是精细化分析的第一步。数据的准确性、可扩展性以及技术人员的高效性依次被视为数据采集的三大要点。埋点,保证了数据的准确性;事件、属性、值的结构保证了数据的可扩展性;埋点文档也保证了团队成员协同的高效性。 为了帮助诸葛io的客户能够准确、高效的采集数据,我们建议您: 一、数据分析需求梳理 数据采集切忌大而全,产品不断迭代,数据分析的需求也是随着产品不断迭代的,明确长远阶段和当前阶段

  • 问题内容: 我正在使用集成从Python 2.7驱动MS Excel。我注意到一个奇怪的事情:当我运行以下代码时: 的过程中出现的过程列表(视图中使用Windows任务管理器或上)按预期方式。然后,我会做所有我不需要做的事情。但是,当我关闭Excel时: 即使我关闭了启动它的Python解释器,该过程仍然会持续(这种情况很有意义,因为Excel在不同的过程中运行,但可以肯定)。我发现终止此过程的唯