如何使用变化的参数绘制2d fft变换的三维图形

时间:2015-03-28 21:05:25

标签: matlab fft dft

我想制作功能y的2d图的3d图 其中y是函数z的dft,其轴为k(x)w0(y)和幅度(y)(z),其中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))

1 个答案:

答案 0 :(得分:2)

如果我正确地解释你的问题,你希望得到类似的东西:

enter image description here

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

你需要做的是定义一个 2D 点网格,其中x是你拥有的FFT点的数量......所以在你的情况下,那就是' ll 256个点,y轴定义从0到w0的不同4*pi/45项。此网格的结构将使每个定义一个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为您提供0到w0之间的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的每个上应用汉明窗口。请记住,每一行都是特定w0参数的DFT结果。我还必须转置hamming(256),因为默认输出是一列。在这种情况下使用bsxfun的{​​{1}}将复制汉明窗系数,以便每一行乘以相同的窗口。如果为@times提供矩阵,默认情况下它会在矩阵的每列上应用FFT。我们不希望这样,我们希望将其应用于每个,因此您需要fft来执行此操作。

现在,为了最终实现您想要的绘图,您所要做的就是使用waterfall函数,该函数接收设置的2D网格坐标和fft(z,[],2);方向上的相应输出。它假设每一行都是3D函数的单独轨迹....就像你想要的那样。

所以:

z

我们得到:

enter image description here