這個問題幾乎是滿月,所以你可能已經想通了這一點現在。如果您仍然對此感興趣,這裏有個答案。
看來,你的電流頻率模型是
freq(t) = b*exp(-alpha*t)
與
freq(0) = b = startfreq
freq(dursec) = b*exp(-alpha*dursec) = endfreq
有兩個自由參數(b
和alpha
),和兩個方程。第一個等式,b = startfreq
,給我們b
(平凡)。
求解alpha
最後一個方程給出
alpha = -log(endfreq/startfreq)/dursec
= log(startfreq/endfreq)/dursec
所以
freq(t) = startfreq * exp(-alpha*t)
以此爲掃頻信號的瞬時頻率, 我們所需要的積分,我將呼叫階段(t):
phase(t) = -(startfreq/alpha) * exp(-alpha*t)
(複合)fr然後
sig(t) = exp(2*pi*j * phase(t))
equency掠信號是這樣的信號的實部
sig(t) = cos(2*pi*phase(t))
那說明你當前的代碼。要生成頻率與藍色曲線類似的啁啾聲,您需要一個不同的頻率模型。比上面使用的一個更普遍的模式是
freq(t) = a + b*exp(-alpha*t)
在t=0
和t=dursec
的要求
freq(0) = a + b = startfreq
freq(dursec) = a + b*exp(-alpha*dursec) = endfreq
這是雙方程,但我們現在有三個參數:a
,b
和alpha
。我將使用這兩個公式來確定a
和b
,並將alpha
作爲一個自由參數。解決給
b = (startfreq - endfreq)/(1 - exp(-alpha*dursec))
a = startfreq - b
整合模型給出
phase(t) = a*t - (b/alpha)*exp(-alpha*t)
alpha
是任意參數。根據第一個模型的公式,我將使用:
alpha = abs(log(startfreq/endfreq))/dursec
以下是完整的腳本。請注意,我也將exp(-j*2*pi*...)
改爲cos(2*pi*...)
。 0.8
的因子可以與您的代碼匹配。
startfreq = 20;
endfreq = 200;
fs = 44100;
dursec = 10; % duration of signal in seconds
t = (0:dursec*fs)/fs; % Time vector
if (startfreq == endfreq)
phase = startfreq * t;
else
alpha = abs(log(endfreq/startfreq))/dursec;
b = (startfreq - endfreq)/(1 - exp(-alpha*dursec));
a = startfreq - b;
phase = a*t - (b/alpha)*exp(-alpha*t);
endif
sig = 0.8 * cos(2*pi*phase);
wavwrite([sig'] ,fs,32,strcat('del.wav')); % export file
specgram(sig,150,400);
非常感謝!我需要更改哪些調整以允許startfreq == endfreq? –
我修改了腳本來處理'startfreq == endfreq'。 –