如何绘制具有变化参数的 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是为了很好的说明。
一旦你有了这个,只需使用 X
和 Y
并将其替换到上面的代码中。您没有定义 w1
和 w2
,所以我假设它是常量:
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
我不得不使用 bsxfun
在 x1 + 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
我们得到:
我想绘制函数 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是为了很好的说明。
一旦你有了这个,只需使用 X
和 Y
并将其替换到上面的代码中。您没有定义 w1
和 w2
,所以我假设它是常量:
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
我不得不使用 bsxfun
在 x1 + 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
我们得到: