Объединение частот - PullRequest
       26

Объединение частот

0 голосов
/ 08 июня 2018

Я проектирую звуковой сигнал в MATLAB, который состоит из определенных (10-12) частот.Каждый частотный тон длится 1 мс.Когда я переключаюсь между частотами, изменение происходит внезапно и создает нежелательные звуки щелчка.Оранжевый треугольник на изображении показывает изменение частот:

change of frequencies

Как мне перейти с одной частоты на другую?В настоящее время я просто добавляю тоны вместе.

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

1 Ответ

0 голосов
/ 11 июня 2018

Самый простой способ будет просто генерировать только целые периоды данной частоты.Сначала вам нужно будет создать массив частот для генерации, а затем рассчитать линейный период в выборках.С заданной длительностью вы можете рассчитать, сколько периодов волны может уместиться за заданную длительность.Для частот с частичными периодами просто округлите количество периодов.Это будет означать, что не все частоты действительно воспроизводятся в один и тот же период времени, но разницы не должно быть достаточно, чтобы заметить это, особенно для более высоких частот.

Используя соглашение о кодировании вашего вопроса, это поможет

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 
...