来自定义频率过程的 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*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. This is also what the chirp
函数在内部执行。
但是你好像想要处理任意频率的课程。为此,给定任意 t
,只需将 cos
的自变量计算为 frequencyCourse
相对于 t
的累积积分。使用 cumtrapz
:
很容易做到这一点
signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));
在您的示例中更改此行会产生下图,其预期频率变化范围为 360 Hz 至 2400 Hz:
为什么这段代码的频谱图在 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*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. This is also what the chirp
函数在内部执行。
但是你好像想要处理任意频率的课程。为此,给定任意 t
,只需将 cos
的自变量计算为 frequencyCourse
相对于 t
的累积积分。使用 cumtrapz
:
signal = cos(2*pi*meshingOrder*cumtrapz(t, frequencyCourse));
在您的示例中更改此行会产生下图,其预期频率变化范围为 360 Hz 至 2400 Hz: