【问题标题】:Matlab cos signal from defined frequency course来自定义频率过程的 Matlab cos 信号
【发布时间】:2018-01-16 23:34:07
【问题描述】:

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

这是一张图片:

只要我使用啁啾代替我自己构建的信号,它就可以正常工作,但这不是一个选择,因为会有更多具体的课程。

【问题讨论】:

    标签: matlab signal-processing spectrogram


    【解决方案1】:

    总结

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

    您应该将信号计算为

    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*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:

    【讨论】:

    • 哇,希望得到更好的解释,非常感谢!
    • @hnes 很高兴您发现它很有用。这是一个有趣的问题!
    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多