Самый простой способ будет просто генерировать только целые периоды данной частоты.Сначала вам нужно будет создать массив частот для генерации, а затем рассчитать линейный период в выборках.С заданной длительностью вы можете рассчитать, сколько периодов волны может уместиться за заданную длительность.Для частот с частичными периодами просто округлите количество периодов.Это будет означать, что не все частоты действительно воспроизводятся в один и тот же период времени, но разницы не должно быть достаточно, чтобы заметить это, особенно для более высоких частот.
Используя соглашение о кодировании вашего вопроса, это поможет
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