我试图了解加窗傅里叶变换的工作原理,因此我使用 Matlab 创建了一个人工信号,并使用高斯窗绘制了加窗傅里叶变换。
和,即数据点每 1/500 秒采样一次。
这是我为我的情节获得的。
但是,对于最后 2 个间隔,, 和,我们可以看到某种形式的分叉现象(垂直)。为什么会这样?
我试图了解加窗傅里叶变换的工作原理,因此我使用 Matlab 创建了一个人工信号,并使用高斯窗绘制了加窗傅里叶变换。
和,即数据点每 1/500 秒采样一次。
这是我为我的情节获得的。
但是,对于最后 2 个间隔,, 和,我们可以看到某种形式的分叉现象(垂直)。为什么会这样?
在离散信号处理中,频域轴拓扑结构出人意料地不是一条直线,而是一个封闭的圆。因此,图像的上边缘和下边缘是真正“被识别”的,这意味着它们是相连的并且是直接的邻居。您看到的调制是两个干扰组件的跳动越来越近。
窗口大小对此有影响,因为它控制频率分辨率。如果您采用(有效)更长的窗口,则跳动将减少,因为以正弦分量频率为中心的窗口的傅立叶变换将重叠更少。
为了说明@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 的区域。
如果您增加窗口大小,您将能够在每个窗口内捕捉到慢速正弦曲线的几个周期,并且周期性将消失。权衡是您的窗口将捕获更长的时间,因此事件之间的界限将更加模糊。
如果这仍然没有意义,我稍后会尝试包含一些情节。