有人可以帮助我了解 librosa 中 STFT 的 np.abs 转换吗?
Can someone help me understand the np.abs conversion for STFT in librosa?
>>> y, sr = librosa.load(librosa.util.example_audio_file())
>>> D = np.abs(librosa.stft(y))
>>> D
array([[2.58028018e-03, 4.32422794e-02, 6.61255598e-01, ...,
6.82710262e-04, 2.51654536e-04, 7.23036574e-05],
[2.49403086e-03, 5.15930466e-02, 6.00107312e-01, ...,
3.48026224e-04, 2.35853557e-04, 7.54836728e-05],
[7.82410789e-04, 1.05394892e-01, 4.37517226e-01, ...,
6.29352580e-04, 3.38571583e-04, 8.38094638e-05],
...,
[9.48568513e-08, 4.74725084e-07, 1.50052492e-05, ...,
1.85637656e-08, 2.89708542e-08, 5.74304337e-09],
[1.25165826e-07, 8.58259284e-07, 1.11157215e-05, ...,
3.49099771e-08, 3.11740926e-08, 5.29926236e-09],
[1.70630571e-07, 8.92518756e-07, 1.23656537e-05, ...,
5.33256745e-08, 3.33264900e-08, 5.13272980e-09]], dtype=float32)
为什么第二行有一个np.abs函数调用,那为什么还要计算负数?
如你所见,当 运行 只是
>>> y, sr = librosa.load(librosa.util.example_audio_file())
>>> complex = librosa.stft(y)
[[ 2.46926467e-03+0.0000000e+00j 4.31839712e-02+0.0000000e+00j
6.61340177e-01+0.0000000e+00j ... -1.06654959e-04+0.0000000e+00j
-2.90835378e-05+0.0000000e+00j 3.53358846e-05+0.0000000e+00j]
[ 2.56137503e-03+1.1307890e-19j 5.14071472e-02+5.1062172e-03j
3.12469959e-01+5.1239032e-01j ... -6.26369513e-07-1.7899552e-05j
6.21115832e-05+8.9027701e-05j -6.63267638e-05-2.4181936e-05j]
[ 8.76825710e-04+1.9178635e-20j 9.54191685e-02+4.4643223e-02j
-9.85670462e-02+4.2620054e-01j ... 1.46014354e-04+8.8074237e-05j
-1.11950474e-04-1.7414341e-04j 1.29663958e-05+1.1292481e-04j]
...
[ 1.42249689e-07+2.8255210e-20j 6.34592482e-07+1.9654651e-07j
3.47742980e-06+1.4340003e-05j ... 2.72165117e-08-5.3495475e-09j
5.09760589e-09+2.3726502e-08j -9.91400628e-10-2.6668809e-09j]
[-4.12092085e-08+1.3764285e-19j 1.98188317e-07+8.5012516e-07j
-5.88514422e-06+9.2995169e-06j ... 3.27279501e-08-2.5336826e-08j
1.27822437e-08-1.9952591e-08j -2.34001551e-09-1.6291880e-09j]
[-1.97310911e-07+0.0000000e+00j -9.55397468e-07+0.0000000e+00j
-1.24679464e-05+0.0000000e+00j ... -7.20001267e-08+0.0000000e+00j
-2.61475943e-08+0.0000000e+00j -2.84717561e-09+0.0000000e+00j]]
librosa.stft(y)
returns 一组 复数 数字,正如人们对 Discrete Fourier Transform (DFT) 的期望。这些复数为我们提供了音频信号的相位和幅度。但很多时候我们并不关心相位(反正人类也不能真正感知到),只想将信号降低到幅度,而这只是复数的绝对值。
很容易理解,一旦你在复平面上想象这些复数中的每一个(图片来自here):
您感兴趣的是 (0, 0j)
(原点)和您的数字之间的矢量长度,例如 z=(1, 2j)
。要获得该长度,您需要计算 r = sqrt(1*1 + 2*2)
(Pythagorean theorem)——这正是 np.abs()
对复数所做的。
这在 Wikipedia 上也有很好的解释。
why are negatives calculated then?
没有负数。我假设你误认为 2.58028018e-03
是负数,而实际上它只是 2.58028018 * 10^-3
的缩写,即 scientific notation.
中的一个非常小的数字
>>> y, sr = librosa.load(librosa.util.example_audio_file())
>>> D = np.abs(librosa.stft(y))
>>> D
array([[2.58028018e-03, 4.32422794e-02, 6.61255598e-01, ...,
6.82710262e-04, 2.51654536e-04, 7.23036574e-05],
[2.49403086e-03, 5.15930466e-02, 6.00107312e-01, ...,
3.48026224e-04, 2.35853557e-04, 7.54836728e-05],
[7.82410789e-04, 1.05394892e-01, 4.37517226e-01, ...,
6.29352580e-04, 3.38571583e-04, 8.38094638e-05],
...,
[9.48568513e-08, 4.74725084e-07, 1.50052492e-05, ...,
1.85637656e-08, 2.89708542e-08, 5.74304337e-09],
[1.25165826e-07, 8.58259284e-07, 1.11157215e-05, ...,
3.49099771e-08, 3.11740926e-08, 5.29926236e-09],
[1.70630571e-07, 8.92518756e-07, 1.23656537e-05, ...,
5.33256745e-08, 3.33264900e-08, 5.13272980e-09]], dtype=float32)
为什么第二行有一个np.abs函数调用,那为什么还要计算负数?
如你所见,当 运行 只是
>>> y, sr = librosa.load(librosa.util.example_audio_file())
>>> complex = librosa.stft(y)
[[ 2.46926467e-03+0.0000000e+00j 4.31839712e-02+0.0000000e+00j
6.61340177e-01+0.0000000e+00j ... -1.06654959e-04+0.0000000e+00j
-2.90835378e-05+0.0000000e+00j 3.53358846e-05+0.0000000e+00j]
[ 2.56137503e-03+1.1307890e-19j 5.14071472e-02+5.1062172e-03j
3.12469959e-01+5.1239032e-01j ... -6.26369513e-07-1.7899552e-05j
6.21115832e-05+8.9027701e-05j -6.63267638e-05-2.4181936e-05j]
[ 8.76825710e-04+1.9178635e-20j 9.54191685e-02+4.4643223e-02j
-9.85670462e-02+4.2620054e-01j ... 1.46014354e-04+8.8074237e-05j
-1.11950474e-04-1.7414341e-04j 1.29663958e-05+1.1292481e-04j]
...
[ 1.42249689e-07+2.8255210e-20j 6.34592482e-07+1.9654651e-07j
3.47742980e-06+1.4340003e-05j ... 2.72165117e-08-5.3495475e-09j
5.09760589e-09+2.3726502e-08j -9.91400628e-10-2.6668809e-09j]
[-4.12092085e-08+1.3764285e-19j 1.98188317e-07+8.5012516e-07j
-5.88514422e-06+9.2995169e-06j ... 3.27279501e-08-2.5336826e-08j
1.27822437e-08-1.9952591e-08j -2.34001551e-09-1.6291880e-09j]
[-1.97310911e-07+0.0000000e+00j -9.55397468e-07+0.0000000e+00j
-1.24679464e-05+0.0000000e+00j ... -7.20001267e-08+0.0000000e+00j
-2.61475943e-08+0.0000000e+00j -2.84717561e-09+0.0000000e+00j]]
librosa.stft(y)
returns 一组 复数 数字,正如人们对 Discrete Fourier Transform (DFT) 的期望。这些复数为我们提供了音频信号的相位和幅度。但很多时候我们并不关心相位(反正人类也不能真正感知到),只想将信号降低到幅度,而这只是复数的绝对值。
很容易理解,一旦你在复平面上想象这些复数中的每一个(图片来自here):
您感兴趣的是 (0, 0j)
(原点)和您的数字之间的矢量长度,例如 z=(1, 2j)
。要获得该长度,您需要计算 r = sqrt(1*1 + 2*2)
(Pythagorean theorem)——这正是 np.abs()
对复数所做的。
这在 Wikipedia 上也有很好的解释。
why are negatives calculated then?
没有负数。我假设你误认为 2.58028018e-03
是负数,而实际上它只是 2.58028018 * 10^-3
的缩写,即 scientific notation.