【问题标题】:How to find the correct magnitude with scipy.signal.spectogram如何使用 scipy.signal.spectrogram 找到正确的幅度
【发布时间】: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。

标签: python scipy fft


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    相关资源
    最近更新 更多