【发布时间】:2020-02-09 11:49:04
【问题描述】:
我尝试使用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))
【问题讨论】:
-
这是复数 FTransform (e^(i \omega t) 的一个特征。您会得到余弦和正弦项。平方后,您会看到实际频率和负频率的正幅度。(试试
return_onesided=False)。所以在你的情况下,你只能看到一半的强度(FFT 保留能量,所以你只是没有显示一半)。 -
@roadrunner66:所以,对于非复杂信号,我可以假设“第二面”是镜像的,我可以将幅度加倍?!?对于复杂信号(在我的情况下不相关),我会为每个时间片添加翻转的一半频谱图?像 'code' Qxx = np.add(np.array_split(Sxx,2)[0][1:],np.flip(np.array_split(Sxx,2)[1]))
-
是的,请参阅下面的@hotpaw2。