来自定义的频率过程的Matlab cos信号

时间:2018-01-16 23:34:07

标签: matlab signal-processing spectrogram

为什么这段代码的频谱图在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')

这是一张图片:

enter image description here

只要我使用啁啾而不是我自己构造的信号,它就能正常工作,但它不是一个选项,因为更具体的课程即将到来。

1 个答案:

答案 0 :(得分:2)

摘要

问题在于瞬时相位是瞬时频率相对于时间的积分瞬时频率乘以随时间变化

您应该将信号计算为

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

您的代码的作用

在您的示例中,您似乎想要生成初始频率为meshingOrder*startIAS且最终频率为meshingOrder*endIAS的线性啁啾声。但这不是代码所做的。

在您的计算信号中,瞬时阶段是cos函数的参数:

  

2*pi*meshingOrder*frequencyCourse.*t

由于变量frequencyCourse在结束时从开始时间meshingOrder*startIAS0}增加到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,这与您的观察值一致。

代码应该做什么

对于线性啁啾(或具有任何其他简单频率变化的啁啾,例如二次或指数),您可以计算出产生所需瞬时频率的正确瞬时相位。请参阅示例here。这也是chirp函数内部所做的事情。

但您似乎想要处理任意频率课程。要做到这一点,给定任意t,只需计算cos的参数作为frequencyCourse相对于t的累积积分。使用cumtrapz

可以轻松完成此操作
signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));

在示例中更改此行会给出下图,其中预期的频率变化范围为360 Hz至2400 Hz:

enter image description here