Audio 理解音频文件频谱图值

Audio 理解音频文件频谱图值,audio,fft,speech-recognition,kaldi,Audio,Fft,Speech Recognition,Kaldi,我目前正在努力理解功率谱是如何存储在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_o

我目前正在努力理解功率谱是如何存储在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秒长的文件。
所有标准均已用于计算SPECT图,因此采样频率应为16 kHz,帧长=25 ms,重叠=10 ms。 第一组中的数据点数为25186

有了这些信息,我能以某种方式解释输出吗

通常,当执行fft时,可以通过
F_s/N=bin_size
提取频率单元大小,其中
F_s
是采样频率,
N
是fft长度。那么这是相同的情况吗?16000/25186 = 0.6... 赫兹/宾

还是我解释错了

通常,当执行fft时,可以通过
F_s/N=bin_size
提取频率单元大小,其中
F_s
是采样频率,
N
是fft长度

那么这是相同的情况吗?16000/25186 = 0.6... 赫兹/宾

公式
F_s/N
确实是用于计算频率单元大小的公式。但是,正如您所提到的,
N
是FFT长度,而不是样本总数。基于大约25ms的帧长、10ms的跃点大小以及您生成的输出数据文件中有98行257个值,用于某些假定的实值输入,看起来使用的FFT长度是512。这将为您提供16000/512=31.25 Hz/bin的频率单元大小

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

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

数据集只有97行(不是98行新数据)。。第一行似乎不属于数据集。@CarltonBanks对
N
样本进行实FFT将输出
N/2+1
复值,包括DC和
F_/2
频率的2个纯实值。对于给出
512/2+1=257
N=512
。此外,数据集文件有99行。排除不包含数据的第一行,将得到98行数据。很抱歉问了这么多问题。。但是你能不能详细说明一下98这个数字。。。我想我理解为什么有257个条目,但我不确定我是否理解为什么有98行?。。这条线代表什么?每条线代表使用FFT对1块输入数据计算的频谱。因此,它显示了特定时间片的频谱。如果输入数据被分割成不相交的块,那么您将得到16000/512~31条这样的行(它们基本上是独立的)。现在,由于FFT块中存在重叠,因此可以得到更多的行。这些线不再是独立的,但提供了更好的时间分辨率(它们可以被视为一种插值)。当每个块比上一个块晚开始约160个样本时,您需要(16000-512)/160+1~98个块来覆盖1s。。。你的时间轴不是不正确吗?。。我的意思是,它不是一个百分比,然后是秒吗<代码>[0:97]/97=[0…1]
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)');