Python 如何将时间序列分割成独立的、甚至是分段的?

Python 如何将时间序列分割成独立的、甚至是分段的?,python,numpy,scipy,signals,fft,Python,Numpy,Scipy,Signals,Fft,我想执行手动短时傅里叶变换。我有一个简单的余弦波形式的时间序列。我想通过将时间序列分割成多个包含重叠的等距段来执行短时傅里叶变换。。。我该怎么做 这是我的时间序列: fs = 10e3 # Sampling frequency N = 1e5 # Number of samples time = np.arange(N) / fs x = np.cos(5*time) # Some random audio wave # x.shape gives (100000,) 我如何分割成10个等间距

我想执行手动短时傅里叶变换。我有一个简单的余弦波形式的时间序列。我想通过将时间序列分割成多个包含重叠的等距段来执行短时傅里叶变换。。。我该怎么做

这是我的时间序列:

fs = 10e3 # Sampling frequency
N = 1e5 # Number of samples
time = np.arange(N) / fs
x = np.cos(5*time) # Some random audio wave
# x.shape gives (100000,)

我如何分割成10个等间距的段呢?

这里有一种方法

import numpy as np

def get_windows(n, Mt, olap):
    # Split a signal of length n into olap% overlapping windows each containing Mt terms 
    ists = []
    ieds = []

    ist = 0
    while 1:
        ied = ist + Mt
        if ied > n:
            break
        ists.append(ist)
        ieds.append(ied)
        ist += int(Mt * (1 - olap/100))
    return ists, ieds

n = 100
x = np.arange(n)

ists, ieds = get_windows(n, Mt=20, olap=50) # windows of length 20 and 50% overlap
for ist, ied in zip(ists, ieds):
    print(x[ist:ied])
结果:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29]
[20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39]
[30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49]
[40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59]
[50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69]
[60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79]
[70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89]
[80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]
如果您的数据相对较小,并且您对在RAM中存储所有窗口感到满意,那么您可以按如下方式继续:

X = np.array([x[ist:ied] for ist, ied in zip(ists, ieds)]) 
# X.shape is (nwindows, Mt)
通过这样做,您可以将
W
窗口函数(例如,汉宁窗口)生成为1D形状数组(Mt),以便
W*X
将以某种方式进行广播,从而
W
应用于
X
中的每个窗口


我刚刚注意到术语“窗口”在这个上下文中有两种含义。很抱歉造成混淆。

您能澄清一下预期的输出是什么吗?查找的术语称为窗口或窗口。。。每组样本都是一个窗口。。。您可以编写一个循环来定义一个具有开始和结束索引的窗口,然后稍微滑动此窗口,并在下一个循环迭代中重复,直到您滑出源元素的结尾。。。通常情况下,滚动自己的列表比花时间查找库更有效率。不过,关于将列表保存为拆分数组,我有一个问题?如何存储拆分数据?因为我正在尝试对其执行短时傅里叶变换,我想首先应用一个锥化函数等。谢谢!