通过使用下面的 Matlab 代码,我创建了 30 Khz 信号并使用声音函数来听到创建的信号。但是,据我所知,我作为一个人,不应该听到任何超过20Khz的声音。我下面缺少的部分是什么?我不是人吗?
clear
Fs = 96000;
toneFreq1 = 30000;
nSeconds = 2;
f1 = 10*cos( linspace (0, nSeconds*toneFreq1*2*pi, round(nSeconds*Fs) ) );
freqz( f1, length(f1) )
sound(f1, Fs);
最佳答案
看来我错误地认为原因只是混叠。事实上,当你查看sound
的源代码时,你会发现在52
行:
% Make sure y is in the range +/- 1
y = max(-1,min(y,1));
这只会切断高于 1 和低于 -1 的信号。看来您对 sound
的输入值应该在 [-1,1]
区间内,即使文档中没有明确提及。如果您不传入值在此范围内的信号,将会发生削波。由采样引起的削波和混叠的混合将产生您所听到的低于 20khz 的频率。
因此,要使您的代码正常工作,只需删除 10*
。
旧部分 - 问题不仅仅是由别名引起的,因此以下内容是不够的:
您听到的是 aliasing : 只需绘制信号的前几个值
plot(f1(1:50))
您希望它看起来像正弦波。嗯,事实并非如此。
关于Matlab 30 Khz 仍然可以听到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28466721/