[英]Matlab cos signal from defined frequency course
該代碼的頻譜圖為何在stft的最后一個時間步中達到最大值,約為4400Hz,而不是2400Hz? (frequencyCourse(end)= 100,meshingOrder = 24-> f = 2400)
startTime = 0; %s
endTime = 30; %s
startIAS = 15; %Hz
endIAS = 100; %Hz
meshingOrder = 24;
fs = 100000; %Hz
t = startTime:1/fs:endTime-1/fs;
frequencyCourse = linspace(startIAS, endIAS, length(t));
signal = cos(2*pi*meshingOrder*frequencyCourse.*t);
spectrogram(signal, hanning(2^13), 0, 2^14, fs, 'yaxis')
這是一張圖片:
只要我使用線性調頻信號而不是我自己構造的信號,它就可以正常工作,但是這不是一個選擇,因為將會有更具體的課程。
問題在於,瞬時相位是瞬時頻率相對於時間的積分 , 而不是瞬時頻率乘以時間。
您應該將信號計算為
signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));
在您的示例中,您似乎想使用初始頻率meshingOrder*startIAS
和最終頻率meshingOrder*endIAS
生成線性meshingOrder*endIAS
。 但這不是代碼在做。
在您計算出的信號中,瞬時相位是cos
函數的參數:
2*pi*meshingOrder*frequencyCourse.*t
由於變量frequencyCourse
從開始時的meshingOrder*startIAS
(為0
)增加到結束時的meshingOrder*endIAS
,因此可以表示為
2*pi*(A+B*t).*t
其中A = meshingOrder*startIAS
和B = meshingOrder*(endIAS-startIAS)/endTime
。 相對於t
的瞬時相位求微分給出瞬時頻率
A + 2*B*t
那是
meshingOrder*startIAS + 2*meshingOrder*(endIAS-startIAS)/endTime * t
如您所見,問題是這里的因子2
。 在結束時間,瞬時頻率為
meshingOrder*startIAS + 2*meshingOrder*(endIAS-startIAS)
那是
2*meshingOrder*endIAS - meshingOrder*startIAS
在您的示例中,這是4440 Hz,與您的觀測值一致。
對於線性chi(或具有任何其他簡單頻率變化的chi,例如二次或指數),您可以計算出正確的瞬時相位,以產生所需的瞬時頻率。 例如參見這里 。 這也是chirp
函數內部執行的操作。
但是您似乎想要處理任意頻率的課程 。 為此,在給定任意t
,只需將cos
自變量計算為相對於t
的frequencyCourse
的累積積分。 這可以通過cumtrapz
輕松完成:
signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));
在示例中更改此行將得到下圖,該圖具有從360 Hz到2400 Hz的預期頻率變化:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.