提高Python频谱图的分辨率

2024-09-30 14:16:58 发布

您现在位置:Python中文网/ 问答频道 /正文

如何更改光谱图的分辨率?我正在使用matplotlib.pyplot.specgramfunction

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

这是我的代码:

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

这是我的心电图:

enter image description here

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

先谢谢你


Tags: 答案代码importnumpyplotmatplotliba1as
2条回答

您还可以使用arlpypython包,该包具有使用bokeh图的内置交互功能。您可以直接执行pip install arlpy或在github上找到。您可以使用“长方体”和“滚轮”进行放大

import arlpy.plot
import numpy as np
arlpy.plot.specgram(np.random.normal(size=(10000)), fs=10000, clim=30)

enter image description here

分辨率本质上受到傅里叶变换的限制,对此你无能为力。不过,我相信你的信号,在4秒后几乎没有频率信息。您可以尝试使用Lomb-Scargle periodogram之类的工具进行一些研究

几年前,我编写了一个助手函数,您可能会发现它很有用(您可以通过pip安装: pip install fitwrap或从github下载)

这里有一个您可以使用的代码片段,您只需要设置span(窗口维度)、所需的最小和最大频率min_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')

Lomb

相关问题 更多 >

    热门问题