我有一个项目,我必须从音频文件中识别频率。为此,我使用10 kHz的单音来查看是否可以使其正常工作。 由于我是Octave的新手,我尝试使用自己的音频文件this example。 我尝试通过对所有功能进行一些研究来了解会发生什么。
我的问题是;当我没有指定它的输出时,如果我让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网站。此处还检查过很多帖子,例如:
How does Octave spectrogram 'specgram' from signal work?
Methodology of FFT for Matlab spectrogram / short time Fourier transform functions
P.S。抱歉我的英语不好,不是我的母语
答案 0 :(得分:0)
我自己找到了答案,事实证明它出现在这行代码中:
S = abs(S(2:fftn * 12000 / Fs,:));
如果我删除此行,则行放在图中的右侧频率上。对我来说,看起来这条线只占用了fft的一小部分空间并用其他频率取而代之,但我对此并不感到害羞。