我正在为制作驱蚊剂的课堂项目工作。该应用程序应该检测猫(OpenCV实现)并尖叫猫。但是,我希望我的软件能够尖叫超声波,这样它就不会打扰周围的任何人。 有谁知道我怎么能在matlab中做到这一点?
答案 0 :(得分:1)
为此我会引用@gnovice在这个帖子中提供的答案:How do you generate dual tone frequencies in MATLAB?
他的解决方案概述了如何生成特定频率和持续时间的音调,以及如何在Matlab中播放和保存它们。
总之,要生成以1kHz采样并持续2秒的50 Hz音调数据:
Fs = 1000; % Samples per second
toneFreq = 50; % Tone frequency, in Hertz
nSeconds = 2; % Duration of the sound
y = sin(linspace(0, nSeconds*toneFreq*2*pi, round(nSeconds*Fs)));
播放此声音:
sound(y, Fs); % Play sound at sampling rate Fs
编辑:根据@Bjorn的新评论删除放大线
答案 1 :(得分:1)
Ryan的回答基本上是正确的,但是有更多的问题比我可以用充分的解释进入评论。两个主要问题是:
选择标准采样率。您需要这样做以防止您的操作系统进行采样率转换并为信号添加进一步的失真。这通常不是什么大问题,因为采样率转换器的质量非常高,但是当在高水平上产生接近niquist frequency的声音时,这很重要。
不要将信号乘以10.这会产生失真并产生各种问题。音频的标准范围是(-1,1),这是你在y中得到的。超出该范围可能会导致失真。在某些操作系统(例如mac OSX)上,如果主音量足够低,输出超出此范围将不会失真,但为什么要玩这个游戏?同样,问题#1,这对普通代码来说可能不是什么大问题,但由于你接近于niquist,失真会产生不再是超声波作为副作用的声音。如果需要更大声,请调高计算机的系统或扬声器音量。
以下是我的具体建议:
Fs = 44100; % Samples per second. 48000 is also a good choice
toneFreq = 17000; % Tone frequency, in Hertz. must be less than .5 * Fs.
nSeconds = 2; % Duration of the sound
y = sin(linspace(0, nSeconds*toneFreq*2*pi, round(nSeconds*Fs)));
sound(y,Fs); % Play sound at sampling rate Fs
如果需要更大声,请调高计算机的系统或扬声器音量。如果它一直在向上,你就无法在matlab中大声说出来。您可以通过增加它来修改toneFreq,但保持低于.5 * Fs。大多数计算机扬声器在22050输出不会很多,所以我选择了17000,这在技术上不是超声波。
另外,测试带有toneFreq = 440的代码(应该与钢琴上的“A”音高相同)或其他东西,所以你知道它有效,你可以听到它有多大声。