Как правильно интерпретировать спектр сигнала?
Я написал код для построения спектрограммы с помощью fft и нарисовал его.
Сверху на графике - анализируемый сигнал, снизу - его спектр, по оси Ох частоты в Герцах, по оси Оу - амплитуда.
Визуально кажется, что в анализируемом сигнале нет низких частот с большой амплитудой, но спектр выдаёт большие значения амплитуды для волн с низкой частотой. Например, частоте 1 Гц, то есть волне длиной равной длине сигнала, на спектре соответствует значение амплитуды выше 400 у.е., однако на сигнале волна с такой частотой не наблюдается. Как это объяснить? Верен ли полученный график? И если нет, какие изменения нужно внести в код?
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft
def data_prepearing(path, dtype):
# функция для корректного считывания данных
data = np.fromfile(path, dtype='uint16')
data = data.astype(dtype)
data *= -1
return data
whole_signal = data_prepearing(path, 'float32') #ссылка на файл с данными ниже
N = whole_signal.size
t, dt = np.linspace(0, 1, N, retstep=True)
sfft = fft(whole_signal)
sfft = sfft[1:whole_signal.size//2]
Ampls = 2 * np.sqrt(sfft.real**2 + sfft.imag**2) / N
freqs = np.arange(N) / (N * dt)
freqs = freqs[1:N//2]
fig, ax = plt.subplots(nrows=2, figsize=(50, 35))
ax[0].tick_params(labelsize=40)
ax[0].plot(t, whole_signal)
ax[0].set_xlim(0,1)
ax[1].plot(freqs, Ampls, c='orange', linewidth=3)
ax[1].tick_params(labelsize=40)
ax[1].set_xlim(0, 10000)
ax[1].set_xticks(np.arange(0, 10000, step=500))
ax[1].grid()
данные: файл с данными на dropbox
Источник: Stack Overflow на русском