swe*_*e87 6 python audio spectrogram audio-processing librosa
我正在浏览这两个 librosa 文档:melspectrogram和stft。
我正在研究可变长度的音频数据集,但我不太了解形状。例如:
(waveform, sample_rate) = librosa.load('audio_file')
spectrogram = librosa.feature.melspectrogram(y=waveform, sr=sample_rate)
dur = librosa.get_duration(waveform)
spectrogram = torch.from_numpy(spectrogram)
print(spectrogram.shape)
print(sample_rate)
print(dur)
Run Code Online (Sandbox Code Playgroud)
输出:
torch.Size([128, 150])
22050
3.48
Run Code Online (Sandbox Code Playgroud)
我得到的有以下几点:
我试图理解或计算:
n_fft是什么?我的意思是它到底对音频波做了什么?我在文档中读到以下内容:
n_fft : int > 0 [标量]
用零填充后加窗信号的长度。STFT 矩阵 D 的行数为 (1 + n_fft/2)。默认值 n_fft=2048 个样本,对应于 22050 Hz 采样率下的 93 毫秒物理持续时间,即 librosa 中的默认采样率。
这意味着在每个窗口中采集 2048 个样本,这意味着 --> 1/22050 * 2048 = 93[ms]。每 93[ms] 音频计算一次 FFT?
那么,这意味着窗口大小和窗口是用于过滤这一帧中的信号的?
在上面的例子中,我知道我得到了 128 个梅尔频谱图,但这到底意味着什么?
hop_length 是什么?阅读文档,我明白这是如何将窗口从一个 fft 窗口移动到下一个右侧窗口?如果这个值为512并且n_fft =也是512,那意味着什么?这是否意味着它将花费 23[ms] 的窗口,计算该窗口的 FFT 并跳过接下来的 23[ms]?
如何指定要从一个 FFT 窗口重叠到另一个 FFT 窗口?
请帮助,我看过很多计算频谱图的视频,但我似乎在现实生活中看不到它。
hen*_*rik 13
理解频谱图输出维度的基本参数不一定是所使用的 FFT ( n_fft) 的长度,而是连续 FFT 之间的距离,即hop_length。
计算STFT时,您需要计算多个短段的 FFT。这些段的长度为n_fft。通常这些段是重叠的(为了避免信息丢失),因此两个段之间的距离通常不是n_fft,而是类似n_fft/2。这个距离的名称是hop_length。它也在样本中定义。
因此,当您有 1000 个音频样本,并且 hop_length 为 100 时,您将获得 10 个特征帧(请注意,如果n_fft大于 hop_length,则可能需要填充)。
在您的示例中,您使用的是默认值hop_length512。因此,对于以 22050 Hz 采样的音频,您获得的特征帧率为
frame_rate = sample_rate/hop_length = 22050 Hz/512 = 43 Hz
Run Code Online (Sandbox Code Playgroud)
同样,填充可能会稍微改变这一点。
因此,对于 22050 Hz 的 10 秒音频,您会得到一个维度为 的频谱图数组(128, 430),其中 128 是梅尔箱的数量,430 是特征的数量(在本例中为梅尔频谱)。
| 归档时间: |
|
| 查看次数: |
12534 次 |
| 最近记录: |