gpt4 book ai didi

python - 使用 SciPy stft 函数指定短时傅里叶变换段中的样本数

转载 作者:行者123 更新时间:2023-12-01 02:47:51 35 4
gpt4 key购买 nike

我想对我的数据执行短时傅里叶变换,并为每个段指定特定的样本长度。我想使用信号子模块中的 SciPy 函数 stft。但是,当我通过以下方式创建长度 10e5 的音频数组时:

fs = 10e3 # Sampling frequency
N = 1e5 # Number of samples
time = np.arange(N) / fs
x = 500*np.cos(time) # Some random audio wave
# x.shape gives (100000,)

并使用 nperseg=1000 应用 SciPy stft 函数,我没有得到预期的 100 个段。相反,输出的形状是:

f, t, Zxx = signal.stft(x, fs, nperseg=1000)
print(Zxx.shape) # -> (501, 201)

如果我正确理解文档,501 是“频率篮子”的数量,20001 是不同时间段的数量,我最初打算将其设置为 N/nperseg 或 10e5/1000 = 100。我确实看到了该函数有一些参数来指定填充和重叠,但是当 N 可以被 nperseg 整除时,它到底做了什么?

最佳答案

当我运行你的代码片段时:

In [1]: import numpy as np

In [2]: import scipy.signal as signal

In [3]: fs = 10e3 # Sampling frequency
...: N = 1e5 # Number of samples
...: time = np.arange(N) / fs
...: x = 500*np.cos(time) # Some random audio wave
...:

In [4]: f, t, Zxx = signal.stft(x, fs, nperseg=1000)
...: print(Zxx.shape) # -> (501, 20001)
...:
(501, 201)

我看到 Zxx 的输出是 501 x 201。

501正如你所说,是频率仓的数量(每段1000个时间仓,经过纯实数FFT后,变成501个频率仓;如果你想要全复数FFT,可以传入return_oneside=False )。

201 是因为 npersegnoverlap 的组合。 docs假设 noverlap 是“段之间重叠的点数。如果,则noverlap = nperseg//2。”因此,STFT 不会制作 1e5/1e3=1e2 “段”,它会将 1e3 长的段重叠 500 个样本(半个段),因此最终会得到 200 多一点>重叠的段。

要获得您想要的内容,请说 noverlap=0:

In [7]: f, t, Zxx = signal.stft(x, fs, nperseg=1000, noverlap=0)

In [8]: Zxx.shape
Out[8]: (501, 101)

我不太确定为什么它返回 101 个段而不是 100...

关于python - 使用 SciPy stft 函数指定短时傅里叶变换段中的样本数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45100189/

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