了解音频文件频谱图值

Understanding audio file spectrogram values

我目前正在努力了解功率谱是如何存储在 kaldi 框架中的。

我似乎已经使用

成功创建了一些数据文件
$cmd JOB=1:$nj $logdir/spect_${name}.JOB.log \
    compute-spectrogram-feats --verbose=2 \
     scp,p:$logdir/wav_spect_${name}.JOB.scp ark:- \| \
    copy-feats --compress=$compress $write_num_frames_opt ark:- \
      ark,scp:$specto_dir/raw_spectogram_$name.JOB.ark,$specto_dir/raw_spectogram_$name.JOB.scp

这给了我一个大文件,其中包含不同音频文件的数据点,例如 this

问题是我不确定应该如何解释这个数据集,我知道在此之前执行了 fft,我想这是一件好事。

上面给出的输出示例来自一个 1 秒长的文件。
所有标准都已用于计算频谱图,因此采样频率应为 16 kHz,帧长 = 25 ms,重叠 = 10 ms。 第一组数据点数为25186。

根据这些信息,我可以用某种方式解释输出吗?

通常执行fft时,可以通过F_s/N=bin_size提取频点大小,其中F_s是采样频率,N是FFT长度。那么这是同一个案例吗? 16000/25186 = 0.6...Hz/bin?

还是我理解有误?

Usually when one performs fft, the frequency bin size can be extracted by F_s/N=bin_size where F_s is the sample frequency and N is the FFT length.

So is this the same case? 16000/25186 = 0.6... Hz/bin?

公式 F_s/N 确实是您用来计算频点大小的公式。但是,正如您提到的 N 是 FFT 长度,而不是样本总数。基于大约 25 毫秒的帧长、10 毫秒的跳跃大小以及您生成的输出数据文件有 98 行 257 个值的事实,对于某些可能的 real-valued 输入,似乎使用的 FFT 长度是 512。这会给你频率仓大小为 16000/512 = 31.25 Hz/bin.

基于此比例,使用以下 Matlab 脚本绘制原始数据(使用先前加载到 Z 矩阵中的数据):

fs       = 16000; % 16 kHz sampling rate
hop_size = 0.010; % 10 millisecond 
[X,Y]=meshgrid([0:size(Z,1)-1]*hop_size, [0:size(Z,2)-1]*fs/512);
surf(X,Y,transpose(Z),'EdgeColor','None','facecolor','interp');
view(2);
xlabel('Time (seconds)');
ylabel('Frequency (Hz)');

给出这张图(深红色区域是强度最高的区域):