Как правильно интерпретировать спектр сигнала?

Рейтинг: 0Ответов: 0Опубликовано: 12.02.2023

Я написал код для построения спектрограммы с помощью 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

Ответы

Ответов пока нет.