Как вы разделяете временной ряд на отдельные, даже сегменты? - PullRequest
0 голосов
/ 17 марта 2020

Я хочу выполнить кратковременное ручное преобразование Фурье. У меня есть простой временной ряд в форме волны косинуса. Я хочу выполнить кратковременное преобразование Фурье, разделив временные ряды на несколько равномерно распределенных сегментов, включающих перекрытие ... как мне это сделать?

это мой временной ряд:

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 равномерно расположенных сегментов?

1 Ответ

0 голосов
/ 18 марта 2020

Вот один из способов сделать это.

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]

Если ваши данные относительно малы и вам удобно хранить все windows в ОЗУ, затем вы можете продолжить следующим образом:

X = np.array([x[ist:ied] for ist, ied in zip(ists, ieds)]) 
# X.shape is (nwindows, Mt)

Сделав это, вы можете сгенерировать W оконную функцию (например, окно Ханнинга) как одномерный массив формы (Mt,), так что W*X будет транслироваться таким образом, что W применяется к каждому окну в X.

Я только что заметил, что термин "окно" используется в этом контексте с двумя значениями. Извините за путаницу.

...