我想制作功能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))
答案 0 :(得分:2)
如果我正确地解释你的问题,你希望得到类似的东西:
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以便给出一个很好的例证。
完成此操作后,只需使用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
的每个行上应用汉明窗口。请记住,每一行都是特定w0
参数的DFT结果。我还必须转置hamming(256)
,因为默认输出是一列。在这种情况下使用bsxfun
的{{1}}将复制汉明窗系数,以便每一行乘以相同的窗口。如果为@times
提供矩阵,默认情况下它会在矩阵的每列上应用FFT。我们不希望这样,我们希望将其应用于每个行,因此您需要fft
来执行此操作。
现在,为了最终实现您想要的绘图,您所要做的就是使用waterfall
函数,该函数接收设置的2D网格坐标和fft(z,[],2);
方向上的相应输出。它假设每一行都是3D函数的单独轨迹....就像你想要的那样。
所以:
z
我们得到: