gpt4 book ai didi

python - 需要解释 specgram 函数如何在 python 中工作(matplotlib - MATLAB 兼容函数)

转载 作者:太空宇宙 更新时间:2023-11-04 08:42:31 25 4
gpt4 key购买 nike

我正在努力将我的代码从 python 转换为 objective c。在 matplotlib.mlab.specgram 函数中,我在 fft 之前看到了 3 个重要函数:

 result = stride_windows(x, NFFT, noverlap, axis=0)
result = detrend(result, detrend_func, axis=0)
result, windowVals = apply_window(result, window, axis=0,
return_window=True)
result = np.fft.fft(result, n=pad_to, axis=0)[:numFreqs, :]

我尝试调试以了解每个的目的。例如我有输入数组:

x = [1,2,3,4,5,6,7,8,9,10,11,12]

在第一个函数 stride_windows(这个是为了防止泄漏?)之后,如果 NFFT = 4,noverlap = 2 那么:

x = [ [1,3,5,7,9],
[2,4,6,8,10],
[3,5,7,9,11],
[4,6,8,10,12]
]

去趋势后没有任何变化(我理解在 fft 之前去趋势)

apply_window里面(这一步没看懂):

    xshape = list(x.shape) 
xshapetarg = xshape.pop(axis) // =4
windowVals = window(np.ones(xshapetarg, dtype=x.dtype))
//result of 4 elements [0.0, 0.75, 0.75, 0.0]
xshapeother = xshape.pop() // =5
otheraxis = (axis+1) % 2 // =1
windowValsRep = stride_repeat(windowVals, xshapeother, axis=otheraxis)
// result windowValsRep = [
[ 0. ,0. ,0. ,0. ,0. ,],
[0.75, 0.75, 0.75, 0.75,
[0.75, 0.75, 0.75, 0.75,
[ 0. ,0. ,0. ,0. ,0. ,]
]

然后乘以x

windowValsRep * x

现在

 x =    [ 
[ 0. , 0. , 0. , 0. , 0. ],
[ 1.5 , 3 , 4.5 , 6. , 7.5 ],
[ 2.25, 3.75 , 5.25 , 6.75 , 8.25 ],
[ 0. , 0. , 0. , 0. , 0. ]
]

最后是 fft,据我所知,fft 只需要一个数组,但这里它处理二维数组。为什么?

result = np.fft.fft(x, n=pad_to, axis=0)[:numFreqs, :]

谁能一步一步地为我解释为什么在 fft 之前需要这样处理数据?

谢谢,

最佳答案

频谱图和 FFT 不是一回事。 spectogram的目的是对小的、大小相等的时间 block 进行 FFT。这会产生二维傅立叶变换,其中 X 轴是时间 block 的开始时间,Y 轴是该时间 block 中每个频率的能量(或功率等)。这使您可以查看频率分量如何随时间变化。

specgram 的文档对此进行了解释功能:

Data are split into NFFT length segments and the spectrum of each section is computed. The windowing function window is applied to each segment, and the amount of overlap of each segment is specified with noverlap.

至于个别功能,您所问的很多内容在 reach 功能的文档中都有描述,但我会尝试更详细地解释。

stride_windows 的用途,如 documentation 中所述, 是将数据的一维数组转换为连续时间 block 的二维数组。这些是将在最终频谱图中计算其 FFT 的时间 block 。在您的情况下,它们是长度为 4 (NFFT=4) 的时间 block (注意每列 4 个元素)。因为您设置了 noverlap=2,每列的最后 2 个元素与下一列的前 2 个元素相同(这就是重叠的意思)。之所以称为“步幅”,是因为它使用了一个关于 numpy 数组内部存储的技巧,允许它在不占用任何额外内存的情况下创建具有重叠窗口的数组。

去趋势函数,顾名思义,如其 documentation 中所述。 , 从信号中删除趋势。默认情况下,它使用平均值,即 detrend_mean documentation描述,删除信号的 mean ( DC offset )。

apply_window 函数的作用正如它的名字所暗示的那样,它的 documentation 也是如此。说:它适用于 window function到每个时间 block 。这是必需的,因为在时间 block 的开始和结束时突然切断信号会导致称为 transients 的大量宽带能量爆发。那会弄乱频谱图。对信号加窗可减少这些瞬变。默认情况下,频谱图函数使用 hanning window .这会衰减每个时间 block 的开始和结束。

FFT 并不是真正的 2D。 numpy FFT function允许您指定一个轴来接管 FFT。所以在这种情况下,我们有一个二维数组,我们对该数组的每一列进行 FFT。在一个步骤中执行此操作比手动遍历每一列要干净得多,速度也快一点。

关于python - 需要解释 specgram 函数如何在 python 中工作(matplotlib - MATLAB 兼容函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43685753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com