来自定义频率过程的 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')

这是一张照片:

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

总结

问题是瞬时相位是瞬时频率相对于时间的积分不是瞬时频率乘以 时间。

您应该将信号计算为

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

您的代码的作用

在您的示例中,您似乎想要生成初始频率 meshingOrder*startIAS 和最终频率 meshingOrder*endIAS 的线性线性调频信号。但这不是代码正在做的。

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

2*pi*meshingOrder*frequencyCourse.*t

由于变量frequencyCourse从开始时间(即0)的meshingOrder*startIAS增加到结束时间的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. This is also what the chirp 函数在内部执行。

但是你好像想要处理任意频率的课程。为此,给定任意 t,只需将 cos 的自变量计算为 frequencyCourse 相对于 t 的累积积分。使用 cumtrapz:

很容易做到这一点
signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));

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