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。
我可以产生具有选择频率和持续时间的单一音调。
>> 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。