Как найти правильную величину с scipy.signal.spectogram - PullRequest
2 голосов
/ 12 октября 2019

Я попытался создать спектрограмму величин, используя scipy.signal.spectogram. К сожалению, у меня не получилось.

Мой тестовый сигнал должен быть синусоидальным с частотой 400 Гц и амплитудой 1. Результат для величины спектрограммы, похоже, равен 0,5 вместо 1,0. Я понятия не имею, в чем может быть проблема.

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# 2s time range with 44kHz
t = np.arange(0, 2, 1/44000)

# test signal: sine with 400Hz amplitude 1
x = np.sin(t*2*np.pi*440)

# spectogram for spectrum of magnitudes
f, t, Sxx = signal.spectrogram(x,
                               44000,
                               "hanning",
                               nperseg=1000,
                               noverlap=0,
                               scaling="spectrum",
                               return_onesided=True,
                               mode="magnitude"
                              )

# plot last frequency plot
plt.plot(f, Sxx[:,-1])
print("highest magnitude is: %f" %np.max(Sxx))

1 Ответ

1 голос
/ 12 октября 2019

Строго в реальном времени сигнал домена является сопряженным симметричным в частотной области. Например, появится в положительной и отрицательной (или верхней) половине комплексного результата БПФ.

Таким образом, вам нужно сложить вместе две "половины" результата БПФ, чтобы получить полную энергию (теорема Парсеваля). Или просто удвоить одну сторону, поскольку комплексные конъюгаты имеют равные величины.

...