在 .wav 文件的 window 上计算功率谱图
Calculating power-spectrogram on a window of a .wav file
我正在尝试计算一部分声音文件的功率谱图。
目前我正在为此使用 librosa。
我正在通过 20*1e-3*samplerate 计算我的 windowsize。
我想知道的是结果(特别是 t 的长度),如下例所示:
44.1kHz 的采样率与 20ms 的时间帧相结合产生 window 882 个样本。
In [2]: D = np.abs(librosa.stft(y[:882]))**2
In [3]: np.shape(D)
Out[4]: (1025, 2)
我得到的结果是 2 毫秒的时间范围,这不是我的预期。有人可以帮助我/指出我做错了什么吗?
默认情况下 librosa.stft
使用 2048 的 FFT 大小 n_fft
并且输出的第一维匹配实际输入信号的非冗余频率分量的数量(1+n_fft/2
, 在本例中为 1025).
第二个维度由时间片的数量决定,我想这就是您有点困惑的地方,期待您的 882 个样本中有一个时间片。但是 librosa.stft
计算 重叠 时间片的输出。用于每个切片的样本数默认设置为 win_length / 4
,由于您没有指定 win_length
,因此设置为 n_fft / 4
或 512。充分利用您的882 个样本(并根据需要进行填充),这为您提供了两个切片:
- 一个用于样本 0 到 2047;
- 样本 512 到 881 的另一个,并添加了零填充。
如果您不希望任何重叠,您可以设置 hop_length
参数以匹配 n_fft
.
我正在尝试计算一部分声音文件的功率谱图。 目前我正在为此使用 librosa。
我正在通过 20*1e-3*samplerate 计算我的 windowsize。 我想知道的是结果(特别是 t 的长度),如下例所示:
44.1kHz 的采样率与 20ms 的时间帧相结合产生 window 882 个样本。
In [2]: D = np.abs(librosa.stft(y[:882]))**2
In [3]: np.shape(D)
Out[4]: (1025, 2)
我得到的结果是 2 毫秒的时间范围,这不是我的预期。有人可以帮助我/指出我做错了什么吗?
默认情况下 librosa.stft
使用 2048 的 FFT 大小 n_fft
并且输出的第一维匹配实际输入信号的非冗余频率分量的数量(1+n_fft/2
, 在本例中为 1025).
第二个维度由时间片的数量决定,我想这就是您有点困惑的地方,期待您的 882 个样本中有一个时间片。但是 librosa.stft
计算 重叠 时间片的输出。用于每个切片的样本数默认设置为 win_length / 4
,由于您没有指定 win_length
,因此设置为 n_fft / 4
或 512。充分利用您的882 个样本(并根据需要进行填充),这为您提供了两个切片:
- 一个用于样本 0 到 2047;
- 样本 512 到 881 的另一个,并添加了零填充。
如果您不希望任何重叠,您可以设置 hop_length
参数以匹配 n_fft
.