如何绘制具有变化参数的 2d fft 变换的 3d 图

How to plot a 3d graph of 2d fft transformations with a changing parameter

我想绘制函数 y 的 2d 图的 3d 图 其中 y 是以轴 k(x) w0(y) 和振幅 (y)(z) 为轴的函数 z 的 dft,其中 k 是频域中的 dft 变量,w0 是 0 到 4 之间的变化参数*pi/45。

n=(0:255);
x1 = exp(n.*(w1*1j));
x2 = 0.8.*exp(n*((w2-w0)).*1j);
z =hamming(256)*(x1+x2);
y = fft(abs(z))

如果我正确地解释了你的问题,你希望有这样的东西:

x 轴是 DFT 数,y 轴是改变时域信号的参数,z 幅度 每个信号的 FFT。

你需要做的是定义一个 2D 点网格,其中 x 是你拥有的 FFT 点数......所以在你的情况下,将是 256 点,y 轴定义从 0 到 4*pi/45 的变化 w0 项。此网格的结构将使得每个 定义一个 DFT 结果。

为此,请使用 ndgrid,然后按以下方式进行操作:

max_dft_number = 256;
num_w = 10;
[w0,n] = ndgrid(linspace(0,4*pi/45,num_w), 0:max_dft_number-1);

max_dft_number 确定要计算多少个 DFT 数。所以在你的情况下,那将是 256。你可以根据你想要的 DFT 数来改变它。 num_w 给你多少 w0 点你想要在 0 到 4*pi/45 之间,然后 linspace 给你一组从 0 到 4*pi/45 的线性间隔点,我们有 num_w 这些点。我这里设置为10是为了很好的说明。

一旦你有了这个,只需使用 XY 并将其替换到上面的代码中。您没有定义 w1w2,所以我假设它是常量:

w1 = 0.1; w2 = 0.2;
x1 = exp(n.*(w1*1j)); %// Change - vectorized
x2 = 0.8.*exp(n.*((w2-w0)).*1j); %// Change - vectorized
z = bsxfun(@times,hamming(max_dft_number).', x1+x2); %// Change - make sure hamming window applies over each row
y = abs(fft(z, [], 2)); %// Change - FFT first, then magnitude after.  Apply to each row

我不得不使用 bsxfunx1 + x2 的每个 上应用汉明 window。请记住,每一行都是特定 w0 参数的 DFT 结果。我还必须转置 hamming(256),因为默认输出是一列。 bsxfun 在这种情况下使用 @times 将复制汉明 window 系数,以便每一行都乘以相同的 window。如果您向 fft 提供一个矩阵,默认情况下它会将 FFT 应用于矩阵的每一列。我们不希望这样,我们希望将其应用于每个 ,因此您需要 fft(z,[],2); 才能做到这一点。

现在,要最终实现你想要的情节,你所要做的就是使用waterfall函数,它接受一组二维网格坐标和z方向的相应输出。它假定每一行都是 3D 函数的单独轨迹....就像您想要的那样。

所以:

waterfall(n, w0, y);
xlabel('DFT number');
ylabel('w0');
zlabel('Magnitude');
colormap([0 0 0]); %// Make plot all black
view(-12,64); %// Adjust view for better look

我们得到: