我尝试使用scipy.signal.spectogram创建幅度的频谱图。
不幸的是我没有使它工作。

我的测试信号应该是频率为400 Hz,振幅为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))

最佳答案

严格实时域信号在频域中是共轭对称的。例如将同时出现在复杂结果FFT的正半部和负半部(或上半部)中。

因此,您需要将FFT结果的两个“一半”相加在一起,以获得总能量(Parseval定理)。或仅是双面,因为复共轭的大小相等。

关于python - 如何使用scipy.signal.spectrogram找到正确的幅度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58349909/

10-14 14:22