【问题标题】:Spectrogram plot in PythonPython中的频谱图
【发布时间】:2021-02-01 07:04:08
【问题描述】:

我已应用以下代码来创建频谱图

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

# Define the signal
Fs = 1e4     # Sampling Frequency


# Sin wave with Amplite 1 unit, 50Hz, for duration 0-5 seconds
N1 = (1e5)/2
time1 = np.arange(N1) / float(Fs)          
x1 = 1*np.sin(2*np.pi*50*time1)


# Sin wave with Amplite 0.008 units, 100Hz, for duration 5-10 seconds
time2 = np.arange(N1,2*N1) / float(Fs)
x2 = 0.008*np.sin(2*np.pi*100*time2)


# Concatenate above two waves
T    =np.concatenate((time1,time2))
Y    =np.concatenate((x1,x2))



# Plot the waves
plt.plot(T , Y)
plt.title('Time Data')
plt.ylabel('Amplitude')
plt.xlabel('Time [sec]')
plt.show()


# spectrogram 
freq_axis, time_axis, Sxx = signal.spectrogram(Y, Fs)


# Plot the spectrogram 
plt.pcolormesh(time_axis, freq_axis, Sxx)
plt.title('Spectrogram')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.xlim(0,10)
plt.ylim(0,200)
plt.show()

频谱图的结果如下:

在此图中,似乎主要频率是 0-5 秒(黄色区域)的 37Hz 到 75Hz。 然而,在创建的信号中,唯一的主导频率。从 0-5 秒为 50 Hz。

此外,无法识别具有 0.008 个单位幅度、100Hz、持续 5-10 秒的信号。

谁能告诉我我哪里出错了?

另外,有没有办法在频谱图的绘图窗口旁边画一个颜色条,以便可以看到与颜色对应的幅度值?

【问题讨论】:

    标签: python-3.x signals signal-processing spectrogram


    【解决方案1】:

    首先回答颜色条的问题。 Matplotlib.pyplot 提供了创建颜色条的功能。你可以添加

    plt.colorbar()
    

    为您的绘图添加标准颜色条。

    然后是您最初的问题。您可能需要更好地了解 signal.spectrogram() 的作用。要获得对结果的直觉,您必须知道用于在频时域中从时间转换信号的函数在提供的精度方面受到限制。因此,您可以对频率进行非常准确的计算,但不知道频率出现的确切时间,或者您在何时非常准确,但不知道是哪个频率。

    在您的示例中,频率计算得不是很准确,导致所谓的频率箱。 bin 大小是黄色块的高度。所以频谱图在它们各自的 bin 中识别出两个频率,因此一个 bin 是黄色的,另一个 bin 是蓝色的。

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 2010-11-21
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2017-09-08
      • 1970-01-01
      相关资源
      最近更新 更多