我有兴趣在运行时产生音频,频率和持续时间是可变参数。在MATLAB中生成此声音文件的最佳方法是什么?并且可以在脚本中访问它以便以后用于以不同频率/持续时间以类似方式生成的其他声音文件连接?提前感谢您的评论。
答案 0 :(得分:19)
给定矢量的播放持续时间取决于矢量中的元素数量和采样率。例如,当以1 kHz播放时,1000个元素的矢量将持续1秒。以500 Hz的频率播放时,它将持续2秒。因此,您应该做的第一个选择是您要使用的采样率。为避免aliasing,采样率应为twice as large as the largest frequency component of the signal。但是,您可能希望使其大于此值,以避免接近采样率的频率衰减。
如果采样率为1 kHz,则以下示例创建给定持续时间和音频频率的声音向量(使用LINSPACE和SIN函数):
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功能以1 kHz播放时,此向量将产生50 Hz音调2秒:
sound(y, Fs); %# Play sound at sampling rate Fs
然后可以使用WAVWRITE函数将矢量保存为wav文件:
wavwrite(y, Fs, 8, 'tone_50Hz.wav'); %# Save as an 8-bit, 1 kHz signal
稍后可以使用WAVREAD函数加载声音向量。如果你要连接两个声音向量,你应该确保它们都设计为使用相同的采样率。
答案 1 :(得分:-1)
gnovice的代码似乎有问题。我认为他弄乱了linspace-function。你可以在比较相同的频率和不同的采样频率时检查一下 - 声音有所不同,显然不应该这样。
(我很蠢。当使用Matlab的声音功能时,请确保使用与生成音色相同的采样频率。否则,你将度过一段美好的时光。)
这是一个包含音调生成功能的功能。
function pureTone ( frequency, duration, amplitude, sampleFreq, save2file )
% Generate pure tones.
% Enter at least 1 argument.
% Defaults are:
% duration 1 sec
% amplitude 1
% sampleFreq 48000 Hz
% save2file no
%--------------------
% If you want to save the tone to a file, provide a name.
switch nargin
case 0
error('Enter a frequency.')
case 1
duration = 1;
amplitude = 1;
sampleFreq = 48000;
save2file = 0;
case 2
amplitude = 1;
sampleFreq = 48000;
save2file = 0;
case 3
sampleFreq = 48000;
save2file = 0;
case 4
save2file = 0;
end
t = linspace( 0, duration, duration * sampleFreq );
% http://de.wikipedia.org/wiki/Sinuston
s = amplitude * sin( 2 * pi * frequency * t );
sound( s, sampleFreq );
if save2file
wavwrite( s, sampleFreq, 32, save2file);
end
end