python - 增加我的 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) 区域内只有两个条形,没有比只有两种颜色更高的分辨率。我希望更具体地看看那里发生了什么。有没有可能提高分辨率?
先感谢您。
解决方案
分辨率本质上受到傅里叶变换的限制,您对此无能为力。尽管如此,我相信您拥有的信号在 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')
推荐阅读
- javascript - AlpineJs 不会更新绑定属性
- ms-access - 如何在访问中将文本框的多个值从一个表单传递到另一个表单
- go - lsp-mode 用于“会话中没有视图”出错
- c - 调用函数指针创建双重重新声明符号的错误
- nginx - 是否可以通过 Kubernetes 中的 OpenVPN 和 Nginx 反向代理通过 Pod 路由流量?
- arrays - 将结构数组传递给C中的排序函数
- python - 如何使用 python opencv 模糊图像中的红色,使其不清晰可见?
- r - 如何在数据框中按列名重命名观察结果?
- assembly - MIPS 组装作业帮助p
- python - 将图像数据加载到 tensorflow,如何将 tensor strided_slice 转换为字符串?