1

我有一个项目,我必须从音频文件中识别频率。为此,我使用 10 kHz 的单音来查看是否可以正常工作。由于我对 Octave 还很陌生,所以我用自己的音频文件尝试了这个示例。我试图通过对所有功能进行一些研究来了解会发生什么。

我的问题是;如果我在未指定输出时让 specgram 绘制图形:

specgram(y,fftn,Fs,hanning(window),step);

它给出了一条 10kHz 的线路,这正是我想要的。

但是如果我为 specgram 函数指定输出

[S,f,t]= specgram(y,fftn,Fs,hanning(window),step);

让它绘制,它以 18 kHz 绘制线。

我认为它必须在图形的输入中,我尝试对这些进行一些修改,但每次我这样做时,Octave 都会出错。我需要频率作为给定的输出,因为我必须用它做一些计算,我想我需要指定频率输出。

这是指定频谱图的代码部分:

step= fix(5*Fs/1000);           % stepsize of the window
window= fix(90*Fs/1000);        % window size 
fftn =2^nextpow2(window);       % Size of the FFT block

[S,f,t]= specgram(y,fftn,Fs,hanning(window),step); 

S= abs(S(2:fftn*12000/Fs,:));   % Normalize the phase
S= S/max(S(:));                 % Normalize the Energy
S= max(S, 10^(-40/10));         % Throw out values below -40 dB and above -3dB
S= min(S, 10^(-3/10));      
figure
imagesc(t,f,(log(S)));

谁能在这里帮助我如何从音频文件中获取频率数据,以便我可以在一些计算中使用它?

我已经在 Octave 手册中搜索了答案以寻求帮助,并在各种 matlab 站点上进行了尝试。还检查了这里已经有很多帖子,例如:

信号中的八度频谱图“频谱图”如何工作?

Matlab频谱图/短时傅里叶变换函数的FFT方法

PS对不起我的英语不好,这不是我的母语

4

1 回答 1

0

我自己找到了答案,原来是在这行代码中:

S= abs(S(2:fftn*12000/Fs,:));

如果我删除这条线,这些线将放置在图中的正确频率上。在我看来,这条线只占用了 fft 的一小部分空间,并用其他频率替换了它,但我对此并不担心。

于 2015-03-12T08:21:24.950 回答