具有意外结果的频谱图(Python、scipy.signal)
Spectogram with unexpected results (Python, scipy.signal)
我正在寻求澄清我在理解或实施频谱图绘图时出错的地方。
为了确保我得到的一切都是正确的,我从一个玩具示例开始,所以我生成了一个非常简单的信号(三个不同频率和相移的周期信号之和,没有噪声)
作为休闲:
import numpy as np
sampling_rate = 1.0 / 1000
duration = 2
t = np.arange(0, duration, sampling_rate)
# Signal 1
A_1 = 0.8 # amplitude of the cosine wave
f_1 = 100 # frequency of the cosine wave
phase_1 = 30 #desired phase shift of the cosine in degrees
phi_1 = phase_1*np.pi/180
s1 = A_1*np.cos(2*np.pi*f_1*t+phi_1)
# Signal 2
A_2 = 0.3 # amplitude of the cosine wave
f_2 = 8 # frequency of the cosine wave
phase_2 = 45 #desired phase shift of the cosine in degrees
phi_2 = phase_2*np.pi/180
s2 = A_2*np.cos(2*np.pi*f_2*t+phi_2)
# Signal 3
A_3 = 0.1 # amplitude of the cosine wave
f_3 = 60 # frequency of the cosine wave
phase_3 = -10 #desired phase shift of the cosine in degrees
phi_3 = phase_3*np.pi/180
s3 = A_3*np.cos(2*np.pi*f_3*t+phi_3)
# Result
x = s1 + s2 + s3
我预计“x”信号的频谱图将是对应于生成信号的三个频率的三个水平线。信号不会随时间变化,因此我预期结果与 FFT 类似,但表示形式不同。
但是用下面的代码绘制之后:
from scipy import signal
import matplotlib.pyplot as plt
freqs, times, spectrogram = signal.spectrogram(x)
plt.figure(figsize=(8, 6))
plt.imshow(spectrogram, aspect='auto', cmap='hot_r', origin='lower')
plt.title('Spectrogram')
plt.ylabel('Frequency band')
plt.xlabel('Time window')
plt.tight_layout()
我得到了一些意想不到的东西:
找到的频率没有意义。
所以我的问题是:我哪里弄错了?我的期望错了吗?我的实施不知何故被宠坏了?也许有人可以向我推荐有关此主题的良好知识来源?
非常感谢您的宝贵时间和帮助。
我在问这个问题之前找到了答案,所以我不会删除整个 post,而是与您分享我的结果。我希望有人能从中受益。
情节不错,但轴的符号很糟糕。如果你睁大眼睛,你会注意到实际上有三个条,(最弱的是 15 左右)。线条的可见性与分量信号的幅度值成正比,由于幅度的颜色代码,这是有意义的。所以现在很容易注意到 y 轴由于某种原因除以 4。类似的问题是 x 轴,当你意识到我们没有在任何地方提供有关采样频率的信息时,这就更容易理解了。
所以现在我们可以纠正这个问题,并将调色板更改为休闲:
freqs, times, spectrogram = signal.spectrogram(x,fs=1./sampling_rate)
plt.figure(figsize=(8, 6))
plt.pcolormesh(times, freqs, spectrogram, shading='gouraud')
plt.ylabel('Frequency [Hz]')
plt.ylim([0,110])
plt.xlabel('Time [sec]')
plt.tight_layout()
plt.show()
这给我们带来了预期的结果(s2 的振幅乘以二):
希望对您有所帮助。
我正在寻求澄清我在理解或实施频谱图绘图时出错的地方。
为了确保我得到的一切都是正确的,我从一个玩具示例开始,所以我生成了一个非常简单的信号(三个不同频率和相移的周期信号之和,没有噪声) 作为休闲:
import numpy as np
sampling_rate = 1.0 / 1000
duration = 2
t = np.arange(0, duration, sampling_rate)
# Signal 1
A_1 = 0.8 # amplitude of the cosine wave
f_1 = 100 # frequency of the cosine wave
phase_1 = 30 #desired phase shift of the cosine in degrees
phi_1 = phase_1*np.pi/180
s1 = A_1*np.cos(2*np.pi*f_1*t+phi_1)
# Signal 2
A_2 = 0.3 # amplitude of the cosine wave
f_2 = 8 # frequency of the cosine wave
phase_2 = 45 #desired phase shift of the cosine in degrees
phi_2 = phase_2*np.pi/180
s2 = A_2*np.cos(2*np.pi*f_2*t+phi_2)
# Signal 3
A_3 = 0.1 # amplitude of the cosine wave
f_3 = 60 # frequency of the cosine wave
phase_3 = -10 #desired phase shift of the cosine in degrees
phi_3 = phase_3*np.pi/180
s3 = A_3*np.cos(2*np.pi*f_3*t+phi_3)
# Result
x = s1 + s2 + s3
我预计“x”信号的频谱图将是对应于生成信号的三个频率的三个水平线。信号不会随时间变化,因此我预期结果与 FFT 类似,但表示形式不同。
但是用下面的代码绘制之后:
from scipy import signal
import matplotlib.pyplot as plt
freqs, times, spectrogram = signal.spectrogram(x)
plt.figure(figsize=(8, 6))
plt.imshow(spectrogram, aspect='auto', cmap='hot_r', origin='lower')
plt.title('Spectrogram')
plt.ylabel('Frequency band')
plt.xlabel('Time window')
plt.tight_layout()
我得到了一些意想不到的东西:
找到的频率没有意义。
所以我的问题是:我哪里弄错了?我的期望错了吗?我的实施不知何故被宠坏了?也许有人可以向我推荐有关此主题的良好知识来源?
非常感谢您的宝贵时间和帮助。
我在问这个问题之前找到了答案,所以我不会删除整个 post,而是与您分享我的结果。我希望有人能从中受益。
情节不错,但轴的符号很糟糕。如果你睁大眼睛,你会注意到实际上有三个条,(最弱的是 15 左右)。线条的可见性与分量信号的幅度值成正比,由于幅度的颜色代码,这是有意义的。所以现在很容易注意到 y 轴由于某种原因除以 4。类似的问题是 x 轴,当你意识到我们没有在任何地方提供有关采样频率的信息时,这就更容易理解了。
所以现在我们可以纠正这个问题,并将调色板更改为休闲:
freqs, times, spectrogram = signal.spectrogram(x,fs=1./sampling_rate)
plt.figure(figsize=(8, 6))
plt.pcolormesh(times, freqs, spectrogram, shading='gouraud')
plt.ylabel('Frequency [Hz]')
plt.ylim([0,110])
plt.xlabel('Time [sec]')
plt.tight_layout()
plt.show()
这给我们带来了预期的结果(s2 的振幅乘以二):
希望对您有所帮助。