GNU Octave:增加 5 秒的频率音调,中间间隔 0.1 秒

GNU Octave: Increasing frequency tones of 5 sec with 0.1 sec in between

我可以产生具有选择频率和持续时间的单一音调。

    >> fs = 44100;
    >> freq = 100;
    >> nsec = 5;
    >> nsample = fs*nsec;
    >> time = linspace(0,nsec,nsample);
    >> wave = sin(2*pi*freq*time);
    >> audiowrite('test-tone.wav',wave,fs);

我想将 100 个从 100 Hz 增加到 10 kHz 的单频音调排列在一起。 每个音调将持续 5 秒,并间隔 0.1 秒。 Octave 中是否有用于此的软件包,或者这可能是一个 "for" 语句?

我按照一个回复使用了 "for" 循环。通过搜索并从搜索中找到一些代码 (Kyung Seo Li),"how can i generate a sine wave with different frequencies using matlab?" 我能够按照我的要求创建一个频率序列。但是,我仍然需要将每个频率与 0.1 秒的零幅度间隙分开。我应该将它添加到 "freqs" 行还是放在正弦生成行中?我目前正在处理的代码是:

    fs = 8000;
    freqs = [100:50:5000];
    T = 1/fs; % sampling period
    dur = 5;
    y = [];
    for k = 1:size(freqs,2)
    x = sin(2*pi*freqs(k)*[0:T:dur-T]);
    y = horzcat(y,x);
    end

最后,感谢任何有关 Whosebug 通信的提示(网站上已列出的提示除外)。

我增加了间隙时间并降低了样本,因此您可以在频谱图中清楚地看到它。顺便说一句,如果你想解决一个问题,你应该首先尝试让它尽可能小,这样更容易调试程序(例如将步数从 100 降低到 2,降低采样率等) .但这里是:

nsteps = 5;
fs = 44100;
f = linspace (100, 10e3, nsteps); # 100Hz to 10kHz
T = 5;  # length [s]
Tg = 0.5; # gap [s]

# preallocate memory with "0" for the gaps and because
# increasing a vector/matrix inside the loop is slow because
# of memory reallocation
y = zeros (1, numel(f) * (T + Tg) * fs);
for k=0:(numel(f) - 1)
  tstart_idx = round (k * (T + Tg) * fs);
  tend_idx = round ((k * (T + Tg) + T) * fs);
  r = (tstart_idx+1):(tend_idx+1);
  y(r) = sin (2 * pi * f(k+1) * (tstart_idx:tend_idx)/fs);
endfor

# only for visualization
pkg load signal
specgram (y, 512, fs)

# write wav
audiowrite('test-tone.wav', y, fs);

在这里您可以看到从 10Hz 到 10kHz 的生成信号,分 5 步,间隔为 0.5s。