Вопрос или проблема
У меня есть данные в реальном времени от датчиков, контролирующих насосы. Мне нужно проанализировать рабочий цикл насосов в частотной области. Я довольно забывчив в FFT, поэтому надеялся найти библиотеку на C++ или Python с простым API, принимающим временные ряды данных (т. е. ряд пар {временная метка, значение} с действительными числами) и возвращающим ряд частот, амплитуд и фаз.
Я нашел несколько пакетов, принимающих ряды комплексных чисел. Более того, их примерный код обычно использует случайные данные в качестве ввода, что усложняет интеграцию с производственным кодом. Решение на базе Matlab также было бы трудно интегрировать в мой код.
Один из пакетов, которые я нашел:
https://github.com/flatironinstitute/finufft
Я знаю, что проблема в недостатке моих знаний, но учитывая, что анализ данных с датчиков является такой актуальной темой сегодня, я был удивлен, осознав, что такую библиотеку так трудно найти.
Заранее спасибо за помощь.
В техническом вычислении на Python первое место, куда стоит обратиться за функциями, — это библиотеки Numpy и Scipy. Именно эти библиотеки позволяют заменить MATLAB на Python во многих случаях. Существуют набор функций Numpy для дискретных преобразований Фурье. Также для Scipy есть функции fft. Если данные не выбираются на регулярных интервалах, вы можете пересчитать их.
Ответ или решение
Для анализа временных рядов, получаемых от датчиков насосов, и преобразования их в частотную область с использованием ненормированного дискретного преобразования Фурье (ДПФ), можно воспользоваться различными библиотеками на Python или C++. Ниже приведены рекомендации по тому, как это сделать, с детальным описанием подходящих библиотек и методов.
Подходящие библиотеки:
1. SciPy (Python)
SciPy — это мощная библиотека для научных вычислений на Python. Она предлагает функции для выполнения ДПФ и работы с временными рядами.
- Используйте
scipy.fftpack
для выполнения ДПФ. Пример кода:import numpy as np from scipy.fft import fft, fftfreq
Ваши данные в формате {timestamp, value}
data = [(1, 0.0), (2, 1.0), (3, 0.0), (4, -1.0)] # пример данных
timestamps, values = zip(*data)
Применение ДПФ
N = len(values)
T = timestamps[1] – timestamps[0] # предположим, что данные равномерно распределены
yf = fft(values)
xf = fftfreq(N, T)[:N//2]
Получение амплитуд и фаз
amplitudes = 2.0/N * np.abs(yf[:N//2])
phases = np.angle(yf[:N//2])
Вывод результатов
for freq, amp, phase in zip(xf, amplitudes, phases):
print(f’Частота: {freq}, Амплитуда: {amp}, Фаза: {phase}’)
#### 2. Numpy (Python)
Если ваши данные поступают регулярными интервалами, вы можете использовать Numpy как альтернативу:
- Numpy также предоставляет функции для выполнения ДПФ через `numpy.fft`.
Пример кода будет аналогичен приведенному выше, однако вместо `scipy.fft` можно использовать `numpy.fft`.
#### 3. NumPy и SciPy для нерегулярных данных
Если ваши временные ряды нерегулярны, рекомендуется сначала ресамплировать их до равномерного интервала.
```python
from scipy.signal import resample
# Ресемплирование данных
desired_length = 100 # желаемое количество сэмплов
resampled_values = resample(values, desired_length)
# Выполнение ДПФ на ресамплированных данных
yf_resampled = fft(resampled_values)
# Остальной код остается прежним
4. Библиотеки на C++
Если вы предпочтете использовать C++:
- FFTW (Fastest Fourier Transform in the West): это библиотека для вычисления ДПФ с высокой производительностью и простым API. Вам потребуется выполнять конвертацию ваших данных в формат, который принимает FFTW.
Примерный код на C++ может выглядеть так:
#include <fftw3.h>
#include <vector>
int main() {
std::vector<double> values = {0.0, 1.0, 0.0, -1.0};
int N = values.size();
fftw_complex *in, *out;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
for (int i = 0; i < N; i++) {
in[i][0] = values[i]; // действительная часть
in[i][1] = 0.0; // мнимая часть
}
fftw_plan p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p); // выполняем расчет
// Теперь out содержит результаты преобразования Фурье
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
return 0;
}
Заключение
Существует множество библиотек, как на Python, так и на C++, которые могут помочь в анализе данных с датчиков. Выбор между ними зависит от ваших предпочтений в языке программирования и особенностей ваших данных. При использовании SciPy и NumPy вам также будет доступен широкий спектр инструментов для предобработки данных, что может быть полезно для достижения максимальной точности анализа.