【问题标题】:scipy.signal.spectrogram frequency resolutionscipy.signal.spectrogram 频率分辨率
【发布时间】:2018-07-12 23:20:36
【问题描述】:

scipy.signal.spectrogram 计算信号的频谱图,但我看不到增加此频谱图频率分辨率的选项。 鉴于documentation 提供的代码,如何实现?

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

fs = 10e3
N = 1e5
amp = 2 * np.sqrt(2)
noise_power = 0.01 * fs / 2
time = np.arange(N) / float(fs)
mod = 500*np.cos(2*np.pi*0.25*time)
carrier = amp * np.sin(2*np.pi*3e3*time + mod)
noise = np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
noise *= np.exp(-time/5)
x = carrier + noise

f, t, Sxx = signal.spectrogram(x, fs)
plt.pcolormesh(t, f[0:10], Sxx[0:10,])
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

【问题讨论】:

    标签: python scipy signal-processing


    【解决方案1】:

    光谱分辨率由 FFT 中使用的点数决定,由nperseg 参数控制。要提高分辨率,您将增加每次 FFT 计算的输入点数。例如,将点数从默认的 256 增加到两倍的分辨率(即 512 点),您可以调用 scipy.signal.spectrogram,如下所示:

    f, t, Sxx = signal.spectrogram(x, fs, nperseg=512)
    

    请注意,您也可以使用:

    f, t, Sxx = signal.spectrogram(x, fs, nfft=512)
    

    在 FFT 中使用更多点,但每段不使用更多输入点(即每个段补零)。这基本上会产生一个频谱图,其中插入了额外的频率点。它不会提高分辨率(即频率非常相似的两个音调将不再可区分),但额外的点会使结果看起来更平滑。

    【讨论】:

    • 感谢您花时间回答我的问题。您的解释帮助我更好地理解了函数调用的参数的影响。
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 2022-01-27
    • 2018-01-18
    • 2016-06-08
    • 2018-06-14
    • 1970-01-01
    • 2012-07-01
    • 2012-01-30
    相关资源
    最近更新 更多