Расчет БПФ с оконным смещением и полосой пропускания

У меня есть список с 1000 показаниями датчиков (частота дискретизации = 10 Гц):

sensor = [100,100,200,...,100]

Мне нужно получить спектральный анализ подмножеств этого списка с помощью оконной функции (то есть окна Кайзера).

Итак, я хочу получить список, в котором БПФ вычисляется для нескольких субдискретизаторов этих данных (скажем, 100 результатов), с окном смещения из 50 показаний ( перекрытие 25 показаний в каждом пределе) и, таким образом, получение 20 результатов в частотной области.

Затем я хочу применить функцию взвешивания полосы пропускания для 3 полос (скажем, 1-2 Гц, 2-4 Гц, 4-8 Гц).

Конечным результатом должен быть 2D-список, где в первом измерении представлены «полосы», а во втором представлены значения амплитуды (действительная часть) для этой полосы.

bands = [[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],[1,...],[1,...]]

Может кто-нибудь помочь мне?

EDITED: хорошо, давайте разделим проблему:

1) Дан список = [1,2,3,4,5,6,7,8]. Как я могу создать 2D-список такого типа: list2D = [[1,2,3,4], [3,4,5,6], [5,6,7,8]]? Это первая проблема при создании окна смещения.

2) Для каждого элемента (1-е измерение) этого списка 2D: как я могу провести анализ БПФ вместе с оконной функцией (БПФ, которое больше учитывает средние значения)?

3) Как я могу сделать полосовой фильтр для каждого результата БПФ, например, преобразовать дискретные результаты из реальной части спектра в среднее значение для частотного интервала?


person kairos    schedule 26.05.2014    source источник
comment
Возможно, вы захотите взглянуть на OpenCV. Я не использовал его с Python, но БПФ (или, скорее, дискретное преобразование Фурье) в C / C ++ кажется довольно справедливым.   -  person ilent2    schedule 26.05.2014
comment
проблема в том, что весь мой другой код разработан на Python (а их много) ... Я уже работаю с numpy и scipy, чтобы это сделать ...   -  person kairos    schedule 26.05.2014
comment
Я почти уверен, что для OpenCV есть привязка / библиотека Python, но я ее не пробовал.   -  person ilent2    schedule 26.05.2014
comment
Посмотрите, например, здесь для библиотек: stackoverflow.com/q/6363154/2379410 Кроме того, может кто-нибудь мне помочь, слишком широко, и вам нужно чтобы уточнить свой вопрос.   -  person    schedule 26.05.2014
comment
хватит моего последнего издания? пожалуйста, дайте мне мета-помощь, чтобы я мог еще больше уточнить свои сомнения ..   -  person kairos    schedule 26.05.2014
comment
Хорошая редакция, я думаю, что на этот вопрос намного проще ответить. Подробнее о том, как задавать вопросы: stackoverflow.com/help/how-to-ask Подробнее о части 1) из ваш вопрос, вы можете изучить это: stackoverflow.com/q/4923617/2379410   -  person    schedule 27.05.2014


Ответы (1)


Что касается частей 1) и 2), обратите внимание на следующий пример:

import numpy as np
import scipy as sci
from scipy.signal import blackman
from scipy.signal import hanning

a = np.array([1,2,3,4,5,6,7,8])


b = np.empty([2, int(len(a)/2)], dtype=complex)
b[0,:] = a[0:int(len(a)/2)]
b[1,:] = a[(int(len(a)/2)-1):-1]

res = np.empty([2, int(len(a)/2)], dtype=complex)

# create blackman window
w = blackman(int(len(a)/2))
# you could also use a hanning window:
# w = hanning(int(len(a)/2))

for i in range(2):
    res[i,:] = sci.fftpack.fft(b[i,:] * w)

Это то, что ты хотел? Что касается части 3) Я не совсем уверен, что вам нужно.

person Community    schedule 26.05.2014
comment
Это почти идеально! Большое спасибо! Для 3) я хочу получить среднюю амплитуду всех частот в диапазоне (т.е. среднее значение амплитуды всех частот между 1 Гц и 4 Гц) - person kairos; 27.05.2014
comment
Для этого вы берете массив res, суммируете np.abs (res [i, j]) ** 2 и делите на количество интервалов, по которым вы суммируете. Правильно? Конечно, прежде всего вам нужно определить ось времени, иначе говорить о частоте в Гц все равно не имеет смысла. Размер шага по частоте - по крайней мере, пропорционален - df = 2 * np.pi / (int (len (a) / 2) * dt), где dt - размер временного шага, а int (len (a) / 2) количество точек во временном массиве. - person ; 27.05.2014
comment
Также обратите внимание, что если ваш сигнал во временной области реален, то сигнал БПФ будет симметричным. Это означает, что вы получаете положительную и отрицательную частоты. Просто выберите одну из положительных сторон, и тогда вы готовы к части 3) - person ; 27.05.2014
comment
ДА! Большое спасибо! Это сработало безупречно! Я использовал значение abs для БПФ. - person kairos; 27.05.2014