逆傅立叶变换

时间:2015-03-19 15:59:50

标签: matlab signals fft ifft

我正在尝试编写IFT算法。这是我的代码:

%% Fourier Analysis
N = 20;
T1 = 0.25*N;
T0 = N;
x = [zeros(T1,1); ones(T0/2,1); zeros(T1,1)]';

omega = 2*pi*1/T0;

ak = zeros(1,2*N+1);

for k = -N:N
    if k == 0
        ak(k+N+1) = 2*T1/T0;
    else
        ak(k+N+1) = sin(k*omega*T1)/(k*pi);
    end
end

%Approximate the periodic symmetric square wave
t=linspace(-0.5,0.5,N);

for n=1:length(t)
    xN(n)=0;
    for k = -N:N
        xN(n) = xN(n) + ak(k+N+1).*exp(1i*k*omega*t(n));
    end
end

它有什么问题(我知道Matlab有ifft()函数,但我想写自己的)?我用它来代码:

ift

结果看起来像(EN是错误的):

enter image description here

其中黑色图是xN而蓝色图是x。我的结果是直线。

1 个答案:

答案 0 :(得分:3)

我不知道你在图像中得到那个公式的位置,但是对于离散信号的N - 点傅立叶变换,你只需要从k加总{ {1}} {}为0进行精确重建。 N-1正交基函数可以重建任何N维信号。您可能会将DTFTDFT混淆(您希望其中的第二个)。

我也不了解您用于N系数的公式。你用ak计算它们,然后用复数指数而不是正弦波来计算它们。

如果要使用复数指数进行离散傅里叶变换(DFT),代码应该与下面的代码类似。您从时间信号sin的内积和复数基函数中得到ck系数。

x

enter image description here


如果你想使用真正的正弦曲线做一个普通的傅立叶级数,你的代码应该是这样的:

clear; clc;

N = 20;                                        %// number of points

x = [zeros(1,N/4),ones(1,N/2),zeros(1,N/4)];   %//time signal data
n = 0:N-1;

ck = zeros(1,N);
for k = 0:N-1                                  %//cacluate coefficients
    ck(k+1) = sum(x.*exp(-1i*2*pi*k*n/N));
end

xN = zeros(1,N);
for k = 0:N-1                                  %// add partial frequencies
    xN = xN + ck(k+1)*exp(1i*2*pi*k*n/N)/N;
end

plot(n,xN)