首页 > 解决方案 > 增加我的 Python 频谱图的分辨率

问题描述

如何更改频谱图的分辨率?我正在使用该matplotlib.pyplot.specgram 功能

我想我必须放大窗口,但我不知道该怎么做。在这里问它可能很容易,但我希望得到答案。

这是我的代码:

import numpy as np
import matplotlib.pyplot as plot

#Import data
a1.resize(np.size(a1))
signaldata = a1
samplingFrequency=2000
    
plot.subplot
plot.specgram(signalData,Fs=samplingFrequency)
plot.xlabel('Time in seconds')
plot.ylabel('Frequency')
plot.ylim(0,100)
plot.show()

这是我的信号数据:a1

这是我的光谱图:

在此处输入图像描述

在 4-14 秒和 0-40 (Hz) 区域内只有两个条形,没有比只有两种颜色更高的分辨率。我希望更具体地看看那里发生了什么。有没有可能提高分辨率?

先感谢您。

标签: pythonmatplotlibresolutionspectrogram

解决方案


分辨率本质上受到傅里叶变换的限制,您对此无能为力。尽管如此,我相信您拥有的信号在 4 秒后几乎没有频率信息。您可以尝试使用Lomb-Scargle 周期图等工具进行一些调查。

几年前我写了一个你可能会觉得有用的辅助函数(你可以通过 pip: 安装 pip install fitwrap或从github下载)。

这是您可以使用的片段,您只需要设置span(窗口尺寸)、所需的最小和最大频率min_freq max_freq、时间箱n_bins和频率箱grid_size

import fitwrap as fw
import matplotlib.pyplot as plt

span = 0.4
n_bins = 100
grid_size = 100
min_freq = 0.01
max_freq = 40

t_tot = 1/samplingFrequency*signaldata.shape[0]
t = np.linspace(0, t_tot, signaldata.shape[0])
tmin = np.min(t)
tmax = np.max(t)
x_bins = np.linspace(tmin+span, tmax-span, n_bins)

spectrogram = np.zeros([grid_size, x_bins.shape[0]])
for index, x_bin in enumerate(x_bins):
    mask = np.logical_and((x_bin-span)<=t, (x_bin+span)>=t) 
    frequency_grid, lombscargle_spectrum = fw.lomb_spectrum(t[mask], signaldata[mask],
                    frequency_span=[min_freq, max_freq], grid_size=grid_size)
    spectrogram[:, index] = lombscargle_spectrum

plt.imshow(spectrogram, aspect='auto', extent=[x_bins[0],x_bins[-1],
            frequency_grid[0],frequency_grid[-1]], origin='lower') 
plot.xlabel('Time in seconds')
plot.ylabel('Frequency')

伦布


推荐阅读