как оценить (мощность сигнала на заданной частоте) по сравнению с временем в питоне

Я ищу хороший способ оценить мощность сигнала (частота дискретизации, скажем, на частоте 10 кГц), против времени на одной частоте (скажем, 50 Гц). Я мог бы рассчитать спектрограмму, а затем взять ее часть на целевой частоте. Это кажется неэффективным, хотя, поскольку я только забочусь о мощности на одной частоте против времени. Я понимаю, что мощность на одной частоте равна нулю (в пределе), я бы хотел рассчитать мощность сигнала в пределах небольшого частотного интервала вокруг целевой частоты.

Мое текущее «решение» заключается в использовании функции mlab.specgram () Matplotlib, которая возвращает 2d-массив мощности, и я просто нарезаю его. Я не согласен с этим, потому что я не полностью доверяю функции mab.specgram (), поскольку для вычисления спектрограммы на разных сигналах (даже если они имеют одинаковую длину) требуется огромное количество времени.

Существует много способов сделать это. Одним сырым, но эффективным способом является применение полосового фильтра (на частоте 50 Гц), тем самым устраняя все остальные сигналы, а затем вычисляя RMS-мощность последних N выборок.

Другой – вы можете сделать оконный FFT, но на самом деле FFT – просто вычислить нужный бит. Окно может быть любым, что вы хотите (например, Kaiser с альфа-8). ДПФ одного бина – это всего лишь сумма продуктов сигнала с e ^ (i * n * w) (где w – 50 Гц при вашей частоте дискретизации, и n – итератор).

Вероятно, есть более простые способы. Это зависит от того, к чему вы пытаетесь быть устойчивым, насколько быстро движется сигнал и ожидаете ли вы шума или других сигналов в миксе. Если вы не пытаетесь выбрать сигнал из какофонии других людей, вам не нужно много ходить.