簡體   English   中英

來自定義頻率過程的Matlab cos信號

[英]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*startIASB = 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自變量計算為相對於tfrequencyCourse的累積積分。 這可以通過cumtrapz輕松完成:

signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));

在示例中更改此行將得到下圖,該圖具有從360 Hz到2400 Hz的預期頻率變化:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM