加窗傅里叶变换谱图中的奇怪现象[编辑]

信息处理 fft 离散信号 信号分析 频谱图 加博
2022-02-08 18:43:20

我试图了解加窗傅里叶变换的工作原理,因此我使用 Matlab 创建了一个人工信号,并使用高斯窗绘制了加窗傅里叶变换。

x(t)={sin(2π100t)for 0t<14sin(2π50t)for 14t<12sin(2π25t)for 12t<34sin(2π10t)for 34t1

fs=500,即数据点每 1/500 秒采样一次。

这是我为我的情节获得的。

阴谋

但是,对于最后 2 个间隔,12t<34, 和34t1,我们可以看到某种形式的分叉现象(垂直)。为什么会这样?

3个回答

在离散信号处理中,频域轴拓扑结构出人意料地不是一条直线,而是一个封闭的圆。因此,图像的上边缘和下边缘是真正“被识别”的,这意味着它们是相连的并且是直接的邻居。您看到的调制是两个干扰组件的跳动越来越近。

窗口大小对此有影响,因为它控制频率分辨率。如果您采用(有效)更长的窗口,则跳动将减少,因为以正弦分量频率为中心的窗口的傅立叶变换将重叠更少。

为了说明@Jazzmaniac 和@Phonon 都在告诉你什么,让我们看一下相同的情节,但窗口长度不同。另一个变化是使用fftshift视图查看图表 --- 以便更清楚地看到低正频率峰值接近于低负频率峰值。

下图绘制了scilab窗口长度为 32、64、128 和 256 的数据的等高线图(参见下面的代码)。即使在 256 窗口长度下,“跳动”的影响仍然存在。

在此处输入图像描述


代码仅在下面。

fs = 500;
t1 = [0:1/fs:(0.25-1/fs)]
t2 = [0.25:1/fs:(0.5-1/fs)]
t3 = [0.5:1/fs:(0.75-1/fs)]
t4 = [0.75:1/fs:(1-1/fs)]
T = [t1 t2 t3 t4];

x = [sin(2*%pi*100*t1) sin(2*%pi*50*t2) sin(2*%pi*25*t3) sin(2*%pi*10*t4)];

N = length(x);
figNo = 1;

figure(1)
clf
subplot(221)
xset("fpf","   ")
for window_length = 2.^[5:8];

    Z = [];
    X = [];
    Y = (([1:window_length]-1)/window_length*fs - fs/2);
    for k=1:10:N
        last_index = min(N,k+window_length-1);
        disp(last_index)
        padding = window_length - length(k:last_index);
        disp(padding)
        X = [X; k];
        Z = [Z; fftshift(abs(fft([x(k:last_index) zeros(1,padding)])))];
    end

    subplot(2,2,figNo);
    figNo = figNo + 1;
    contour(T(X),Y,Z,4,flag=[2,0,4])
    title("Window Length = " + string(window_length) )
    xlabel('Time');
    ylabel("Frequency (Hz)")
    //plot3d(X,Y,Z/max(Z)*10,alpha=60,theta=50,flag=[2,3,0],ebox=[0 N -fs/2 fs/2 0 10])
end

发生这种情况是因为您的窗口太短。我现在无法使用绘图工具,但请想象一下,您将一个缓慢变化的正弦曲线切成碎片,这些碎片比正弦曲线的周期短。如果你对这些部分进行傅里叶变换,你的一些块将比其他块捕获更多的正弦波能量,因为它们将包含函数的波峰或通过,而其他块将包含接近 0 的区域。

如果您增加窗口大小,您将能够在每个窗口内捕捉到慢速正弦曲线的几个周期,并且周期性将消失。权衡是您的窗口将捕获更长的时间,因此事件之间的界限将更加模糊。

如果这仍然没有意义,我稍后会尝试包含一些情节。