为什么这段代码的频谱图在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')
这是一张图片:
只要我使用啁啾而不是我自己构造的信号,它就能正常工作,但它不是一个选项,因为更具体的课程即将到来。
答案 0 :(得分:2)
问题在于瞬时相位是瞬时频率相对于时间的积分,不瞬时频率乘以随时间变化
您应该将信号计算为
signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));
在您的示例中,您似乎想要生成初始频率为meshingOrder*startIAS
且最终频率为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,这与您的观察值一致。
对于线性啁啾(或具有任何其他简单频率变化的啁啾,例如二次或指数),您可以计算出产生所需瞬时频率的正确瞬时相位。请参阅示例here。这也是chirp
函数内部所做的事情。
但您似乎想要处理任意频率课程。要做到这一点,给定任意t
,只需计算cos
的参数作为frequencyCourse
相对于t
的累积积分。使用cumtrapz
:
signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));
在示例中更改此行会给出下图,其中预期的频率变化范围为360 Hz至2400 Hz: