我正在MATLAB中设计一个由某些(10-12)频率组成的声音信号。每个频率音调持续时间为1毫秒。当我在频率之间切换时,变化是突然的,并产生不必要的咔嗒声。图中的橙色三角形显示频率的变化:
如何从一个频率转换到另一个频率?目前我只是在一起添加音调。
Time = (0: ToneDur * Fs)/Fs;
Sound = zeros(1,100000); % Zero padding
for i = 1 : TotalFreq
Tone = Amp(i).*cos(2 * pi * Frequency(i) * Time);
Sound = [Sound, Tone];
end
答案 0 :(得分:1)
最简单的方法只是生成给定频率的整个周期。 首先需要创建一个要生成的频率数组然后计算 样本中的linear period。在给定的持续时间内,您可以计算出多少 波的周期可以适合给定的持续时间。对于部分频率 期间,简单地围绕期间数。这意味着并非真正的所有频率 在相同的时间内玩,但差异不足以实际注意到,特别是对于更高的频率。
使用您问题的编码惯例,这将起到作用
Fs = 44100; % sampling rate
ToneDur = 0.15; % duration of tone in seconds
Frequency = [1:0.5:12] * 100; % array of frequencies (100hz - 12khz in 50Hz steps)
TotalFreq = length(Frequency); % the number of frequencies
freqLengths = (1 ./ Frequency) * Fs; % wave period in samples
numberOfPeriodsPerFreq = Fs * ToneDur ./ freqLengths
sampDur = floor(numberOfPeriodsPerFreq) .* freqLengths % array number of samples required per frequency for a whole number of periods
Sound = 0; % instantiate variable to store audio data
for i = 1 : TotalFreq
Tone = sin(2 * pi * Frequency(i) * [0:sampDur(i)]/Fs);
Sound = [Sound , Tone];
end
soundsc(Sound, Fs) % play audio