2014-02-20 27 views
0

當我在matlab/octave中做譜圖時,我可以創建一個掃描信號,看起來像下面的RED圖線。但是如何使用下面的公式創建掃描信號,如第一個圖中的藍線。調整掃描信號方程

感謝丹尼爾和大衛讓我這麼遠的代碼低於

startfreq=200; 
fs=44100; 
endfreq=20; 
dursec= 10;%duration of signal in seconds 
t=(0:dursec*fs)/fs; %Time vector 
alpha=log(startfreq/endfreq)/dursec; 
sig = exp(-j*2*pi*startfreq/alpha*exp(-alpha*t)); 
sig=(sig/max(abs(sig))*.8); %normalize signal 
wavwrite([sig'] ,fs,32,strcat('/tmp/del.wav')); %export file 
specgram(sig,150,400); 

1情節 Plot that I'm trying to reproduce


第二情節 Plot with 200hz-20hz works


如何修復變量sig中的公式,使其看起來像第一張圖中的BLUE行

3情節 Plot with 20hz-200hz which doesn't do what I want


回答

1

這個問題幾乎是滿月,所以你可能已經想通了這一點現在。如果您仍然對此感興趣,這裏有個答案。

看來,你的電流頻率模型是

freq(t) = b*exp(-alpha*t) 

freq(0) = b = startfreq 
freq(dursec) = b*exp(-alpha*dursec) = endfreq 

有兩個自由參數(balpha),和兩個方程。第一個等式,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=0t=dursec的要求

freq(0) = a + b = startfreq 
freq(dursec) = a + b*exp(-alpha*dursec) = endfreq 

這是雙方程,但我們現在有三個參數:abalpha。我將使用這兩個公式來確定ab,並將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); 
+0

非常感謝!我需要更改哪些調整以允許startfreq == endfreq? –

+1

我修改了腳本來處理'startfreq == endfreq'。 –