3

我目前正在努力了解功率谱是如何存储在 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

这给了我一个大文件,其中包含不同音频文件的数据点,就像这样

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

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

鉴于这些信息,我可以以某种方式解释输出吗?

通常当执行 fft 时,频率 bin 大小可以通过F_s/N=bin_size其中F_s是采样频率和NFFT 长度来提取。那么这是同一种情况吗?16000/25186 = 0.6...Hz/bin?

还是我解释不正确?

4

1 回答 1

4

通常在执行 fft 时,频率 bin 大小可以通过F_s/N=bin_size其中F_s是采样频率和NFFT 长度来提取。

那么这是同一种情况吗?16000/25186 = 0.6...Hz/bin?

该公式F_s/N确实是您用来计算频点大小的公式。但是,正如您提到N的是 FFT 长度,而不是样本总数。基于大约 25 毫秒的帧长度、10 毫秒的跳跃大小以及您生成的输出数据文件有 98 行的 257 个值的事实,对于一些可能的实值输入,使用的 FFT 长度似乎是 512。这会给你一个频率bin 大小为 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)');

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

于 2017-01-12T02:55:51.770 回答